一 、介绍
使用kubeadm部署k8s集群的步骤:
第一步:是在机器上部署容器运行时(docker,containerd等);
第二步:然后部署kubeadm,kubelet,kubectl这三个服务;
第三步:使用kubeadm init 部署master节点;
第四步:使用kubeadm join 加入其他节点。
二 、节点准备工作:
1、安装前确认每个节点的MAC和uuid唯一,不冲突
# 查看MAC,确保每个节点的mac唯一ifconfig -a # 查看product_uuid,确保每个节点的uuid唯一cat /sys/class/dmi/id/product_uuid
2. 设置主机名
hostnamectl set-hostname master1
3、关闭防火墙
# 关闭防火墙systemctl stop firewalldsystemctl disable firewalld#禁用selinux,设置SELINUX=disabledvi /etc/selinux/configSELINUX=disabled
4、禁用swap分区,禁用交换区分区 注释掉swap那行。
通过free 命令查看是否有swap 那行显示为0则表示关闭成功。
Kubernetes 1.8 开始要求关闭系统的Swap,如果不关闭,默认配置下 kubelet 将无法启动。
vim /etc/fstab#/dev/mapper/cl-swap swap swap defaults #查看swap是否关闭free -m total used free shared buff/cache availableMem: 15884 1611 9734 242 4538 13610Swap: 0 0 0
5、重启机器
6、设置流量桥接
# 确保 br_netfilter 模块被加载lsmod | grep br_netfilter# 若要显式加载该模块,可执行 sudo modprobe br_netfilter#允许iptables检查桥接流量cat <
三、部署主节点 安装容器运行时docker
# 1、如果已经安装了docker,卸载旧版本yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine#2、安装docker# 提供yum-config-manager程序,device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、设置镜像仓库# yum-config-manager会自动生成/etc/yum.repos.d下面的yum源文件# 使用阿里云源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 4、查看可用版本yum list docker-ce --showduplicates | sort -r # 5、安装最新版本,或者也可以安装指定版本yum -y install docker-ce docker-ce-cli containerd.ioyum -y install docker-ce-
2. 安装kubeadm,kubelet,kubectl
kubeadm:用来初始化集群的指令。kubelet:在集群中的每个节点上用来启动 Pod 和容器等。kubectl:用来与集群通信的命令行工具。
# 由于官网中的地址不可访问,所以添加阿里源cat <
此时通过systemctl status 查看kubelet状态我failed,是正常现象。待kubeadm init完成后,生成了kubelet的配置文件后,kubelet服务即可正常运行。
3、初始化master
可以通过配置文件的方式来初始化master,我们需要手动修改一些文件中的配置项,来使集群被初始化成我们想要的样子。
# 生成初始化文件kubeadm config print init-defaults > kubeadm-init.yaml
修改kubeadm-init.yaml文件
将advertiseAddress: 1.2.3.4修改为本机IP地址 将imageRepository: k8s.gcr.io修改为imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers , 这里是修改成阿里云的仓库。修改节点名称,如果不修改就是默认的’node' 修改podSubnet,如果采用calico作为网络插件,需要改为192.168.0.0/16
修改后的文件如下:
apiVersion: kubeadm.k8s.io/v1beta3bootstrapTokens:- groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authenticationkind: InitConfigurationlocalAPIEndpoint: advertiseAddress: 10.6.178.50 bindPort: 6443nodeRegistration: criSocket: /var/run/dockershim.sock imagePullPolicy: IfNotPresent name: master01 taints: null---apiServer: timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta3certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns: {}etcd: local: dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerskind: ClusterConfigurationkubernetesVersion: 1.23.0networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 192.168.0.0/16scheduler: {}
执行init:
# 执行initkubeadm init --config kubeadm-init.yaml # 添加权限# 如果要使用root用户执行kubectlexport KUBEConFIG=/etc/kubernetes/admin.conf # 要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init 输出的一部分mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
此时查看节点的状态,为Not ready,因为还没有安装网络插件。
4、安装网络插件:
插件可以选择calico,flannel, cni等,参考kubeadm · Kubernetes指南
安装网络插件,安装过程中会因为网络问题出现下载镜像失败,多试几次可能就成功了,或者在下载好镜像后手动上传到节点上。
calico安装可查看官网 Quickstart for Calico on Kubernetes
注意:需要 kubeadm init 时设置 --pod-network-cidr=192.168.0.0/16 (calico的默认配置)
calico的部署可以参考Kubernetes安装与配置、初始化k8s集群、部署MySQL和本地应用到k8s集群 | Zlg's blog
在部署过程中会用到下面的几个镜像,可以先下载下来然后上传到master节点上面去,否则需要非常长的时间才能安装成功
calico/typha v3.22.0 35c2fa1ee0a1 9 days ago 127MBcalico/kube-controllers v3.22.0 df76d42861ee 9 days ago 132MBcalico/apiserver v3.22.0 d0dec2d2ca4c 9 days ago 129MBcalico/cni v3.22.0 f86797de8afd 9 days ago 236MBcalico/pod2daemon-flexvol v3.22.0 59daef946c8c 9 days ago 21.4MBcalico/node v3.22.0 f109b1742d34 9 days ago 213MB
准备好镜像后,就可以直接安装calico了。
#从官网拷贝的安装命令如下kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml kubectl create -f https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml #安装完成后可以查看节点的状态,发现状态正常kubectl get pod -ANAMESPACE NAME READY STATUS RESTARTS AGEcalico-apiserver calico-apiserver-64c4b4d48b-nqclj 1/1 Running 0 44mcalico-apiserver calico-apiserver-64c4b4d48b-rskvm 1/1 Running 0 44mcalico-system calico-kube-controllers-77c48f5f64-zj8sq 1/1 Running 0 3h45mcalico-system calico-node-f2lng 1/1 Running 0 3h45mcalico-system calico-typha-886c95dd9-s8l74 1/1 Running 3 (59m ago) 3h45mkube-system coredns-65c54cc984-4fxfw 1/1 Running 0 4h3mkube-system coredns-65c54cc984-74m99 1/1 Running 0 4h3mkube-system etcd-master01 1/1 Running 2 (60m ago) 4h4mkube-system kube-apiserver-master01 1/1 Running 2 (59m ago) 4h4mkube-system kube-controller-manager-master01 1/1 Running 2 (59m ago) 4h4mkube-system kube-proxy-nnq9h 1/1 Running 2 (60m ago) 4h3mkube-system kube-scheduler-master01 1/1 Running 2 (59m ago) 4h4mtigera-operator tigera-operator-59fc55759-bm75m 1/1 Running 1 (61m ago) 3h45m kubectl get nodeNAME STATUS ROLES AGE VERSIONmaster01 Ready control-plane,master 4h4m v1.23.3
四 、加入节点
目按照第一个节点的方式准备节点并安装容器运行时和kubeadm,kubectl,kubelet。然后执行kubeadm init 添加节点。
#master节点初始化24h内可以通过下面的命令获取tokenkubeadm token list #获取hash值openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' # 执行节点join,其中的token为第一步中获取的token,hash为第二步获取的hash值kubeadm join --token
附录 问题解决:
加入节点完成后,可以在master上查看节点状态。如果slave节点为Not ready,则可以查看该节点有哪些pod没有正确运行。在这里发现slave节点状态不对,是因为calico插件的镜像没有下载成功,手动执行docker load加载一下master节点导出来的镜像即可解决。
# 查看slave节点是否有异常pod[root@master01 ~]# kubectl get pod --all-namespaces -o wide|grep slave1calico-system calico-node-l7xgp 0/1 Running 0 126m 10.6.178.51 slave1
kubeadm 的init的工作过程说明:
在做出变更前运行一系列的预检项来验证系统状态。一些检查项目仅仅触发警告, 其它的则会被视为错误并且退出 kubeadm,除非问题得到解决或者用户指定了 --ignore-preflight-errors=<错误列表> 参数。 为 Kubernetes 项目生成对外提供服务时所需的证书文件,都放在 Master 节点的 /etc/kubernetes/pki 目录下。比如:用户使用 kubectl 获取容器日志等 streaming 操作时,需要通过 kube-apiserver 向 kubelet 发起请求,这个连接也必须是安全的。kubeadm 为这一步生成的是 apiserver-kubelet-client.crt 文件,对应的私钥是 apiserver-kubelet-client.key。
完整的证书文件如下,其中以.key结尾的都是私钥文件:
apiserver.crtapiserver-etcd-client.crtapiserver-etcd-client.key apiserver.keyapiserver-kubelet-client.crt # kube-apiserver 向kubelet发起请求使用(比如kubectl获取容器日志等操作)apiserver-kubelet-client.key # apiserver-kubelet-client.crt的私钥ca.crt #最主要的证书ca.key # ca.crt的私钥etcd # 这是一个目录front-proxy-ca.crtfront-proxy-ca.keyfront-proxy-client.crtfront-proxy-client.keysa.keysa.pub
在目录/etc/kubernetes/生成配置文件,配置文件中记录当前这个 Master 节点的服务器地址、监听端口、证书目录等信息, 以便 kubelet、kubectl和scheduler可以直接加载相应的conf文件使用里面的信息,来与 API 服务器建立安全的连接。同时生成一个名为 admin.conf 的独立的 kubeconfig 文件,用于管理操作。剩下的过程请参考官方文档。# 完整的配置文件列表[root@master01 kubernetes]# ll /etc/kubernetes/|grep conf|awk '{print $NF}'admin.confcontroller-manager.confkubelet.confscheduler.conf