基于 AlmaLinux9 使用 kubeadm 搭建集群, ubuntu部署文档, 有疑问的地方可以看 官方文档, 本教程需要能访问 国际互联网 。不能的话,需要解决镜像拉取问题、yum 安装组件的问题。
准备机器
我的机器详情如下, 配置至少为 4C4G
hostname |
IP |
作用 |
master1 |
192.168.200.11 |
k8s master 节点 |
master2 |
192.168.200.12 |
k8s master 节点 |
master3 |
192.168.200.13 |
k8s master 节点 |
worker1 |
192.168.200.21 |
k8s worker 节点 |
worker2 |
192.168.200.22 |
k8s worker 节点 |
每台机器都做域名解析,或者绑定 hosts(直接使用 ip 地址会有警告)
1 2 3 4 5 6
| vim /etc/hosts
192.168.200.10 public kube-apiserver 192.168.200.11 master1 192.168.200.12 master2 192.168.200.13 master3
|
每台机器都关闭防火墙和 SELinux
负载均衡机器必须要关闭,因为 6443 不是 nginx 的标准端口,会被 selinux 拦截, 防火墙也需要放行 6443 端口, 可以考虑直接关闭防火墙
1 2 3 4 5
| sudo systemctl disable --now firewalld setenforce 0 sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
|
基础环境配置
基础环境是不管 master 还是 worker 都需要的环境
- 禁用 swap
- 确保每个节点上 MAC 地址和 product_uuid 的唯一性
sudo cat /sys/class/dmi/id/product_uuid
- 修改 hostname
安装 runtime
设置内核参数
1 2 3 4 5 6 7 8 9
| cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
sudo sysctl --system
|
启用内核模块
1 2 3 4 5 6 7
| cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF
sudo modprobe overlay sudo modprobe br_netfilter
|
安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install containerd.io -y
|
配置
从 yum 源安装的 containerd 默认禁用了 cri,可以使用命令重新生成默认配置
1 2 3 4 5 6 7 8 9 10 11 12 13
| containerd config default | sudo tee /etc/containerd/config.toml
sed -i 's#SystemdCgroup = .*#SystemdCgroup = true#g' /etc/containerd/config.toml
sed -i 's#sandbox_image = .*#sandbox_image = "registry.k8s.io/pause:3.10"#g' /etc/containerd/config.toml
sudo systemctl enable containerd sudo systemctl restart containerd
|
crictl 配置
之前使用 docker 的时候,docker 给我们做了很多好用的工具,现在用了 containerd,管理容器我们用 cri 管理工具 crictl,创建配置文件
1 2 3 4
| cat > /etc/crictl.yaml <<-'EOF' runtime-endpoint: unix:///run/containerd/containerd.sock debug: false EOF
|
安装 kubeadm、kubelet 和 kubectl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni EOF
yum list kubelet kubeadm kubectl --showduplicates --disableexcludes=kubernetes
sudo yum install -y kubelet-1.32.0 kubeadm-1.32.0 kubectl-1.32.0 --disableexcludes=kubernetes sudo systemctl enable --now kubelet
|
kube-apiserver 高可用方案
高可用方案有很多种,其他方案请参考 Kubernetes之master高可用方案
这里使用每台节点部署 nginx 反代来实现高可用,这种方式需要所有节点都安装负载均衡 (包括 master 和 worker )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| mkdir -p /etc/kube-lb/{conf,logs,sbin}
curl -L -C - https://file.babudiu.com/f/qjhX/kube-lb -o /etc/kube-lb/sbin/kube-lb chmod +x /etc/kube-lb/sbin/kube-lb
cat > /etc/kube-lb/conf/kube-lb.conf <<'EOF' user root; worker_processes 1;
error_log /etc/kube-lb/logs/error.log warn;
events { worker_connections 3000; }
stream { upstream backend { server 192.168.200.11:6443 max_fails=2 fail_timeout=3s; server 192.168.200.12:6443 max_fails=2 fail_timeout=3s; server 192.168.200.13:6443 max_fails=2 fail_timeout=3s; }
server { listen 127.0.0.1:8443; proxy_connect_timeout 1s; proxy_pass backend; } } EOF
cat > /etc/systemd/system/kube-lb.service <<'EOF' [Unit] Description=l4 nginx proxy for kube-apiservers After=network.target After=network-online.target Wants=network-online.target
[Service] Type=forking ExecStartPre=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb -t ExecStart=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb ExecReload=/etc/kube-lb/sbin/kube-lb -c /etc/kube-lb/conf/kube-lb.conf -p /etc/kube-lb -s reload PrivateTmp=true Restart=always RestartSec=15 StartLimitInterval=0 LimitNOFILE=65536
[Install] WantedBy=multi-user.target EOF
systemctl enable --now kube-lb
|
kube-lb 其实就是自己编译的 Nginx,精简了 http 模块,只开启了 stream 模块用作 4 层转发,详细参数如下:
1 2 3
| nginx version: nginx/1.24.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) configure arguments: --with-stream --without-http --without-http_uwsgi_module --without-http_scgi_module --without-http_fastcgi_module
|
创建集群
提前拉镜像(可选)
1 2 3
| kubeadm config images pull \ --kubernetes-version 1.32.0 \ --image-repository registry.aliyuncs.com/google_containers
|
kubeadm init
在 master1 上执行
1 2 3 4 5 6
| sudo kubeadm init \ --control-plane-endpoint "127.0.0.1:8443" \ --kubernetes-version 1.32.0 \ --upload-certs \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16
|
- 也可以用
kubeadm config print init-defaults > init.yaml
生成 kubeadm 的配置,并用 kubeadm init --config=init.yaml
来创建集群。
- 如果不能拉官方镜像,增加参数使用阿里云镜像源
--image-repository registry.aliyuncs.com/google_containers
安装网络插件
1 2
| kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
|
常见问题
kubeadm 部署的集群 常见问题汇总