Kubernetes—多主多节点集群(containerd)搭建

注:如果你的ETCD集群已经被其他集群使用过,请一定要清除原有的ETCD集群中的所有数据,否则会导致新的集群报各种莫名其妙的错误。

一、系统优化

1、转发ipv4,并让iptables看到桥接流量

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

sudo modprobe overlay && sudo modprobe br_netfilter

# 设置所需要的sysctl参数,并在重启后保持其参数生效
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 不重启使sysctl参数生效
sudo sysctl --system

#查看结果
lsmod | grep br_netfilter
lsmod | grep overlay
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

验证net.bridge.bridge-nf-call-iptables, net.bridge.bridge-nf-call-ip6tables, net.ipv4.ip_forward这三个系统变量是否已经在你的sysctl中。

2、关闭swap分区

swapoff -a && sed -i '/swap/d' /etc/fstab

3、设置主机名

编辑主机文件

# vim /etc/hosts

127.0.0.1 k8smaster1
127.0.1.1 k8smaster1

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

192.168.50.31   k8smaster1.cluster.local k8smaster1
192.168.50.32   k8smaster2.cluster.local k8smaster2
192.168.50.33   k8smaster3.cluster.local k8smaster3
192.168.50.34   k8snode1.cluster.local k8snode1
192.168.50.35   k8snode2.cluster.local k8snode2
192.168.50.36   k8snode3.cluster.local k8snode3

设置主机名

hostnamectl set-hostname k8smaster1.cluster.local
......

二、全部节点安装kubernetes

初始三个主节点,初始化的过程是一样的。注意根据自己的主机情况修改对应的ip地址等等。

1、安装kubernetes

curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

tee /etc/apt/sources.list.d/kubernetes.list <<EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

apt update -y && \
apt -y install vim git curl wget kubelet=1.24.14-00 kubeadm=1.24.14-00 kubectl=1.24.14-00 kubernetes-cni

2、安装containerd

见文档《Kubernetes—Containerd安装与配置》

配置containerd私服

vim /etc/containerd/config.toml
#更改containerd拉取镜像的私服地址
      [plugins."io.containerd.grpc.v1.cri".registry.auths]
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
      [plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.dokbok.com/k8s"]
        username = "admin"
        password = "你的密码"

      [plugins."io.containerd.grpc.v1.cri".registry.headers]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.dokbok.com/k8s"]
        endpoint = ["https://xxxxxx.com/k8s"]

#更改pause的配置,版本号按配置文件中的来,不要做更改
sandbox_image = "harbor.dokbok.com/k8s/pause:3.6"

重新启动containerd服务

systemctl restart containerd

三、初始化主节点

1、安装依赖到自己的镜像仓库

查看依赖哪些镜像

 kubeadm config images list

这些镜像需要通过科学上网上传到自己的镜像仓库中

docker pull docker.io/calico/kube-controllers:v3.25.0
docker tag docker.io/calico/kube-controllers:v3.25.0 harbor.dokbok.com/library/kube-controllers:v3.25.0
docker push harbor.dokbok.com/library/kube-controllers:v3.25.0

2、配置crictl

cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 0
debug: false
pull-image-on-create: false
EOF

测试命令

crictl images

3、创建或转换配置文件

创建默认的初始化配置文件

kubeadm config print init-defaults

如果你有原来的旧版本的配置文件可以使用下面命令进行转换

kubeadm config migrate --old-config old.yaml --new-config new.yaml

4、修改配置文件

示例内容如下:

# vim k8s.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: 2bdvub.91nskybmaojzfkod
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.50.31
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: k8smaster1.cluster.local
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
  - effect: NoSchedule
    key: node-role.kubernetes.io/control-plane
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.50.31:6443
controllerManager: {}
dns: {}
etcd:
  external:
    endpoints:
    - https://192.168.50.25:2379
    - https://192.168.50.26:2379
    - https://192.168.50.27:2379
    caFile: /etc/etcd/cert/ca.pem
    certFile: /etc/etcd/cert/kubernetes.pem
    keyFile: /etc/etcd/cert/kubernetes-key.pem
imageRepository: xxxxxx.com/k8s
kind: ClusterConfiguration
kubernetesVersion: v1.24.17
networking:
  dnsDomain: cluster.local
  podSubnet: 10.30.0.0/12
  serviceSubnet: 10.96.0.0/12
scheduler: {}

5、初始化第一个主节点

kubeadm init --config k8s.yaml

一定要初始化成功后系统输出的相关信息记录好,其中会包括添加主节点、工作节点的方式等,后续会用到。

6、编辑客户端

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

使用命令查看节点运行情况

kubectl get nodes
kubectl get pods -n kube-system

四、将其他主节点添加到集群中

1、拷贝ETCD的证书到其他主节点

以节点二为示例,其他节点参照即可。

#在节点一上执行
scp -r /etc/etcd/ k8smaster2:/etc/

2、拷贝kubernetes的pki证书到其他节点

#在节点一上执行
scp -r /etc/kubernetes/pki/ k8smaster2:~/

3、删除不需要的证书内容

#在节点二上执行
rm ~/pki/apiserver.*
mv ~/pki/ /etc/kubernetes/

4、执行加入节点操作

kubeadm join 192.168.50.31:6443 --token 2bdvub.91njzfkod 	--discovery-token-ca-cert-hash sha256:71ee10125aaa191132cd5070a4bcd709eb2fb51c7 	--control-plane 

注意:上面的命令会在初始第一个节点后系统输出的信息中找到。

五、添加工作节点

执行添加到集群的命令(该命令来自于创建第一个主节点时打印的信息)。

kubeadm join 192.168.50.31:6443 --token 2bdvunskybmaojzfkod \
	--discovery-token-ca-cert-hash sha256:71ee10125aaa191132cdef0ffd26b1d05070a4bcd709eb2fb51c7 



六、安装网络插件

见文档《kubernetes-安装calico插件》

七、查看集群运行状态

八、错误解决

1、no such file or directory\” runtime=io.containerd.runc.v2\n

find / -name containerd-shim-runc-v1
    usr/local/bin/containerd-shim-runc-v1

cp /usr/local/bin/containerd-shim-runc-v1 /usr/local/bin/containerd-shim-runc-v2

2、Warning FailedScheduling 34s (x13 over 12m) default-scheduler 0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn’t tolerate.

kubectl get node -o yaml |grep taint -A 5
kubectl describe node k8s1 | grep Taints


kubectl taint node k8s1 node.kubernetes.io/not-ready:NoSchedule --overwrite

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注