该笔记将记录:在 CentOS 7.5 中,如何搭建 Kubernetes 集群(供测试使用),以及相关问题处理;
注意事项
该笔记记录的集群部署方法只能用于实验,不能用于生产环境;
# 02/16/2022 该笔记最早记录搭建 Kubernetes 1.14 集群的方法;
环境概述
Before you begin
1)A compatible Linux host. 操作系统:CentOS 7.x
2)2 GB or more of RAM per machine (any less will leave little room for your apps). 2 CPUs or more.
3)Full network connectivity between all machines in the cluster (public or private network is fine).
网络信息:k8s-master: 172.16.0.125;k8s-worker-01: 172.16.0.126;k8s-worker-02: 172.16.0.128
4)Unique hostname, MAC address, and product_uuid for every node. See here for more details.
5)Certain ports are open on your machines. See here for more details.
6)Swap disabled. You MUST disable swap in order for the kubelet to work properly.
从主节点开始,我们使用 kubeadm 和 kubectl 命令管理集群及其节点;
第一步、在所有节点上执行
环境初始化
# 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld # 设置 SELINUX 关闭 # setenforce 0 yes | cp /etc/selinux/config /etc/selinux/config.backup sed -i 's%SELINUX=enforcing%SELINUX=disabled%g' /etc/selinux/config # 关闭 Swap 分区 # swapoff -a && sysctl -w vm.swappiness=0 yes | cp /etc/fstab /etc/fstab.backup sed -i -E 's/(.+\s+swap\s+.+)/# \1/g' /etc/fstab swapoff -a # 加载内核模块 cat > /etc/modules-load.d/kubernetes.conf <<EOF br_netfilter EOF cat > /etc/sysctl.d/kubernets.conf <<EOF net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-arptables = 1 net.ipv4.ip_forward = 1 EOF sysctl --system
安装 containerd 服务
服务安装:containerd/Installing
安装 kubeadm 命令
配置源仓库,以安装必要的包:
# 针对官方源,网络通常不通(除非使用网络加速,YUM 支持) # https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 # 使用阿里镜像站 cat > /etc/yum.repos.d/kubernetes-ali.repo <<EOF [kubernetes-ali] name=Kubernetes ALi # for x86 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ # fro aarch64 # baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/ enabled=1 gpgcheck=0 EOF # 最后,更新 YUM 缓存 yum makecache
安装 kubadm 工具(但是不需要启动服务):
yum install -y kubeadm-1.25.14 kubelet-1.25.14 kubectl-1.25.14 kubernetes-cni # 如果没有 enable 服务,则在 kubeadm init 时会有警告; # 但是不要 start 服务,这时候还没有初始化完成,缺少启动服务的某些配置文件(比如 /var/lib/kubelet/config.yaml 文件); # 这得感谢群里朋友的反馈 :-) systemctl enable kubelet
第二步、在 Master 上执行
节点初始化
执行如下命令进行节点初始化:
# 在初始化之间 # 如果必要,则执行 kubeadm config images list 命令,并将相关镜像保存到私有仓库中; kubeadm config images list # 开始初始化(依旧使用阿里云的镜像,没有私用私有镜像仓库) # 如果直接使用官方镜像,则初始化可能失败。因为它会去 k8s.gcr.io 拉取镜像,而国内网络无法访问; # 所以,我们使用 kubeadm init --image-repository 选项指定阿里云的镜像来初始化 kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers # 等待初始化结束 # 在执行 kubeadm init 结束后,留意下面的输出: ... Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 172.19.100.12:6443 --token gfryox.ytmse7e3r0scurcy \ --discovery-token-ca-cert-hash sha256:d2fcd2bc71c258f5af9cc444094c4add43705e52adad17c78b6f35bf54689ea3 # 上述内容: # 1. 提示你初始化成功 # 2. 然后,执行下面的三条命令 # 3. 告诉你应该向集群中部署一个 Pod 网络,这一点参考官方中列出的网络选择 # 4. 在工作节点上执行命令可以加入集群中;
补充说明:
1)旧版 kubeadm init 并没有 –image-repository 选项,但是可以通过指定 –config 选项 kubeadm-config.yaml 配置文件,该配置文件可以指定镜像仓库地址。(本文过于冗长,所以这里不再赘述,可以参考 Container Image:3.2 Scenarios and Applications:Replicate Images 来处理镜像无法拉取问题)
部署网络插件
正如在kubeadm init输出中所提示的,我们需要在集群中部署 Pod 网络。在部署的 Pod 网络中,不同主机的 Pod 就可以互相访问。Pod 网络是工作节点之间的覆盖网络。参考 Networking and Network Policy 文档,以获取更多的网络策略相关内容;
这里只是为了快速开始,所以部署 Flannel 网络(后面可以更换为其他网络):
# 创建网络 kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml # 然后,执行如下命令查看状态 kubectl get nodes kubectl get pods --all-namespaces # nodes 要处于 Ready 状态,pod 要处于 running 状态 # 当显示 ContainerCreating 时,表示正在创建,稍等即可
第三步、在 Worker 上执行
添加节点
kubeadm join 172.19.100.12:6443 --token gfryox.ytmse7e3r0scurcy \ --discovery-token-ca-cert-hash sha256:d2fcd2bc71c258f5af9cc444094c4add43705e52adad17c78b6f35bf54689ea3 # !!! error execution phase preflight: unable to fetch the kubeadm-config ConfigMap: failed to get config map: Unauthorized # !!! 遇到这错误是因为--token 选项的 TOKEN 时效了(部署 MASTER 和 NODE 我间隔了很久),口令是有生存时间(TTL)的; # !!! 使用 kubeadm token create 命令重新创建 token 口令(在 Master 上执行); # !!! https://github.com/kubernetes/kubeadm/issues/1310 # !!! 或者执行 kubeadm token create --print-join-command 命令,重新生成 JOIN 命令 # 重新生成 token 值 kubeadm token create # 如果 token 过期,创建永不过期的 token 值(不建议) kubeadm token create --ttl 0
移除节点
kubectl get nodes kubectl drain "<node-name>" --ignore-daemonsets --delete-local-data kubectl delete node "<node-name>"
第四步、验证集群状态
在 Master 上执行命令检查 Node 是否成功加入:
# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 25h v1.14.0 k8s-node01 Ready <none> 7m19s v1.14.0
参考文献
阿里云 kubernetes yum 仓库镜像
使用 kubeadm 初始化 k8s 环境使用非官方的 k8s.gro.io 镜像仓库就无法正常初始化 #67865
使用 –image-repository 解决 kubeadm 安装 k8s 集群谷歌镜像墙的问题
一、k8s 主机系统环境配置
Upgrading kubeadm clusters from v1.14 to v1.15
kubelet 1.11 won’t start because /var/lib/kubelet/config.yaml is missing/empty on brand new install #66108
kubeadm 安装 kubernetes v1.11.3 HA 多主高可用并启用 ipvs
kubeadm init
How to install Kubernetes with Kubeadm: A quick and dirty guide
How to Install Kubernetes (k8s) 1.7 on CentOS 7 / RHEL 7
How to gracefully remove a node from Kubernetes?
GitHub – flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetes
Creating a single control-plane cluster with kubeadm
centos7 添加 bridge-nf-call-ip6tables 出现 No such file or directory