Bootstrap

部署多控制节点k8s集群

1、概述

1.1、编写目的

        此文档编写的目的是在记录使用9个虚拟机节点搭建一个k8s集群的过程。本文首先介绍不使用代理来搭建k8s集群;在文件末尾介绍了如何使用代理搭建k8s集群。

2、集群部署

2.1、环境概览

        本次使用9台数据搭建k8s集群。k8s集群版本如下:

k8s集群版本

 IP以及节点规划如下:

序号

虚拟机镜像

内核版本

虚拟机配置

名称

IP

1

ubuntu-22.04-desktop-amd64.iso

6.8.0-50-generic

8g/2核/50GB

Master01

192.168.1.155

2

ubuntu-22.04-desktop-amd64.iso

6.8.0-50-generic

8g/2核/50GB

Master02

192.168.1.156

3

ubuntu-22.04-desktop-amd64.iso

6.8.0-50-generic

8g/2核/50GB

Master03

192.168.1.157

4

ubuntu-22.04-desktop-amd64.iso

6.8.0-50-generic

8g/2核/200GB

Worker01

192.168.1.158

5

ubuntu-22.04-desktop-amd64.iso

6.8.0-50-generic

8g/2核/50GB

Worker02

192.168.1.159

6

ubuntu-22.04-desktop-amd64.iso

6.8.0-50-generic

8g/2核/50GB

Worker03

192.168.1.160

7

ubuntu-22.04-desktop-amd64.iso

6.8.0-50-generic

8g/2核/50GB

Worker04

192.168.1.161

8

ubuntu-22.04-desktop-amd64.iso

6.8.0-50-generic

8g/2核/50GB

Worker05

192.168.1.162

9

ubuntu-22.04-desktop-amd64.iso

6.8.0-50-generic

8g/2核/50GB

Worker06

192.168.1.163

2.1、不使用代理搭建k8s集群

2.1.1、虚拟机基本配置

在所有虚拟机中执行(可以先在一个虚拟机中执行,然后复制虚拟机,也可以使用终端给多个节点发送命令同时执行):

1、修改虚拟机的网络链接为桥接模式

2、为虚拟机配置静态IP

# 查看网络接口名称,一般为ens33

$ ip addr

# 编辑网络配置文件,文件名一般为:01-network-manager-all.yaml

$ sudo gedit /etc/netplan/01-network-manager-all.yaml

# 文件内容

network:

  version: 2

  renderer: NetworkManager

  ethernets:

    ens33:  #网络接口名称

      dhcp4: no

      addresses:

        - 192.168.1.155/24  # 静态IP

      routes:

        - to: default

          via: 192.168.1.1  # 网关

      nameservers:

        addresses:

          - 8.8.8.8

          - 8.8.4.4

3、设置主机名

$ sudo hostnamectl set-hostname <主机名>

4、配置/etc/hosts文件

127.0.0.1 localhost

127.0.1.1 

# 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.1.155 master01

192.168.1.156 master02

192.168.1.157 master03

192.168.1.158 worker01

192.168.1.159 worker02

192.168.1.160 worker03

192.168.1.161 worker04

192.168.1.162 worker05

192.168.1.163 worker06

5、禁用swap

$ sudo swapoff -a

$ sudo sed -i '/ swap / s/^(.*)$/#1/g' /etc/fstab

6、修改内核参数

$ sudo tee /etc/modules-load.d/containerd.conf <<EOF

overlay

br_netfilter

EOF

$ sudo modprobe overlay

$ sudo modprobe br_netfilter

7、配置网络参数

$ sudo tee /etc/sysctl.d/kubernetes.conf <<EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

EOF

$ sudo sysctl --system

2.1.2、安装containerd、docker

1、配置apt的代理

$ sudo gedit /etc/apt/apt.conf.d/proxy.conf

//文件内容

Acquire::https::Proxy "http://127.0.0.1:7890/";

Acquire::http::Proxy "http://127.0.0.1:7890/";

$ sudo apt update

2、安装dependencies:

$ sudo apt install -u curl gnupg2 software-properties-common apt-transport-https ca-certificates

3、添加docker的源

$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg

$ sudo add-apt-repository “deb [arch=amd64] https://download.com/linux/ubuntu $(lsb_release -cs) stable”

4、安装containerd

$ sudo apt update

$ sudo apt install -y containerd.io

5、安装docker

$ sudo apt update

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

6、配置containerd使用systemd作为cgroup

$ containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1

$ sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

7、重启containerd并将其设置为开机自启

$ sudo systemctl restart containerd

$ sudo systemctl enable containerd

2.1.3、安装Kubernetes组件

1、更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包

$ sudo apt-get update

# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包

$ sudo apt-get install -y apt-transport-https ca-certificates curl gpg

2、下载用于 Kubernetes 软件包仓库的公共签名密钥

# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它

# sudo mkdir -p -m 755 /etc/apt/keyrings

$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

3、添加 Kubernetes apt 仓库

$ echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

4、更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本

$ sudo apt-get update

$ sudo apt-get install -y kubelet kubeadm kubectl

$ sudo apt-mark hold kubelet kubeadm kubectl

2.1.4、初始化集群

在master01节点上执行:

1、初始化集群

$ sudo kubeadm init --control-plane-endpoint=192.168.1.155 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

看到如下的输出时,代表初始化完成

2、按照提示信息,配置集群(每个节点都需要执行)

$ mkdir -p $HOME/.kube

$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

3、使用命令查看集群状态

$ kubectl cluster-info

# 节点状态为NotReady,安装节点网络通信后状态为Ready

$ kubectl get nodes

2.1.5、将其他节点加入集群

在master02、master03节点上执行:

1、修改containerd的配置文件

# 修改/etc/containerd/config.toml文件,将sandbox-image的内容替换为国内的镜像

$ sudo gedit /etc/containerd/config.toml

# 文件修改内容如下:

sandbox_image=”registry.aliyuncs.com/google_containers/pause:3.9”

2、重新加载并重启 containerd 服务

$ sudo systemctl daemon-reload

$ sudo systemctl restart containerd

3、将master01节点上的集群凭证传到master02、master03节点上

$ sudo scp /etc/kubernetes/pki/ca.crt iie-iisd@$host:/etc/kubernetes/pki/

$ sudo scp /etc/kubernetes/pki/ca.key  iie-iisd@$host:/etc/kubernetes/pki/

$ sudo scp /etc/kubernetes/pki/sa.key iie-iisd@$host:/etc/kubernetes/pki/

$ sudo scp /etc/kubernetes/pki/sa.pub  iie-iisd@$host:/etc/kubernetes/pki/

$ sudo scp /etc/kubernetes/pki/front-proxy-ca.crt  iie-iisd@$host:/etc/kubernetes/pki/

$ sudo scp /etc/kubernetes/pki/front-proxy-ca.key  iie-iisd@$host:/etc/kubernetes/pki/

$ sudo scp /etc/kubernetes/pki/etcd/ca.crt iie-iisd@$host:/etc/kubernetes/pki/etcd/

$ sudo scp /etc/kubernetes/pki/etcd/ca.key  iie-iisd@$host:/etc/kubernetes/pki/etcd/

$ sudo scp /etc/kubernetes/admin.conf iie-iisd@$host:/etc/kubernetes/

4、将控制节点加入集群

$ kubeadm join 192.168.1.155:6443 --token qmr39h.2gtbedegs4jtbs03 \

--discovery-token-ca-cert-hash sha256:1f897ecf6d7e433356b7c330b0a4d447885a779e3d1a70765c6f36105b6ab4ee \

--control-plane

5、并执行如下命令

$ mkdir -p $HOME/.kube

$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

在worker01-worker06上执行:

1、修改containerd的配置文件

# 修改/etc/containerd/config.toml文件,将sandbox-image的内容替换为国内的镜像

$ sudo gedit /etc/containerd/config.toml

# 文件修改内容如下:

sandbox_image=”registry.aliyuncs.com/google_containers/pause:3.9”

2、重新加载并重启 containerd 服务

$ sudo systemctl daemon-reload

$ sudo systemctl restart containerd

3、拷贝master文件给工作节点

$ sudo scp /etc/kubernetes/admin.conf iie-iisd@host:/etc/kubernetes/

4、将工作节点加入集群

$ kubeadm join 192.168.1.155:6443 --token qmr39h.2gtbedegs4jtbs03 \

--discovery-token-ca-cert-hash sha256:1f897ecf6d7e433356b7c330b0a4d447885a779e3d1a70765c6f36105b6ab4ee

5、并执行如下命令

$ mkdir -p $HOME/.kube

$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

注:密钥24小时之内有效,密钥失效可以通过如下命令重新生成加入集群命令:

$ kubeadm token create --print-join-command --ttl 0

2.1.6、配置集群网络(需要代理拉取镜像)

一般可以安装Calico、Flannel和Weave-net等插件,下面以Calico为例进行操作。

我将我下载的calico-v3.25.0版本的镜像分享出来:

通过网盘分享的文件:k8s集群网络通信calico
链接: https://pan.baidu.com/s/1Kj4p8tigzWTn7eGH49LrDg?pwd=twes 提取码: twes

在master01节点上执行:

1、配置containerd代理

$ sudo mkdir -p /etc/systemd/system/containerd.service.d

$ sudo gedit /etc/systemd/system/containerd.service.d/http-proxy.conf

# 文件内容如下

[Service]

Environment="HTTP_PROXY=http://127.0.0.1:7890"

Environment="HTTPS_PROXY=http://127.0.0.1:7890"

Environment="NO_PROXY=localhost, 127.0.0.1"

2、重新加载并重启 containerd 服务

$ sudo systemctl daemon-reload

$ sudo systemctl restart containerd.service

3、下载calico

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

注:其他节点也会同步拉取calico的镜像,由于其他节点未配置代理,镜像会拉取失败,提供两种办法来解决此问题

方法一:

为其他节点同样配置containerd的代理

方法二:

1、在已经拉取好镜像的节点上,使用命令“$ sudo crictl images”查看拉取的calico镜像

2、使用docker拉取这三个镜像

3、将镜像导出然后传到其他节点

# 导出镜像

$ sudo docker save -o /tmp/calico-v3.25.0-cni.tar calico/cni:v3.25.0

$ sudo docker save -o /tmp/calico-v3.25.0-kube-controllers.tar calico/kube-controllers:v3.25.0

$ sudo docker save -o /tmp/calico-v3.25.0-node.tar calico/node:v3.25.0

# 使用如下脚本传输镜像

for node in master02 master03 worker01 worker02 worker03 worker04 worker05 worker06; do

  scp /tmp/calico-v3.25.0-cni.tar root@$node:/home/iie-iisd/

  scp /tmp/calico-v3.25.0-kube-controllers.tar root@$node:/home/iie-iisd/

  scp /tmp/calico-v3.25.0-node.tar root@$node:/home/iie-iisd/

Done

# 导入镜像到crictl

$ sudo ctr -n=k8s.io images import /home/iie-iisd/calico-v3.25.0-cni.tar

$ sudo ctr -n=k8s.io images import /home/iie-iisd/calico-v3.25.0-kube-controllers.tar

$ sudo ctr -n=k8s.io images import /home/iie-iisd/calico-v3.25.0-node.tar

4、在其他节点使用命令“$ sudo crictl images”即可看到导入的镜像 

5、使用命令“$ kubectl get nodes”查看节点状态,集群搭建完成。

2.2、使用代理搭建k8s集群

1、完成2.1.4章节

2、安装好containerd,配置containerd代理

$ sudo mkdir -p /etc/systemd/system/containerd.service.d

$ sudo gedit /etc/systemd/system/containerd.service.d/http-proxy.conf

# 文件内容如下

[Service]

Environment="HTTP_PROXY=http://127.0.0.1:7890"

Environment="HTTPS_PROXY=http://127.0.0.1:7890"

Environment="NO_PROXY=localhost, 127.0.0.1"

3、配置好containerd代理之后,初始化集群

$ sudo kubeadm init --control-plane-endpoint=192.168.1.155

 4、按照提示信息,配置集群(每个节点都需要执行)

$ mkdir -p $HOME/.kube

$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

5、使用命令查看集群状态

$ kubectl cluster-info

# 节点状态为NotReady,安装节点网络通信后状态为Ready

$ kubectl get nodes

 6、其他节点加入集群时,也不用修改containerd的配置文件,将集群凭证传到节点后,使用命令加入到集群中

;