基于 ubuntu 使用 kubeadm 搭建集群, centos部署文档, 有疑问的地方可以看 官方文档
准备机器
我的机器详情如下, 配置至少为 4C4G
| hostname |
IP |
作用 |
| master1 |
10.0.0.11 |
k8s master 节点 |
| master2 |
10.0.0.12 |
k8s master 节点 |
| master3 |
10.0.0.13 |
k8s master 节点 |
| worker1 |
10.0.0.21 |
k8s worker 节点 |
| worker2 |
10.0.0.22 |
k8s worker 节点 |
每台机器都做域名解析,或者绑定 hosts(可选但建议)
1 2 3 4 5
| vim /etc/hosts
10.0.0.11 master1 10.0.0.12 master2 10.0.0.13 master3
|
基础环境配置
基础环境是不管 master 还是 worker 都需要的环境
- 禁用 swap
- 确保每个节点上 MAC 地址和 product_uuid 的唯一性
sudo cat /sys/class/dmi/id/product_uuid
- 修改 hostname
- 允许 iptables 检查桥接流量
- 关闭防火墙
1 2 3 4 5 6 7 8 9 10 11
| sudo systemctl disable --now ufw
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF
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
|
安装 runtime
先决条件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF
sudo modprobe overlay sudo modprobe br_netfilter
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 8 9 10 11 12 13 14 15
| sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update sudo apt install -y containerd.io
|
配置
生成默认配置
1 2
| sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml
|
结合 runc 使用 systemd cgroup 驱动,在 /etc/containerd/config.toml 中设置
1 2 3 4 5 6
| sed -i 's#SystemdCgroup = .*#SystemdCgroup = true#g' /etc/containerd/config.toml
sed -i 's#sandbox_image = .*#sandbox_image = "registry.k8s.io/pause:3.10.1"#g' /etc/containerd/config.toml
|
sudo systemctl restart containerd
crictl 配置
之前使用 docker 的时候,docker 给我们做了很多好用的工具,现在用了 containerd,管理容器我们用 cri 管理工具 crictl,创建配置文件
vim /etc/crictl.yaml
1 2
| runtime-endpoint: unix:///run/containerd/containerd.sock debug: false
|
安装 Docker
1
| curl -fsSL get.docker.com | bash
|
配置 Doker
1 2 3 4 5 6 7 8 9 10 11 12 13
| sudo mkdir /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF
sudo systemctl enable --now docker
|
安装 kubeadm、kubelet 和 kubectl
这一步需要科学上网, 不能科学上网的可以看看国内的源。
更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
1 2
| sudo apt update sudo apt-get install -y apt-transport-https ca-certificates curl gpg
|
下载 Google Cloud 公开签名秘钥与添加 Kubernetes apt 仓库:
官方版本变更较快,详情查看官方文档https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
1 2 3 4 5 6 7 8 9 10 11 12 13
| curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt-cache madison kubeadm sudo apt install -y kubeadm=1.34.1-1.1 kubelet=1.34.1-1.1 kubectl=1.34.1-1.1
sudo apt-mark hold kubelet kubeadm kubectl sudo systemctl enable --now kubelet
|
准备高可用方案
高可用方案有很多种,其他方案请参考 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://s3.babudiu.com/src/linux/bin/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 10.0.0.11:6443 max_fails=2 fail_timeout=3s; server 10.0.0.12:6443 max_fails=2 fail_timeout=3s; server 10.0.0.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
|
创建集群
kubeadm init
在 init 之前先将镜像拉取到本地(可选步骤)
1
| kubeadm config images pull --kubernetes-version 1.34.1
|
其中会拉下来一个 pause 镜像,尽量再修改一下 containerd 里面配置的 pause 镜像,版本保持一致。
在 k8s-master0 上执行
1 2 3 4 5 6
| sudo kubeadm init \ --kubernetes-version 1.34.1 \ --control-plane-endpoint "127.0.0.1:8443" \ --upload-certs \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16
|
在 init 之前先将镜像拉取到本地(可选步骤)
1
| kubeadm config images pull --kubernetes-version 1.34.1 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
|
在 k8s-master0 上执行
1 2 3 4 5 6 7
| sudo kubeadm init \ --kubernetes-version 1.34.1 \ --control-plane-endpoint "127.0.0.1:8443" \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ --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 来创建集群。
安装网络插件
1
| kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
|
常见问题
kubeadm 部署的集群 常见问题汇总