使用 kubeadm 部署一个 k8s 集群
源起
从早期的时候,k8s的部署是比较繁琐,到kubeadm等工具的完善,集群部署变成更加容易,同时也隐藏了很多细节,适当的了解如何使用kubeadm 工具一步步完成完成集群的部署,了解其中的细节,对于容器平台的维护者意义更大。
准备工作
- 准备一个负载均衡,云厂商提供的LB/或者企业私有环境的F5/haproxy均可
- 准备三台配置不低于机器2C4G的主机,用于运行k8s master
- 准备N台配置不低于4C8G的主机,用于运行k8s node
配置LB 和启动一个私有docker仓库
配置 vip 转发到 Master1_IP:6443 ,Master2_IP:6443,Master3_IP:6443, 本文以haproxy为例创建一个简单的负载均衡
初始化配置可以只添加一个master1_ip,等全部集群部署完毕,再去掉注释部分,重启haproxy服务即可。
初始化所有节点
设置主机名,更新/etc/hosts,具体操作略,初始化所有节点包含如下步骤:
- 配置docker kubernetes 仓库
- 安装docker,kubelet,kubeadm等软件包
- 禁用交换分区
- 加载ip_vs模块
- 关闭防火墙
- 开启端口转发
- 关闭selinux
可以通过yum list kubeadm --showduplicates 这种方式来列出仓库中相关的软件版本,根据需要选择你要安装的版本
更多细节参考:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#check-required-ports
初始化master1
初始化k8s集群第一个master节点需要完成如下步骤:
1.生成kubeadm-init.yaml 这里是一个关键步骤,我会对配置中的关键配置做简要说明:
- kubernetesVersion 此处定义的版本和上一步安装的kubeadm,kubelet版本一致
- imageRepository 此处定义了k8s组件的镜像仓库,私有环境部署可以指定自己的镜像仓库
- controlPlaneEndpoint 此处定义了k8s_apiserver_vip, 部署一个高可用集群依赖这个配置
- networking 此处定义了集群内部的dns域名,service子网,pod子网,注意合理划分,互相不要冲突也不要和主机网络冲突
- apiServer.certSANs 此处是master和apiserver交互认证的配置,一定要和master主机名,master_ip一致
2.执行 kubeadm init 初始化第一个master节点,–upload-certs 不能遗漏,不然后续添加master只能手动拷贝master1的证书文件了
3.配置本机的默认kubeconfig,确保kubectl命令能够和apisever认证交互
4.部署cni网络插件,这里以flannel为例,注意kube-flannel.yml内的子网定义要和kubeadm-init.yaml里定义的一致
更多参考 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/ ,下面是一键部署脚本:
修改文件中Network配置后,执行 kubectl apply -f kube-flannel.yml
执行完毕后记录下 kubeadm 返回的信息,后续添加节点需要使用
添加其他master节点
对master节点进行扩需要完成如下操作:
- 初始化系统配置,禁用交换分区,重复执行 初始化所有节点一节 的步骤
- 执行初始化master1一节最后记录的kubeadm join … –control-plane 一行,如果遗忘,可以回到master1节点执行 kubeadm token create --print-join-command 返回的结果,加上 --control-plane 即可
- 配置本机的默认kubeconfig,确保kubectl命令能够和apisever认证交互
最后实际执行的结果类同如下(请根据实际结果)
kubeadm join 172.16.0.2:6443 --token nlaa8f.6oryd1alvspf6r7i --discovery-token-ca-cert-hash sha256:40bdab940b643a1e6958c39d44949dfb9cc6e610d26ea5172307112ecb64afdc --control-plane
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
添加 其他node节点
对master节点进行扩需要完成如下操作:
- 初始化系统配置,禁用交换分区,重复执行 初始化所有节点一节 的步骤
- 执行初始化master1一节最后记录的kubeadm join … a5172307112ecb64afdc 一行,如果遗忘,可以回到master1节点执行kubeadm token create --print-join-command返回的结果
最后实际执行的结果类同如下(请根据实际结果)
kubeadm join 172.16.0.2:6443 --token nlaa8f.6oryd1alvspf6r7i --discovery-token-ca-cert-hash sha256:40bdab940b643a1e6958c39d44949dfb9cc6e610d26ea5172307112ecb64afdc --control-plane
回到master节点为node节点打标签
-
替换实际的node_name
kubectl label node --overwrite node-role.kubernetes.io/node=
检查集群运行状态
kubectl get cs
kubectl get nodes
kubectl get pods --all-namespaces
排除故障操作和其他操作参考
- 清除iptables规则: iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
- 清除ipvs规则: ipvsadm –clear
- 查看docker运行日志: journalctl -fu docker
- 查看kubelet运行日志: journalctl -fu kubelet
- 重置集群:kubeadm reset, 清空目录 /var/lib/etcd/ /var/lib/kubelet/ /etc/kubernetes/
- master去掉污点,允许调度其他pod: kubectl taint nodes node-role.kubernetes.io/master-
- master加污点,禁止调度pod:kubectl taint nodes node-role.kubernetes.io/master=true:NoSchedule
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论