100元实践k8s搭建过程
source link: http://tigerb.cn/2022/12/03/k8s/install/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
100元实践k8s搭建过程
工作中越来越重度使用k8s,想进一步了解k8s的工作原理。一方面学习业界优秀系统设计思路,另一方面多了解也可以提高日常工作效率,比如和k8s开发的沟通效率等。今天第一步:自己着手搭建一个k8s服务。
本文采用的版本
kubectl kubelet kubeadm版本: 1.23.1
操作系统版本: CentOS 8.2 64位
1.采购云主机
官方建议最低云主机配置2核4G,国内任意云厂商采购就行,作为K8S服务的宿主机。本教程操作系统为CentOS 8.2 64位。
备注:官方文档标记最低配置内存要求2G,但是安装完dashboard、ingress等服务之后比较卡顿,所以为了流畅这里推荐4G内存。
2.放开端口
外网放开30000
端口,后续浏览器登陆k8s dashboard看板使用。并检查ssh服务端口22是否正常开启。
使用ssh登陆云主机,开始配置。
3.安装工具
安装常用工具:
yum install -y yum-utils device-mapper-persistent-data lvm2 iproute-tc
4.添加阿里源
国内存在墙的问题,添加阿里源加速:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.安装社区版本docker
yum -y install docker-ce
enable:
systemctl enable docker
查看docker版本docker version
:
2.安装 kubectl kubelet kubeadm
2.1添加阿里源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
注意点:v1.24版本后kubernetes放弃docker,安装过程存在一些问题,这里我们指定1.23.1版本安装。
2.2安装 1.23.1版本 kubectl kubelet kubeadm:
yum install -y kubectl-1.23.1 kubelet-1.23.1 kubeadm-1.23.1
启动kubelet:
systemctl enable kubelet
查看kubectl版本:
2.3修改cgroupdriver
执行如下命令:
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
重启服务:
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
2.4替换镜像源
由于这里我们使用的是国内的云厂商,访问海外k8s.gcr.io
拉取镜像存在墙的问题,所以下面我们就替换成registry.cn-hangzhou.aliyuncs.com/google_containers
的地址,具体操作如下:
删除旧配置文件:
rm -f /etc/containerd/config.toml
生产默认配置文件:
containerd config default > /etc/containerd/config.toml
替换镜像地址:
sed -i 's/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/google_containers/' /etc/containerd/config.toml
重启containerd
:
systemctl restart containerd
2.4初始化k8s master节点
初始化命令:
kubeadm init --kubernetes-version=1.23.1 \
--apiserver-advertise-address=<你的云主机内网IP> \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
通常会卡在这一步,如果大家按照本文的版本,理论不会报错,如果报错需要逐个搜索解决了。
如果初始化失败,执行如下命令后再重新初始化:
kubeadm reset -f
初始化成功之后得到如下命令,加入新的node节点使用(本次不使用):
kubeadm join <你的云主机内网IP>:6443 --token 78376v.rznvls130w3sgwb7 \
--discovery-token-ca-cert-hash sha256:add03fb7de52ad73fd96626fa9d9f0d639186524ba34d24742c15fce8093b8c5
配置kubectl
:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
查看k8s服务启动状态:
kubectl get pod --all-namespaces
3.安装calico网络
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
安装完毕后,查看calico服务启动状态:
kubectl get pod --all-namespaces
4.安装kubernates-dashboard
4.1 下载配置文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml
4.2 添加nodeport
配置nodeport,外网访问dashboard:
4.3 创建dashboard服务
kubectl apply -f recommended.yaml
查看kubernetes-dashboard启动状态:
kubectl get pod -n kubernetes-dashboard
4.4 外网访问dashboard
浏览器打开dashboard,地址:<你的外网IP:30000>
如上图所示,因为https的问题,浏览器会提示「您的连接不是私密连接」。推荐使用chrome浏览器,并在当前页面上任意位置点击,然后键盘输入「thisisunsafe」再点击回车健即可。
4.5 获取token
创建用户。dashboard-adminuser.yaml
配置文件示例,执行如下命令直接创建,参考官方教程创建示例用户 https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
:
创建配置文件:
cat <<EOF > dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
创建用户:
kubectl apply -f dashboard-adminuser.yaml
创建成功之后提示:
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
执行如下命令获取token:
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
4.6 复制token登陆dashboard
到这里我们已经可以正常创建pod了,但是外网还不能直接访问到pod,虽然可以采用dashboard的nodeport
的方案,但是nodeport
只支持暴露30000-32767的端口,不适用于生产环境,接着我们就通过另一种方式ingress
来对外暴露pod。
5. 安装ingress
5.1 下载官方配置文件,这里使用的v1.3.1版本:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml
5.2 同样由于墙的问题,我们把配置文件中的镜像源换成阿里源:
替换nginx-ingress-controller
镜像源:
sed -i 's/registry.k8s.io\/ingress-nginx\/controller:v1.3.1@sha256:54f7fe2c6c5a9db9a0ebf1131797109bb7a4d91f56b9b362bde2abd237dd1974/registry.cn-hangzhou.aliyuncs.com\/google_containers\/nginx-ingress-controller:v1.3.1/g' ./deploy.yaml
替换kube-webhook-certgen
镜像源:
sed -i 's/registry.k8s.io\/ingress-nginx\/kube-webhook-certgen:v1.3.0@sha256:549e71a6ca248c5abd51cdb73dbc3083df62cf92ed5e6147c780e30f7e007a47/registry.cn-hangzhou.aliyuncs.com\/google_containers\/kube-webhook-certgen:v1.3.0/g' ./deploy.yaml
5.3 创建ingress服务
kubectl apply -f deploy.yaml
查看状态:
kubectl get pod --all-namespaces
创建完成之后,查看ingress状态,为pending
状态,原因是缺少LB,这里我们使用metallb
。
5.4 安装metallb
执行安装命令:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
创建secret:
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
查看安装状态:
kubectl get ns
kubectl get all -n metallb-system
5.4 绑定外网IP EXTERNAL-IP
kubectl get service ingress-nginx-controller --namespace=ingress-nginx
kubectl edit service ingress-nginx-controller --namespace=ingress-nginx
添加:
externalIPs:
- 118.195.228.232
kubectl get service ingress-nginx-controller --namespace=ingress-nginx
查看启动状态kubectl get pod --all-namespaces
:
metalab和ingress-nginx
的状态还是pending
,查看原因:
kubectl describe pod ingress-nginx-controller-6bfbdbdd64-jp7lw -n ingress-nginx
原因是现在只有master
节点,还没有node
节点,未了节省成本,这里我们允许master参与调度,把master节点也当node使用。
5.5 允许master节点可以被调度
kubectl taint nodes --all node-role.kubernetes.io/master-
查看pod状态:
kubectl get pod --all-namespaces
pod均正常运行。到这里,一个基础的k8s服务基本安装完成。
体验k8s
你的测试域名A解析到服务器的外网IP上,具体步骤略。
创建测试服务pod
kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
创建ingress映射
kubectl create ingress demo --class=nginx --rule="k8s.tigerb.cn/*=demo:80"
查看ingress服务service的外网端口
demo
pod启动成功后访问http://k8s.tigerb.cn:32374/
测试服务即可。
到此为止,我们就成功部署了一个k8s服务,使用dashborad就可以很轻松完成服务部署、扩容、缩容等。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK