Kubernetes v1.36 安装指南(Ubuntu 24.04)
📌 环境准备
sudo apt update
sudo apt install -y curl wget
# 配置 containerd 镜像代理(如遇 registry.k8s.io 超时)
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's|sandbox_image = "[^"]*"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"|' /etc/containerd/config.toml
cat <<EOF | sudo tee -a /etc/containerd/config.toml
[plugins."io.containerd.cri.v1.images".registry.mirrors."registry.k8s.io"]
endpoint = ["https://registry.aliyuncs.com/google_containers"]
EOF
# 禁用swap
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
# 启用IP转发
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# 修复主机名 DNS 解析
HOST=$(hostname)
if ! grep -q "127.0.0.1.*$HOST" /etc/hosts; then
echo "127.0.0.1 $HOST" | sudo tee -a /etc/hosts
fi
🚀 安装流程
1. 配置Kubernetes仓库
sudo apt install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/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.36/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
2. 主控节点部署
sudo bash ./master-setup.sh
完整脚本内容见 master-setup.sh。
3. 工作节点部署
sudo bash ./worker-setup.sh
完整脚本内容见 worker-setup.sh。
🔧 验证集群状态
kubectl get nodes --output=wide
kubectl get pods --all-namespaces
🛡️ 安全加固
sudo vi /etc/containerd/config.toml # 添加以下配置
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."your-registry"]
endpoint = ["https://your-registry"]
📝 注意事项
版本锁定配置
sudo bash -c 'cat > /etc/apt/preferences.d/kube.pref <<EOF
Package: kubelet kubeadm kubectl
Pin: version 1.36.0-00*
Pin-Priority: 1001
EOF'
📦 网络插件选项
sudo kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
⚡ IPVS 模式
本脚本默认将 kube-proxy 切换为 IPVS 模式,理由如下:
| 对比项 | iptables 模式 | IPVS 模式 |
|---|---|---|
| 数据结构 | 链式匹配(O(n)) | 哈希表(O(1)) |
| 规则更新 | 全量替换,Service 增多时延迟明显 | 增量更新,几乎实时 |
| 调度算法 | 仅 random | rr / wrr / lc / sh 等 10+ 种 |
| 适用规模 | 数百 Service 以内 | 万级 Service 无压力 |
IPVS 依赖 iptables 做 SNAT 和 NodePort 入口,两者共存协作,并非互斥。
验证 IPVS 是否生效:
# 查看 kube-proxy 模式
kubectl get configmap -n kube-system kube-proxy -o jsonpath='{.data.config\.conf}' | grep mode
# 查看 IPVS 转发规则
ipvsadm -Ln
🛠️ 常见问题
- 证书过期:
sudo kubeadm alpha certs renew all - 节点无法连接:检查防火墙规则
sudo ufw allow from <node-ip>
📝 版本说明
- Kubernetes v1.36.0-00
- containerd v1.7.6
脚本说明
master-setup.sh:初始化集群并配置 containerdworker-setup.sh:预装必要组件等待集群加入
构建镜像
使用 containerd ,却不能使用 crictl 构建镜像。 此时,不要安装docker,有冲突,处理比较麻烦。 这要使用 nerdctl , 安装:
cd /tmp
# 如果刚才的包还在就用现成的,不在了重新下
wget https://github.com/containerd/nerdctl/releases/download/v2.3.4/nerdctl-full-2.3.4-linux-amd64.tar.gz
tar xzf nerdctl-full-2.3.4-linux-amd64.tar.gz
# 只拷你要的,跳过 containerd 系列
sudo cp bin/nerdctl /usr/local/bin/
sudo cp bin/buildkitd bin/buildctl /usr/local/bin/
# (可选)CNI 如果节点上 /opt/cni/bin 已经有了可以跳过
sudo cp -r bin/cni /opt/cni/bin/ 2>/dev/null || true
# buildkit 服务起起来
sudo cp lib/systemd/system/buildkit.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now buildkit
# 验证
sudo nerdctl version
# BuildKit 服务
sudo rm -f /etc/systemd/system/buildkit.service
sudo sh -c 'cat > /etc/systemd/system/buildkit.service <<EOF
[Unit]
Description=BuildKit daemon
After=network.target containerd.service
[Service]
Type=simple
ExecStart=/usr/local/bin/buildkitd --addr unix:///run/buildkit/buildkitd.sock --containerd-worker=true --containerd-worker-namespace=k8s.io --oci-worker=false
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF'
sudo systemctl daemon-reload
sudo systemctl restart buildkit
sudo systemctl status buildkit
测试 Dockerfile
mkdir -p ~/nerdctl-test && cd ~/nerdctl-test
cat > Dockerfile <<'EOF'
FROM alpine:3.20
RUN apk add --no-cache curl
WORKDIR /app
COPY . .
CMD ["echo", "hello from nerdctl build"]
EOF
sudo nerdctl build -t nerdctl-test:v1 .
# 默认看 default namespace(nerdctl 自己的)
sudo nerdctl images | grep nerdctl-test
# 再看 K8s 侧(k8s.io namespace),此时还看不到,因为刚才没指定 -n
sudo nerdctl -n k8s.io images | grep nerdctl-test
# 跑一下确认镜像能起容器
sudo nerdctl run --rm nerdctl-test:v1