环境&需求
服务器:
10.235.165.21 k8s-master
10.235.165.22 k8s-slave1
10.235.165.23 k8s-slave2
OS版本:
root@vms131:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.5 LTS
Release: 20.04
Codename: focal
需求
在 Ubuntu 20.04上搭建k8s1.28.3,并使用containerd作为容器运行时,使用calico作为cni插件。
安装步骤
特别注意:
以下操作,除特别标注外,都是在所有节点上执行
环境准备
-
服务器:linux发行版,最低配置2C2G
-
各节点网络互通
-
节点之中不可以有重复的主机名、MAC 地址
- 你可以使用命令
ip link
或ifconfig -a
来获取网络接口的 MAC 地址 - 可以使用
sudo cat /sys/class/dmi/id/product_uuid
命令对 product_uuid 校验
- 你可以使用命令
-
开放必要的端口(cni插件的端口要求以cni插件文档说明为准)
-
配置节点主机名
hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-slave1 hostnamectl set-hostname k8s-slave2
-
配置hostname解析
cat>>/etc/hosts<<-eof 10.235.165.21 k8s-master 10.235.165.22 k8s-slave1 10.235.165.23 k8s-slave2 eof
-
关闭selinux
echo "SELINUX=disabled" >> /etc/selinux/config
-
关闭swap
swapoff -a && sed -i '/swap/ s/^\(.*\)$/#\1/' /etc/fstab
-
关闭防火墙并禁止开机自启
ufw disable
-
转发 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
安装容器运行时(containerd)
安装containerd
1)安装containerd 1.7.8
# 下载二进制文件
root@k8s-master:~# wget https://github.com/containerd/containerd/releases/download/v1.7.8/containerd-1.7.8-linux-amd64.tar.gz
# 解压
root@k8s-master:/zpdata/packages# tar Cxzvf /usr/local containerd-1.7.8-linux-amd64.tar.gz
bin/
bin/containerd-shim-runc-v1
bin/containerd-stress
bin/containerd-shim-runc-v2
bin/containerd
bin/containerd-shim
bin/ctr
FAQ: For Kubernetes, do I need to download
cri-containerd-(cni-)<VERSION>-<OS-<ARCH>.tar.gz
too?Answer: No.
As the Kubernetes CRI feature has been already included in
containerd-<VERSION>-<OS>-<ARCH>.tar.gz
, you do not need to download thecri-containerd-....
archives to use CRI.
2)【可选】将containerd配置成systemd服务,方便使用systemctl命令管理
root@k8s-master:/zpdata/packages# mkdir -p /usr/local/lib/systemd/system/ ; cd /usr/local/lib/systemd/system/
root@k8s-master:/usr/local/lib/systemd/system# curl -s -o containerd.service http://raw.githubusercontent.com/containerd/containerd/main/containerd.service
# 加载配置文件
systemctl daemon-reload
# 设置开启自启并立即启动
systemctl enable --now containerd
配置containerd的config.toml
containerd的一些默认参数可能不兼容,需要针对性的调整
root@k8s-master:/zpdata/packages# mkdir /etc/containerd
root@k8s-master:/zpdata/packages# containerd config default > /etc/containerd/config.toml
做如下修改:
- 修改“sandbox_image”
[plugins."io.containerd.grpc.v1.cri"]
……
sandbox_image = "registry.k8s.io/pause:3.8" #修改为 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
- 修改"SystemdCgroup"【重要,需要与kubelet的cGroupDriver匹配】
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
……
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
……
SystemdCgroup = false # 改为 SystemdCgroup = true
然后重启containerd
sudo systemctl restart containerd
安装runc
root@k8s-master:/zpdata/packages# wget http://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64
root@k8s-master:/zpdata/packages# install -m 755 runc.amd64 /usr/local/sbin/runc
安装cni
root@k8s-slave1:/zpdata/packages# wget http://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
root@k8s-master:/zpdata/packages# mkdir -p /opt/cni/bin
root@k8s-master:/zpdata/packages# tar Cxzvf /opt/cni/bin/ cni-plugins-linux-amd64-v1.3.0.tgz
安装容器操作的客户端工具(crictl,nerdctl)
crictl
--For debugging only
VERSION="v1.28.0" # check latest version in https://github.com/kubernetes-sigs/cri-tools/releases page
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
# 检查
root@k8s-master:/zpdata/packages# crictl -v
crictl version v1.28.0
nerdctl
– General-purpose
root@k8s-master:/zpdata/packages# wget https://github.com/containerd/nerdctl/releases/download/v1.7.0/nerdctl-1.7.0-linux-amd64.tar.gz
root@k8s-master:/zpdata/packages# tar Cxzvvf /usr/local/bin nerdctl-1.7.0-linux-amd64.tar.gz
# 检查
root@k8s-master:/usr/local/bin# nerdctl -v
nerdctl version 1.7.0
安装 kubeadm、kubelet 和 kubectl
执行安装脚本install_kubeadm_kubelet_kubectl.sh
:
#!/usr/bin/sh
# 1.更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包
echo "###step1#####
apt-get update
mkdir -p -m 755 /etc/apt/keyrings
# 2.下载用于 Kubernetes 软件包仓库的公共签名密钥
echo "###step2#####
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 3. 添加 Kubernetes apt 仓库。 请注意,此仓库仅包含适用于 Kubernetes 1.28 的软件包; 对于其他 Kubernetes 次要版本,则需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本 (你还应该检查正在阅读的安装文档是否为你计划安装的 Kubernetes 版本的文档)。
echo "###step3#####
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 4. 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本
echo "###step4#####
apt-get update
apt-get install -y kubelet kubeadm kubectl
#”apt-mark hold“用于避免执行apt upgrade命令时,将未锁定的包误更新。
apt-mark hold kubelet kubeadm kubectl
kubelet 配置 cgroup 驱动程序
警告:
需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败。
前述步骤中containerd使用的
systemd
作为cgroup驱动,所以kubelet也需要使用systemd作为cgroup驱动。相关细节可参见配置 cgroup 驱动。
kubeadm 支持在执行 kubeadm init
时,传递一个 KubeletConfiguration
结构体,形如kubeadm init --config kubeadm-config.yaml
。 KubeletConfiguration
包含 cgroupDriver
字段,可用于控制 kubelet 的 cgroup 驱动。
如下是KubeletConfiguration的最小样例:
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
注意:
在版本 1.22 及更高版本中,如果用户没有在
KubeletConfiguration
中设置cgroupDriver
字段,kubeadm
会将它设置为默认值systemd
。
使用 kubeadm init 创建集群
默认情况下,kubeadm 会从 registry.k8s.io
仓库拉取镜像,在没有互联网连接的情况下运行 kubeadm,
kubeadm config images list #查看kubeadm init需要的镜像
kubeadm config images pull # 提前拉取这些镜像
#查看kubeadm init的默认值
kubeadm config print init-defaults
#查看kubeadm join的默认值
kubeadm config print join-defaults
【master节点】
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.3
出现这个提示说明init成功
Your Kubernetes control-plane has initialized successfully!
注意到kubectl get no
发现状态为NotReady
,是因为没有网络插件
root@k8s-master:/etc/apt/sources.list.d# kubectl get no
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 2m32s v1.28.3
安装网络插件(Calico)
k8s中网络插件有很中,比如:Calico,Flannel等,calico作为k8s的中的一种资源,只需要在master上执行即可。
以下以安装Calico为例
# 1)下载calico.yaml文件
wget https://github.com/projectcalico/calico/raw/2f38bd7adc4771a1de28bd2545e28d888c017a00/manifests/calico.yaml
# 2)做如下修改 calico.yaml.default为修改前,calico.yaml为修改后
root@k8s-master:/zpdata/packages# diff calico.yaml.default calico.yaml
4931,4932c4931,4932
< # - name: CALICO_IPV4POOL_CIDR
< # value: "192.168.0.0/16"
---
> - name: CALICO_IPV4POOL_CIDR
> value: "10.96.0.0/12"
# 10.96.0.0/12 值来源于kubeadm init时指定的 --pod-network-cidr 参数,默认是:10.96.0.0/12
root@k8s-master:/zpdata/packages# kubectl get cm -n kube-system kubeadm-config -o yaml | grep serviceSubnet
serviceSubnet: 10.96.0.0/12
使用kubeadm join将node加入k8s集群
【slave1,slave2节点执行】
kubeadm join 10.235.165.21:6443 --token aziikp.bm2cdaqa19jh3o74 \
--discovery-token-ca-cert-hash sha256:c93e7c0eb331a663783f5526322a1ceb231338f06c61647adb082395e3a5c1f7
ps:
若令牌过期,或丢失上述指令可在控制平面节点使用如下指令重新获取:kubeadm token create --print-join-command
验证
【master节点执行】
root@k8s-master:/zpdata/packages# kubectl get no -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready control-plane 55m v1.28.3 10.235.165.21 <none> Ubuntu 20.04.5 LTS 5.4.0-137-generic containerd://1.7.8
k8s-slave1 Ready <none> 28m v1.28.3 10.235.165.22 <none> Ubuntu 20.04.5 LTS 5.4.0-137-generic containerd://1.7.8
k8s-slave2 Ready <none> 28m v1.28.3 10.235.165.23 <none> Ubuntu 20.04.5 LTS 5.4.0-137-generic containerd://1.7.8
root@k8s-master:/zpdata/packages# kubectl cluster-info
Kubernetes control plane is running at https://10.235.165.21:6443
CoreDNS is running at https://10.235.165.21:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
如上,k8s 1.28.3 集群搭建完成