「Kubernetes」- 部署测试集群(kubeadm、单节点、集群、1.22、测试)

  CREATED BY JENKINSBOT

问题描述

该笔记将记录:在 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