K8S Kubeadm 搭建流程

前言

将最近搭建的K8S流程,以及遇到的部分问题,作为笔记进行记录。

部署环境

搭建版本:kubernetes-1.24.4 (HA)

容器运行时:containerd-1.6.8

操作系统:CentOS7

前置条件

1、集群节点计算资源必须是2h-cpu 2g-ram以上的机器,节点内网或公网需要可达。

2、每个机器的hostname,mac地址不能相同,唯一性product_uuid,通过hostname可以访问对应节点,需要配置/etc/hosts文件。

3、kubernates 1.24版本后默认的容器运行时不再使用Docker,改为 Containerd 容器运行时,如果需要使用docker则需要安装cri-dockerd

4、 HA架构必须存在3个master控制平面节点,架构如下图:(高可用分为堆叠etcd,外部etcd)。

外部etcd

优点:其中失去控制平面实例或者 etcd 成员的影响较小,并且不会像堆叠的 HA 拓扑那样影响集群冗余。

缺点:机器节点需要更多,需要3台服务器部署etcd HA集群。

堆叠etcd

优点:这种拓扑将控制平面和 etcd 成员耦合在同一节点上。相对使用外部 etcd 集群, 设置起来更简单,而且更易于副本管理。

缺点:堆叠集群存在耦合失败的风险。如果一个节点发生故障,则 etcd 成员和控制平面实例都将丢失, 并且冗余会受到影响。你可以通过添加更多控制平面节点来降低此风险。

load balancer:内部负载均衡器。需要保证自身HA。对worker节点进行反向负载apiServer,同一访问apiServer的ip,并且可以感知mater的可用性。

5、禁用Linux交换分区。(交换分区:内存不足时使用硬盘存储,会降低系统性能,好处是可以存储更多内存数据,并且内存占满也不会导致服务器马上出现卡顿)

设置 CentOS 禁用交换分区分:

永久关闭:
1、vim /etc/fstab 进入配置文件注释掉下面这个配置
/dev/mapper/cl-swap     swap     swap    defaults    0 0
2、注释掉并保存

临时关闭 :
执行 swapoff -a 命令

6、关闭防火墙或者开启官网指定端口

查看防火墙状态
firewall-cmd --state

1、打开防火墙端口 master 节点需要 6443 2379-2380 10250 10251 10252
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp

打开防火墙端口 node-worker 节点需要 10250 30000-32767
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=30000-32767/tcp

防火墙重载配置
firewall-cmd --reload

检测端口是否已经配置成功
firewall-cmd --zone=public --list-ports

2、也可选择关闭防火墙 !不安全 但可以避免很多问题,比如后续的CNI网络组件所需端口
#停止firewall
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service

7、配置yum源信息 /etc/yum.repos.d/kubernetes.repo (官方源有可能无法使用,需要科学上网,所以此处使用国内阿里源)

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

8、开启内核转发与网桥过滤,并安装ipvsadm,ipset,并启用对应规则

官方文档:容器运行时 | Kubernetes

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

sudo sysctl --system

#安装 ipset ipvsadm
yum -y install ipset ipvsadm

mkdir -p /etc/sysconfig/modules/

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

# 授于执行权限并运行
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules

# 查看是否生效
lsmod | grep ip_vs

# 控制台输出
ip_vs_sh               16384  0
ip_vs_wrr              16384  0
ip_vs_rr               16384  0
ip_vs                 180224  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          176128  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              16384  2 nf_conntrack,ip_vs

9、将 SELinux 设置为 permissive 模式(相当于将其禁用)

sudo setenforce 0

安装容器运行时

Containerd

实战:centos7上containerd的安装-20211023_一念一生~one的博客-CSDN博客_centos安装containerd
目录文章目录目录实验环境实验软件1、安装libseccomp依赖包2、下载containerd软件包并解压3、生成containerd 的默认配置文件config.toml4、启动containerd服务5、验证6、配置镜像加速器地址需要注意的问题关于我总结实验环境实验环境:1、win10笔记本2、1台centos7.6虚机(vmwrokstation虚机) cri-containerd-cni-1.5.5-linux-amd64.tar.gz实验软件链接:https://pan.bai.

在Containerd -1.6后的版本中,需要升级 libseccomp 本地依赖版本至少到2.4以上 ,不然可能会出现无法启动容器的情况(本人亲自踩坑,非常不好找到错误信息,并且CentOS yum源中最高的版本只有 2.3.1,只能自己从官方下载并安装)

相关命令:

查看当前 libseccomp 版本
rpm -qa | grep libseccomp

卸载旧版本
rpm -e libseccomp-devel-2.3.1-4.el7.x86_64 --nodeps
rpm -e libseccomp-2.3.1-4.el7.x86_64 --nodeps

下载 新版本 libseccomp
wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm

安装 libseccomp
rpm -ivh libseccomp-2.5.1-1.el8.x86_64.rpm

集群初始化

1、安装kubeadm、kubectl、kubelet 3大组件

安装组件
sudo yum install -y kubelet-1.24.4 kubeadm-1.24.4 kubectl-1.24.4 --disableexcludes=kubernetes

设置kubelet开机自启
sudo systemctl enable --now kubelet

2、初始化平面控制节点

使用kubeadm初始化节点,命令 kubeadm init 【参数】

更多参数可以查看官网文档:Kubeadm | Kubernetes

此处我使用我本地环境的配置参数,生产环境只需要把对应ip地址改为线上内网ip即可。

# 可使用命令初始化控制平面
sudo kubeadm init \
--control-plane-endpoint "k8s-cluster:6443" \
--apiserver-advertise-address=192.168.5.27 \
--apiserver-bind-port=6443 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.24.4 \
--cert-dir=/etc/kubernetes/pki \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=172.24.0.0/16 \
--upload-certs

# 也可使用初始化文件 先生成初始化文件,再根据自身场景修改其参数
kubeadm config print init-defaults  > kubeadm-config.yaml

kubeadm init --config = kubeadm-config.yaml --upload-certs

--control-plane-endpoint:填写内部 load balancer的ip地址或者内网的DNS域名信息。worker节点通过此域名或ip访问集群内部的master节点,从而确保master高可用。

--apiserver-advertise-address:填写当前控制平面的内网ip地址。

--pod-network-cidr:pod内网网段ip。

--service-cidr:service内网网段ip。

--image-repository:镜像地址,设置为国内的,我这里使用的ali源,拉取速度提升。

初始化时,kubeadm需要拉取 k8s.gcr.io/pause 镜像,由于国内被墙,很有可能无法成功下载,导致初始化失败,如果你初始化失败了则查看容器运行时的日志信息,如果是发现无法拉取到对应镜像说明就是此问题。(被坑几天查找问题)解决办法:

# 查看容器运行时日志
journalctl -xeu containerd

由于k8s.gcr.io 需要连外网才可以拉取到,导致 k8s 的基础容器 pause 经常无法获取。k8s crictl 可使用代理服拉取,再利用 ctr tag 解决问题

# 拉取国内镜像
crictl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
# 进行tag打标
ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6

成功之后输出:

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/

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join k8s-cluster:6443 --token v6rrcg.vnl78b94fo740xv9 \
        --discovery-token-ca-cert-hash sha256:5dd2edf3d668bd0608897a0097455c6a514a91fd0b1ad4d1044789d9f56123ce \
        --control-plane --certificate-key 4c9b2b3a2d19db4b4f58681e6cf264a0b7bb1eacf443ae90a50bd0e8c11e0c31

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8s-cluster:6443 --token v6rrcg.vnl78b94fo740xv9 \
        --discovery-token-ca-cert-hash sha256:5dd2edf3d668bd0608897a0097455c6a514a91fd0b1ad4d1044789d9f56123ce 

通过以上输出信息,已经得知对应node节点加入集群的指令信息。

节点加入集群

kubeadm join 指令 附带上token 信息即可加入 其他的master节点与worker节点,token默认6小时生效,重新生成token是24小时生效。

如果token过期即可使用命令重新生成

master平面节点加入执行:(获取证书加密信息)平面节点加入需要 token + certs 信息
kubeadm init phase upload-certs --upload-certs

worker节点加入生成token信息
kubeadm token create --print-join-command

执行查看当前已有token列表
kubeadm token list

安装网络CNI组件

可根据自身企业业务场景与规模,安全与性能进行考虑选择自身适合的CNI组件。

注意:集群中只能有一种CNI组件。

更多细节也可查看官方文档:使用 kubeadm 创建集群 | Kubernetes

此处我选用常用的CNI组件:Calico

Calico官方网站:为本地部署安装 Calico 网络和网络策略 (tigera.io)

首先,在群集上安装运算符。
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.0/manifests/tigera-operator.yaml

下载配置 Calico 所需的自定义资源
curl https://raw.githubusercontent.com/projectcalico/calico/v3.24.0/manifests/custom-resources.yaml -O

自定义配置custom-resources.yaml文件
修改其中pod网络网段ip信息
  calicoNetwork:
    # Note: The ipPools section cannot be modified post-install.
    ipPools:
    - blockSize: 26
      cidr: 172.24.0.0/16 (修改此处与kubeadm时相同的pod网段)
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()


创建清单以安装 Calico。
kubectl create -f custom-resources.yaml

运行查看Calico相关pod运行状态,需要等待4分钟左右
kubectl get pod -all-namespace

部署控制平面

kuboard

官方文档:https://www.kuboard.cn/

通过docker镜像直接一键启动容器,然后进行集群导入引导操作。

成功监控集群信息:

此时集群已经基本完善,后续需要加入NAS文件服务。便于集群内部的文件存储。以及是否加入Istio,以及网络入口Ingress的设置。根据企业自身进行合理配置。

下篇:Kubernetes部署Istio (tanzhuo.xyz)

文章目录

随心笔记

技术无止境 创新不停驻