之前看到很多技术博客上描述kubeadm搭建k8s集群,感觉很简单,有一键安装的既视感,于是手贱想试下工作量到底有多大,没想到在众多技术文档的指导下还是踩了不少坑,特记录如下。
本人搭建使用vmware虚拟机,系统为ubuntu-23.10-live-server-amd64,集群两节点:192.168.254.135(master)、192.168.254.136(slave)
1、前期准备:vmware虚拟出两台ubuntu系统,虚拟机的网络模式设置为NAT模式,方便从外网下载需要的各种安装包。(如果网络模式设置为nat后,还是无法上网,ifconfig看下ens33网卡有没有分配ip,如果没有ip,可以看下window系统下服务vmware dhcp service和vmware nat service有没有开启)。安装ssh服务并设置节点之间免密登录(方便相互之间拷贝文件)。
2、环境准备:
# 更改主机名
hostnamectl set-hostname k8s-master
ufw disable # 关闭防火墙
# 关闭swap
swapoff -a # 临时
vim /etc/fstab # 永久需注释掉 swap 那一行
#
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
# 作为 Linux 节点的 iptables 正确查看桥接流量的要求,您应该确保在配置中设置为 1
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
3、安装containerd
# 生成containetd的配置文件
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改cgroup Driver为systemd(kubeadm把kubelet视为一个系统服务来管理,所以对基于kubeadm的安装,推荐使用systemd作为cgroup 驱动。)
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#' /etc/containerd/config.toml
#查看是否修改成功
grep 'SystemdCgroup = true' -B 7 /etc/containerd/config.toml
# 镜像加速
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry.cn-hangzhou.aliyuncs.com" ,"https://registry-1.docker.io"] #修改为国内的阿里源
......
# 更改sandbox_image
[plugins."io.containerd.grpc.v1.cri"]
disable_tcp_service = true
stream_server_address = "127.0.0.1"
stream_server_port = "0"
stream_idle_timeout = "4h0m0s"
enable_selinux = false
selinux_category_range = 1024
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.5" #这里镜像地址设置成阿里镜像源地址
# 加入开机启动 和重启服务
systemctl enable containerd && systemctl start containerd
4、安装kubeadm、kubectl、kubelet
#新增源
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main"
apt-get update
#查看版本
apt-cache madison kubelet kubectl kubeadm
#指定版本安装
apt install -y kubelet=1.23.3-00 kubectl=1.23.3-00 kubeadm=1.23.3-00
启动kubelet并设置开机自启
systemctl enable --now kubelet
设置crictl(crictl 是 CRI 兼容的容器运行时命令行接口。 你可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序,用于设置连接容器runtime)
cat << EOF >> /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: false
EOF
以上所有节点都需运行
5、初始化集群(初始化失败后可以执行kubeadm reset恢复)
kubeadm init --kubernetes-version=v1.23.3 --apiserver-advertise-address 192.168.2.31 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr 10.244.0.0/16
6、配置kubectl(主从节点都要配置,从节点对应目录下没有admin.conf,要从主节点拷贝)
不然会报The connection to the server localhost:8080 was refused - did you specify the right host or port?
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
7、检查master 初始化结果
coredns 将处于启动失败的状态(一直pending状态),完成 安装网络插件 这个步骤后,coredns 将正常启动。
# 只在 master 节点执行
# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
# 查看 master 节点初始化结果
kubectl get nodes -o wide
如果初始化之前出现api-server的6443端口一直connect refuse,可以参考:https://www.jb51.net/article/271492.html
8、安装网络插件(flannel)
查询很多安装方案,差不多都是通过:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
这种方式首先会出现无法访问raw.githubusercontent.com问题:
The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?
网络问题可以通过:https://blog.csdn.net/qq_22409661/article/details/136274442 解决,但这并不能彻底解决问题
现有kube-flannel.yml将ns创建、serviceaccount创建、rbac申请绑定、configmap、deamonset资源创建一起执行,这样会出现一个问题: Failed to create SubnetManager: error retrieving pod spec for : the server doe…
可以通过https://blog.csdn.net/weixin_33963594/article/details/90335154
解决
先申请clusterrole 、clusterrolebinding、sa,然后再创建configmap和daemonset资源。
8、slave节点加入
获得join指令
# 只在 master 节点执行
kubeadm token create --print-join-command
在所有的slave节点执行master节点返回的join指令
# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join 192.168.2.31:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303
9、检查slave加入结果
# 只在 master 节点执行
kubectl get nodes -o wide
# 都是Ready即可