环境说明
以下是笔者的尝试过的搭建环境:
- ubuntu 18.04 / 22.04
- Kubernetes 1.24 ~ 1.26
- docker / containerd
需要注意的是,Kubernetes 在 1.24 版本后删除了 dockershim ,搭建过程中如遇容器运行时、镜像等问题,参考一些旧版本的基于 docker 的解决方法大概率是不可行的。
环境准备
无论是 master 还是 worker 节点,都需要完成如下环境的修改与软件安装。
设置静态 IP
-
ifconfig
查看当前 IP 和子网掩码,route -n
查看网关地址 -
进入
/etc/netplan
目录,编辑其中的01-network-manager-all.yaml
文件(不同版本 Ubuntu 的文件名可能不一样),格式形如:yamlnetwork: version: 2 renderer: NetworkManager ethernets: enp1s0: # 网卡名称 dhcp4: no # 关闭dhcp dhcp6: no addresses: [192.168.122.120/24] # 静态IP gateway4: 192.168.122.1 # 网关 nameservers: addresses: [8.8.8.8, 114.114.114.114] # DNS
-
使配置生效:
sudo netplan apply
-
桌面版可以直接在网络设置的图形化界面设置
系统优化
-
禁用 swap 分区:编辑
/etc/fstab
,将 swap 那行注释掉 -
修改模块配置(安装了 docker 可跳过这步)
bash# 临时修改(立即生效,重启后失效) modprobe br_netfilter echo "1" > /proc/sys/net/ipv4/ip_forward # 永久修改(重启后生效) # 开机自动加载 br_netfilter 模块 cat > /etc/modules-load.d/k8s.conf <<EOF br_netfilter EOF # 开机自动设置 ip_forward 值为1 cat > /etc/sysctl.d/k8s.conf << EOF net.ipv4.ip_forward=1 EOF
-
重启
软件安装
-
安装基础软件
bashsudo apt update sudo apt install -y apt-transport-https ca-certificates curl
-
安装 conteinerd / docker(二选一即可)
bashsudo apt install -y docker.io sudo apt install -y containerd
-
安装 kubenetes
-
添加软件源
bashcurl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat > /etc/apt/sources.list.d/kubernetes.list << EOF deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF
-
安装组件
bashsudo apt update sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本
组件说明:
kubeadm
:用来初始化集群的指令
kubectl
:用来与集群通信的命令行工具
kubelet
:在集群中的每个节点上用来启动 Pod 和容器等
-
k8s 配置
master 节点配置
master 的作用是创建集群网络
-
初始化集群:
csskubeadm init \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ --pod-network-cidr=10.244.0.0/16 [--cri-socket unix:///var/run/cri-dockerd.sock]
参数说明:
image-repository
:镜像源
pod-network-cidr
:pod 网络地址范围这里是最容易出问题的地方,一般会显示超时,解决办法见文末。
成功后会显示
Your Kubernetes control-plane has initialized successfully!
,注意记下最后生成的包含 token 的 join 命令。 -
配置 kubectl
bashmkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
配置 flannel 网络(否则节点状态为
NotReady
)bashkubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
worker 节点配置
该配置是为了将 worker 节点加入集群网络
-
拉取镜像
bashkubeadm config images pull --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
-
使用 join 命令加入网络
bash# 请换成你自己的 master 生成的命令 kubeadm join 192.168.142.134:6443 --token q1twco.j374oo66pybp1lf2 --discovery-token-ca-cert-hash sha256:959c16f041e1b218bec3c8b27a4a75318590c6377e54ccdbda4956ba6d1424a2
-
使用
kubectl get nodes
查看网络中的节点
Some Tips
-
查看日志
bashjournalctl -xeu kubelet
-
主节点重新初始化前,或者工作节点加入集群前,都需要重置环境
bashkubeadm reset -f [--cri-socket unix:///var/run/cri-dockerd.sock]
-
主节点初始化后,需要重新配置
$HOME/.kube/config
-
生成新的 Token
bashkubeadm token create --print-join-command
问题处理
-
(日志中)错误提示:
failed to get sandbox image "registry.k8s.io/pause:3.6"
解决:从国内仓库拉取pause镜像,修改tag,注意版本号和 tag 与报错提示的一致
bashctr -n k8s.io i pull -k registry.aliyuncs.com/google_containers/pause:3.6 ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.6 registry.k8s.io/pause:3.6
-
crictl 报错:
runtime connect using default endpoints
解决:指定容器运行时
bash# kubernetes 1.24 之后,dockershim 变成了 cri-dockerd,需要额外安装 crictl config runtime-endpoint unix:///run/cri-dockerd.sock crictl config image-endpoint unix:///run/cri-dockerd.sock # 选择用 containerd 作为容器运行时 crictl config runtime-endpoint unix:///run/containerd/containerd.sock crictl config image-endpoint unix:///run/containerd/containerd.sock # 还可以设置其他的容器运行时
生成的配置在
cat /etc/crictl.yaml
,可以随时修改