1、概述
1.1、编写目的
此文档编写的目的是在记录使用9个虚拟机节点搭建一个k8s集群的过程。本文首先介绍不使用代理来搭建k8s集群;在文件末尾介绍了如何使用代理搭建k8s集群。
2、集群部署
2.1、环境概览
本次使用9台数据搭建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的配置文件,将集群凭证传到节点后,使用命令加入到集群中