问题描述
该笔记将记录:在 CentOS 7.5 中,如何搭建 Kubernetes 集群(供测试使用),以及相关问题处理。
注意事项
该笔记记录的集群部署方法只能用于实验,不能用于生产环境。
# 02/16/2022 该笔记最早记录搭建 Kubernetes 1.14 集群的方法。
环境概述
操作系统:CentOS 7.x
网络信息:k8s-master: 172.16.0.125;k8s-worker-01: 172.16.0.126;k8s-worker-02: 172.16.0.128
软件版本:Kubernetes v1.22
从主节点开始,我们使用’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/(.+swap\s+swap.+)/# \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 EOF sysctl --system
安装 docker 服务
服务安装:Docker/Installing
服务配置:
mkdir /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF systemctl enable docker systemctl daemon-reload systemctl restart docker
安装 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 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF # 最后,更新YUM缓存 yum makecache
安装 kubadm 工具(但是不需要启动服务):
yum install -y kubeadm-1.22.6 kubelet-1.22.6 kubectl-1.22.6 # 如果没有 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 配置文件,该配置文件可以指定镜像仓库地址。(本文过于冗长,所以这里不再赘述,可以参考 Failling to pull 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 时,表示正在创建,稍等即可
在 Node 上执行
添加节点
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