主机准备
以下操作,在所有 4 台主机上均要进行,可以在 1 台主机上操作完后再进行克隆,但注意修改 IP 以及主机名。
1. 禁用 Linux 的 swap 分区
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久禁用 swap 分区
2. 添加DNS解析
我使用的是内网 DNS 服务器,若需要手动解析可编辑 /etc/hosts
文件,需要保证每台机器都能互相解析。
例如:
cat >> /etc/hosts << EOF
192.168.100.102 k8s-node-1
192.168.100.103 k8s-node-2
192.168.100.104 k8s-node-3
EOF
3. 时间同步
# 安装ntp服务
apt install ntpdate -y
# 安装完成后使用阿里云的时间服务同步时间
ntpdate ntp1.aliyun.com
4. 配置网络
为了让 K8s 能够转发网络流量,需要修改 iptables 的配置。
# 修改 Linux 内核参数,添加网桥过滤和地址转发功能
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 使配置生效
sudo sysctl --system
5. 重启服务器
reboot
6. 安装 Docker
按照
6.1 设置 Docker apt 仓库
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
6.2 安装 Docker 软件包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7. 安装 cri-dockerd
在 k8s 1.24 后,k8s 的 docker 原生支持被移除。cri-dockerd 用于为 Docker 提供一个能够支持 K8s 容器运行时标准的工具,从而能够让 Docker 作为 K8s 容器引擎。
# 通过 wget 命令获取 cri-dockerd软件
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.18/cri-dockerd-0.3.18-3.fc36.x86_64.rpm
# 通过 rpm 命令执行安装包
rpm -ivh cri-dockerd-0.3.18-3.fc36.x86_64.rpm
安装完成后修改配置文件 /usr/lib/systemd/system/cri-docker.service
,在 ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://
这一行增加 –pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10
:
# 打开 cri-docker.service 配置文件
vi /usr/lib/systemd/system/cri-docker.service
# 要修改的这一行
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10
配置文件修改后,重新加载配置并开启 cri-dockerd 服务。
# 加载配置并开启服务
systemctl daemon-reload
systemctl enable cri-docker && systemctl start cri-docker
8. 安装 kubeadm,kubelet,kubectl
按照
8.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
8.2 下载用于 Kubernetes 软件包仓库的公共签名密钥
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
8.3 添加 Kubernetes apt 仓库
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
8.4 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
我按照 k8s 时最新版本就为 1.33.2,如有需要请手动指定版本。
8.5 开机启动 k8s 服务
systemctl enable kubelet
以下操作,只在控制平面节点上进行。
9. 初始化 Master 节点
在控制平面节点执行以下命令:
kubeadm init \
--apiserver-advertise-address=192.168.100.101 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.33.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
apiserver-advertise-address:集群广播地址,使用 master 节点的内网 IP。
image-repository:由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。
kubernetes-version: k8s 版本,与上面安装的软件版本一致。
service-cidr:集群 Service 网段,一般无需更改。
pod-network-cidr:集群 Pod 网段,一般无需更改。
cri-socket:指定 cri-socket 接口,我们这里使用 unix:///var/run/cri-dockerd.sock。
执行命令后耐心等待,直到安装完成,会出现以下内容:
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 192.168.100.101:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx
其中说明,需要在控制平面节点执行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果当前以 root 身份登录,也可只执行以下命令来代替:
export KUBECONFIG=/etc/kubernetes/admin.conf
在返回结果的最后一条,有如下命令:
kubeadm join 192.168.100.101:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx
这个是用来加入作业节点的,需要在作业节点上执行。
以下操作,只在作业节点上进行。
10. 初始化 Master 节点
在作业节点上执行上文提到的代码:
kubeadm join 192.168.100.101:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx \
--cri-socket=unix:///var/run/cri-dockerd.sock
注意我们使用的是 cri-dockerd,故需要在最后面加上参数 -–cri-socket=unix:///var/run/cri-dockerd.sock
。
以下操作,只在控制平面节点上进行。
11. 安装 k8s 网络插件
# 下载 Calico 插件部署文件
wget https://docs.projectcalico.org/manifests/calico.yaml
修改 calico.yaml
文件中的 CALICO_IPV4POOL_CIDR
参数,需要与前面 kubeadm init
命令中的 -–pod-network-cidr
参数一样10.244.0.0/16
)。
文件内容较多,可使用
/CALICO_IPV4POOL_CIDR
快速查找。
最后,使用 kubectl apply
命令将 Calico 插件部署到集群里:
kubectl apply -f calico.yaml
Calico 部署会比较慢,大概等个几分钟,等待 Calico 部署完成后,通过命令 kubectl get node
查看节点状态,就可以看到所有节点已经准备就绪,此时集群正式搭建成功。
root@k8s-master-1:~# kubectl get node
NAME STATUS ROLES AGE VERSION
K8s-master-1 Ready control-plane 8m20s v1.33.2
k8s-node-1 Ready <none> 4m20s v1.33.2
k8s-node-2 Ready <none> 4m v1.33.2
k8s-node-3 Ready <none> 3m48s v1.33.2