Kubernetes kubeadm 集群部署与 CKA 实战指南
本项目提供了一套完整的、可操作的 Kubernetes 集群部署方案,聚焦于使用 kubeadm 工具在不同环境中(包括 Apple Silicon、AWS EC2、VirtualBox)从零开始搭建生产级别的集群。同时,项目包含了丰富的 Certified Kubernetes Administrator (CKA) 认证课程笔记和实战练习脚本,帮助用户深入理解 Kubernetes 核心概念。
功能特性
- 多环境兼容:支持在 Apple Silicon (M1/M2) 使用 Multipass、在 AWS EC2 使用 Terraform、在本地使用 VirtualBox/Vagrant 部署集群。
- 高可用部署:提供在 AWS 上部署 5 节点高可用 (HA) 集群的详细方案,包含外部负载均衡器 (HAProxy) 配置。
- CNI 网络集成:无缝集成 Calico 和 Weave 网络插件,支持网络策略,解决 Pod 跨节点通信。
- CKA 备考笔记:涵盖集群架构、ETCD、Pods、ReplicaSets、Deployments、Services 等 CKA 考试核心概念的结构化笔记。
- 自动化脚本:包含节点初始化、系统参数调优、容器运行时 (containerd) 安装、集群初始化及节点加入的全套 Bash 脚本。
安装指南
系统要求
- 操作系统: Ubuntu 22.04 (推荐) 或其他兼容 Linux 发行版
- 硬件资源: 至少 2GB RAM (每个节点),建议 4GB+;CPU 2核+
- 网络: 节点间网络互通,能够访问外部容器镜像仓库
依赖项
kubeadm,kubelet,kubectl- 容器运行时:
containerd(本项目统一使用) - 工具:
curl,apt-transport-https,jq,Multipass(Mac 环境)
通用安装步骤
以下步骤适用于所有环境(在每台节点上执行):
-
配置内核模块
bashcat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlay sudo modprobe br_netfilter -
设置网络参数
bashcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system -
安装 containerd 并配置 systemd cgroup
bashsudo apt-get install -y containerd sudo mkdir -p /etc/containerd containerd config default | sed 's/SystemdCgroup = false/SystemdCgroup = true/' | sudo tee /etc/containerd/config.toml sudo systemctl restart containerd -
安装 Kubernetes 组件
bashKUBE_LATEST=$(curl -L -s https://dl.k8s.io/release/stable.txt | awk 'BEGIN { FS="." } { printf "%s.%s", $1, $2 }') sudo mkdir -p /etc/apt/keyrings curl -fsSL https://pkgs.k8s.io/core:/stable:/${KUBE_LATEST}/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:/${KUBE_LATEST}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
使用说明
部署标准三节点集群
-
初始化控制平面 (在 controlplane 节点)
bashPOD_CIDR=10.244.0.0/16 SERVICE_CIDR=10.96.0.0/16 sudo kubeadm init --pod-network-cidr $POD_CIDR --service-cidr $SERVICE_CIDR --apiserver-advertise-address $PRIMARY_IP -
配置 kubectl
bashmkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config -
安装 Pod 网络插件 (Calico)
bashkubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.1/manifests/tigera-operator.yaml curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.30.1/manifests/custom-resources.yaml sed -i "s#192.168.0.0/16#$POD_CIDR#" custom-resources.yaml kubectl apply -f custom-resources.yaml -
加入工作节点 (在 node01, node02 上执行)
bash# 使用控制平面初始化后生成的 token 命令 sudo kubeadm join <controlplane-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
测试集群
部署一个 Nginx 应用并暴露为 NodePort 服务:
bash
kubectl create deployment nginx --image nginx:alpine
kubectl expose deploy nginx --type=NodePort --port 80
PORT_NUMBER=$(kubectl get service nginx -o jsonpath="{.spec.ports[0].nodePort}")
curl http://node01:$PORT_NUMBER
高可用集群部署关键步骤
在 AWS 等云环境中构建 HA 集群需要配置外部负载均衡器:
-
安装 HAProxy
bashapt-get update && apt-get install -y haproxy -
配置 HAProxy 前端和后端
bashcat <<EOF > /etc/haproxy/haproxy.cfg frontend kubernetes bind $(dig +short loadbalancer):6443 mode tcp default_backend kubernetes-control-nodes backend kubernetes-control-nodes mode tcp balance roundrobin server controlplane01 $(dig +short controlplane01):6443 check fall 3 rise 2 server controlplane02 $(dig +short controlplane02):6443 check fall 3 rise 2 server controlplane03 $(dig +short controlplane03):6443 check fall 3 rise 2 EOF systemctl restart haproxy -
初始化 HA 控制平面
bashsudo kubeadm init --control-plane-endpoint loadbalancer:6443 --upload-certs --pod-network-cidr=192.168.0.0/16
核心代码
节点系统预配置脚本
此脚本用于设置必要的内核参数并安装基础工具,是所有节点的前置操作。
bash
#!/usr/bin/env bash
# 设置所需内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
# 持久化模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 设置网络参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
容器运行时及 Kubernetes 组件安装脚本
该脚本自动化安装 containerd 及 kubeadm/kubelet/kubectl,并配置 cgroup 驱动。
bash
#!/usr/bin/env bash
# 安装 containerd
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sed 's/SystemdCgroup = false/SystemdCgroup = true/' | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
# 安装 Kubernetes 组件
KUBE_LATEST=$(curl -L -s https://dl.k8s.io/release/stable.txt | awk 'BEGIN { FS="." } { printf "%s.%s", $1, $2 }')
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/${KUBE_LATEST}/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:/${KUBE_LATEST}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
# 配置 crictl
sudo crictl config \
--set runtime-endpoint=unix:///run/containerd/containerd.sock \
--set image-endpoint=unix:///run/containerd/containerd.sock
集群资源监控脚本示例
此脚本用于跨多个集群查找 CPU 使用率最高的节点。
bash
#!/bin/bash
# 从多个集群上下文中获取 CPU 使用率最高的节点
echo cluster1 $(kubectl --context cluster1 top node --no-headers | sort -nr -k2 | head -1) > /tmp/high_cpu_node
echo cluster2 $(kubectl --context cluster2 top node --no-headers | sort -nr -k2 | head -1) >> /tmp/high_cpu_node
echo cluster3 $(kubectl --context cluster3 top node --no-headers | sort -nr -k2 | head -1) >> /tmp/high_cpu_node
echo cluster4 $(kubectl --context cluster4 top node --no-headers | sort -nr -k2 | head -1) >> /tmp/high_cpu_node
echo cluster5 $(kubectl --context cluster5 top node --no-headers | sort -nr -k2 | head -1) >> /tmp/high_cpu_node
# 找出全局 CPU 最高的节点
final_value=$(cat /tmp/high_cpu_node | sort -nr -k 3 | awk '{print $1,$2}' | head -1 | tr " " ,)
if [[ $(cat /opt/high_cpu_node | grep $final_value) ]]
then
echo SUCCESS
else
echo FAIL
fi
1yqIRiTh1E+W8Z+vXAF4uT4cttG41aDz5FfsbsxfvWSggpt+CtBZAUHHDYh48LW59LClT5ayllkB5JBltB0i+Q==