Kubernetes 集群部署
Kubernetes 相关端口
1. Kubernetes 集群组件运行模式
独立组件模式
- 除 Add-ons 以外,各关键组件以二进制方式部署于节点上,并运行于守护进程;
- 各 Add-ons 以 Pod 形式运行
静态 Pod 模式
- 控制平面各组件以静态 Pod 对象运行于 Master 主机之上
- kubelet 和 docker 以二进制部署,运行为守护进程
- kube-proxy 等则以 Pod 形式运行
- k8s.gcr.io
2. 安装工具
- 原生安装工具 kubeadm
- CNCF 认证的安装工具
3. 部署前提
使用 kubeadm 部署 Kubernetes 集群的前提条件
- 支持 Kubernetes 运行的 Linux 主机,例如 Debian、RedHat 及其变体等
- 每主机 2GB 以上的内存,以及 2 颗以上的 CPU
- 各主机间能够通过网络正常通信,支持各节点位于不同的网络中
- 独占的 hostname、MAC 地址以及 product_uuid,主机名能够正常解析
- 放行由 Kubernetes 使用到的各端口,或直接禁用 iptables
- 禁用各主机的上的 Swap 设备
- 各主机时间同步
准备代理服务,以便接入 registry.k8s.io,或根据部署过程提示的方法获取相应的 Image
重要提示
- kubeadm 不仅支持集群部署,还支持集群升级、卸载、更新数字证书等功能
- 目前,kubeadm 为各节点默认生成的 SSL 证书的有效期限为1年,在到期之前需要更新这些证书
集群部署步骤
- 验证各前提条件是否已然满足
- 在各节点上安装容器运行时
- 在各节点上安装 kubeadm、kubelet和 kubectl
- 创建集群
- 在控制平面的第一个节点上,使用 kubeadm init 命令拉起控制平面
- 会生成 token 以认证后续加入的节点
- (实验环境可选)将其它几个控制平面节点使用 kubeadm join 命令加入到控制平面集群中
- 提示:需要先从第一个控制平面节点上拿到 CA 及 API Server 等相应的证书
- 将各 worker 节点使用 kubeadm join 命令加入到集群中
- 确认各节点状态正常转为 “Ready”
- 在控制平面的第一个节点上,使用 kubeadm init 命令拉起控制平面
4. 部署具体步骤
官方文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
使用 kubeadm 快速部署一个 Kubernetes 集群
环境准备
四台 Ubuntu2204 虚拟机 2G 2CPU
IP地址 | hostname |
---|---|
10.0.0.100 | master1.munan.com |
10.0.0.110 | node1.munan.com |
10.0.0.120 | node2.munan.com |
10.0.0.130 | node3.munan.com |
验证每个节点的 MAC 地址和product_uuid是否唯一
ip a
cat /sys/class/dmi/id/product_uuid
免密登录打通
4.1 设置 hostname
# master1 节点
[root@Ubuntu2204 ~]#hostnamectl set-hostname master1.munan.com
[root@Ubuntu2204 ~]#hostname
master1.munan.com
[root@Ubuntu2204 ~]#bash
[root@master1 ~]#
# node1 节点
[root@Ubuntu2204 ~]#hostnamectl set-hostname node1.munan.com
[root@Ubuntu2204 ~]#hostname
node1.munan.com
[root@Ubuntu2204 ~]#bash
[root@node1 ~]#
# node2 节点
[root@Ubuntu2204 ~]#hostnamectl set-hostname node2.munan.com
[root@Ubuntu2204 ~]#hostname
node2.munan.com
[root@Ubuntu2204 ~]#bash
[root@node2 ~]#
# node3 节点
[root@Ubuntu2204 ~]#hostnamectl set-hostname node3.munan.com
[root@Ubuntu2204 ~]#hostname
node3.munan.com
[root@Ubuntu2204 ~]#bash
[root@node3 ~]#
4.2 设置时间同步
一个 master 节点和三个 node 节点都需要安装,并修改 /etc/chrony/chrony.conf 文件
apt -y install chrony
vim /etc/chrony/chrony.conf
注释 pool 开头的几行
20 #pool ntp.ubuntu.com iburst maxsources 4
21 #pool 0.ubuntu.pool.ntp.org iburst maxsources 1
22 #pool 1.ubuntu.pool.ntp.org iburst maxsources 1
23 #pool 2.ubuntu.pool.ntp.org iburst maxsources 2
24 server ntp.aliyun.com iburst
25 server time1-5.cloud.tencent.com iburst
systemctl restart chrony.service
systemctl enable --now chrony.service
systemctl status chrony.service
chronyc sources -v
4.3 设置主机名称解析
一个 master 节点和三个 node 节点 都需要设置
vim /etc/hosts
10.0.0.100 master1.munan.com
10.0.0.110 node1.munan.com
10.0.0.120 node2.munan.com
10.0.0.130 node3.munan.com
4.4 禁用 swap
一个 master 节点和三个 node 节点 都需要禁用
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 查看交换分区内存是否为 0
free -h
total used free shared buff/cache available
内存: 1.9Gi 296Mi 1.2Gi 1.0Mi 371Mi 1.4Gi
交换: 0B 0B 0B
4.5 禁用默认的防火墙服务
一个 master 节点和三个 node 节点 都需要禁用
ufw disable
ufw status
4.6 内核参数调整
一个 master 节点和三个 node 节点 都需要配置
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
lsmod | grep br_netfilter
bash -c 'echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/k8s.conf'
把 cri-containerd 的包上传
一个 master 节点和三个 node 节点 都需要上传
cri-containerd-cni-1.7.13-linux-amd64.tar.gz
tar -xvf cri-containerd-cni-1.7.13-linux-amd64.tar.gz -C /
containerd -v
mkdir /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
vim /etc/containerd/config.toml
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
SystemdCgroup = true
systemctl enable --now containerd
4.7 安装kubelet、kubeadm和kubectl
一个 master 节点和三个 node 节点 都需要安装和配置
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
4.8 初始化第一个主节点
sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.15 --cri-socket unix:///run/containerd/containerd.sock
[root@master1 ~]#sudo kubeadm init \
--apiserver-advertise-address=10.0.0.100 \ # 修改为主节点 IP
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.15 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock
把这一段生成的复制下来
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.0.100:6443 --token kr1pgl.ymatmfkihnklyhf6 \
--discovery-token-ca-cert-hash sha256:af3f0be0229b6ab564eb778442f6488b3db586adc8e656db8a7be479fb2b266f
# master1 节点
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# node1 node2 node3 节点
kubeadm join 10.0.0.100:6443 --token kr1pgl.ymatmfkihnklyhf6 \
--discovery-token-ca-cert-hash sha256:af3f0be0229b6ab564eb778442f6488b3db586adc8e656db8a7be479fb2b266f
[root@master1 ~]#kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1.munan.com Ready control-plane 5m1s v1.28.15
node1.munan.com Ready <none> 28s v1.28.15
node2.munan.com Ready <none> 6s v1.28.15
node3.munan.com Ready <none> 2s v1.28.15
故障处理
apt-get install -y kubelet kubeadm kubectl
E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1605(unattended-upgr)持有
N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系统。
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
解决方法:等待一段时间,直到unattended-upgr进程完成其任务并释放锁
ps aux | grep apt
Ready 2s v1.28.15
故障处理
```bash
apt-get install -y kubelet kubeadm kubectl
E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1605(unattended-upgr)持有
N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系统。
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
解决方法:等待一段时间,直到unattended-upgr进程完成其任务并释放锁
ps aux | grep apt