📋 Kubernetes 集群完整配置清单
🔧 基础环境配置
- 操作系统:Ubuntu 24.04.3 LTS
- Kubernetes版本:v1.34.2
- 推荐安装顺序:containerd → kubelet → kubeadm → kubectl
🏗️ 核心组件功能说明
- containerd:容器运行时,Kubernetes运行Pod的基础环境
- kubelet:Kubernetes节点代理,负责管理Pod和容器
- kubeadm:集群管理工具
- kubectl:Kubernetes命令行客户端
🌐 网络与插件配置
- CNI网络插件:Calico(使用tigera-operator管理)
- kube-proxy模式:IPVS
- Pod网段(podSubnet):10.244.0.0/16 ✅
- Service网段:10.96.0.0/12
- Ingress控制器:ingress-nginx
📊 附加服务部署(可选)
- Kubernetes仪表板:Dashboard(需要单独部署和配置访问)
💡 部署建议
按照以下步骤执行部署:
- 所有操作需在管理员权限下完成(root 或 sudo 用户)
- 完成系统基础环境配置和内核参数调整
- 严格按照推荐顺序安装各组件:containerd → kubelet → kubeadm → kubectl
- 使用kubeadm初始化集群时指定网络配置参数
- 部署Calico网络插件和ingress-nginx控制器
- 最后部署Dashboard并配置安全的访问方式
一、环境配置清单
📋 硬件配置清单
| 节点类型 | 节点名称 | CPU | 内存 | 存储 | IP |
|---|---|---|---|---|---|
| Master | master-node | i5-12400F | 32GB | 1T SSD | 192.168.2.101 |
| Worker1 | worker-node01 | i7-8750H | 16GB | 116GB SSD | 192.168.2.102 |
| Worker2 | worker-node02 | ARMv8 | 4GB | 128GB SD卡 | 192.168.2.103 |
🔧系统基础环境配置
以下是所有节点(包括 Master 和 Worker)设置主机名的具体操作步骤:
步骤1:临时设置主机名(立即生效)
在每个节点上分别执行以下命令,将 <hostname> 替换为当前节点的主机名(例如 master-node、worker-node01):
hostname <hostname>
示例:
hostname master-node # Master 节点执行 对应IP:192.168.2.101
hostname worker-node01 # Worker 节点执行 对应IP:192.168.2.102
hostname worker-node02 # Worker 节点执行 对应IP:192.168.2.103
步骤2:永久设置主机名(重启后生效)
方法一:修改配置文件(推荐)
- 编辑主机名配置文件:
sudo vi /etc/hostname - 清空文件内容,分别在三台设备上的/etc/hostname中写入新的主机名(例如
master-node/worker-node01/worker-node02),保存退出。
方法二:使用命令(部分系统支持)
sudo hostnamectl set-hostname <hostname>
示例:
# 在 192.168.2.101 所在设备上执行
sudo hostnamectl set-hostname master-node
# 在 192.168.2.102 所在设备上执行
sudo hostnamectl set-hostname worker-node01
# 在 192.168.2.103 所在设备上执行
sudo hostnamectl set-hostname worker-node02
步骤3:同步修改 hosts 文件
在每个节点的 /etc/hosts 中添加所有节点的主机名与 IP 映射:
sudo vi /etc/hosts
添加内容示例:
192.168.2.101 master-node
192.168.2.102 worker-node01
192.168.2.103 worker-node02
步骤4:验证配置
执行以下命令检查主机名是否生效:
hostname # 查看当前主机名
hostnamectl # 查看永久主机名状态
cat /etc/hostname # 检查配置文件
步骤5:关闭 Swap 交换分区
核心指令模块:
# 临时关闭当前所有Swap分区
sudo swapoff -a
# 永久禁用Swap - 注释掉fstab中所有swap相关行
sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# 验证Swap状态(应该显示为空)
free -h
sudo swapon --show
配置说明:
swapoff -a:立即停用所有swap设备,效果立即可见sed命令:在/etc/fstab中注释掉包含"swap"的行,确保重启后仍生效- Kubernetes要求关闭Swap是为了保证内存管理的准确性和稳定性
步骤6:加载内核模块(IPVS + 桥接)
临时加载模块(立即生效)
# 加载网络桥接相关模块
sudo modprobe br_netfilter
sudo modprobe bridge
# 加载IPVS负载均衡模块
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack
# 加载OverlayFS模块(容器存储必需)
sudo modprobe overlay
# 验证模块加载状态
lsmod | grep -E 'br_netfilter|bridge|ip_vs|nf_conntrack|overlay'
持久化配置模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
overlay
bridge
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
sudo systemctl restart systemd-modules-load
核心模块功能说明
-
br_netfilter:启用桥接网络的数据包过滤,确保iptables规则能正确管理桥接流量 -
ip_vs:IPVS核心模块,提供负载均衡功能 -
ip_vs_rr/ip_vs_wrr/ip_vs_sh:IPVS调度算法(轮询/加权轮询/源地址哈希) -
nf_conntrack:网络连接跟踪,用于NAT和状态防火墙
步骤7:网络参数配置
配置目的:设置系统网络参数,确保 Kubernetes 网络正常工作
核心配置内容
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
参数功能说明
net.bridge.bridge-nf-call-ip6tables = 1
- 启用 IPv6 桥接流量的 iptables 过滤
- 确保桥接的 IPv6 流量能够被 iptables 规则正确处理
net.bridge.bridge-nf-call-iptables = 1
- 启用 IPv4 桥接流量的 iptables 过滤
- 允许 iptables 对通过网桥的数据包进行过滤和转发
net.ipv4.ip_forward = 1
- 启用 IPv4 路由转发功能
- 这是 Pod 跨节点通信的基础要求
配置应用命令
sudo sysctl --system
该命令作用:
- 重新加载所有 sysctl 配置文件
- 使
/etc/sysctl.d/k8s.conf中的参数立即生效 - 确保系统重启后配置仍然保持
验证配置生效
# 检查关键参数是否已正确设置
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.bridge.bridge-nf-call-ip6tables
sysctl net.ipv4.ip_forward
预期输出:
net.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward = 1
这些网络参数配置对于 Kubernetes 集群的正常运行至关重要,它们确保了容器网络能够正确地进行路由转发和流量过滤。
💡注意事项
- 操作需在每个节点单独执行
- 主机名需全局唯一且不含特殊字符(建议使用小写字母、数字和连字符)
- 修改后建议重启节点:
sudo reboot
通过以上步骤,所有节点的主机名将被正确配置,为后续集群部署奠定基础。
二、容器运行时选型:containerd
在Kubernetes 1.24+版本中,containerd作为轻量级容器运行时具备显著优势:
- 性能优势:相比Docker更少的抽象层,内存占用降低40%
- 稳定性:通过CRI标准接口直接对接kubelet
- 项目适配:更适合GPU设备直通场景
🔧安装步骤
步骤1:系统准备工作
# 更新系统包列表
sudo apt update && sudo apt upgrade -y
# 安装基础依赖
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
# 加载必要的内核模块
sudo modprobe overlay
sudo modprobe br_netfilter
步骤2:添加Docker仓库(使用国内镜像源)
# 备份原有的docker.list(如果存在)
sudo mv /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.list.bak 2>/dev/null || true
# 1. 下载 GPG 密钥(使用备用方法)
wget -O- https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 2. 添加仓库(明确指定架构)
echo "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/docker.list
步骤3:安装containerd
# 更新软件包列表并安装containerd
sudo apt update && sudo apt install -y containerd.io
步骤4:配置containerd
生成默认配置
# 生成默认配置(如果不存在)
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
关键配置修改
编辑 /etc/containerd/config.toml,确保以下关键配置:
# 编辑修改配置文件:
vim /etc/containerd/config.toml
找到以下部分进行修改
推荐使用systemd作为cgroup驱动
# 重要性:Kubernetes v1.22+ 推荐使用systemd作为cgroup驱动,与kubelet保持一致,避免资源管理冲突
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
重载沙箱(pause)镜像
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10.1"
步骤5:配置国内镜像加速
在 containerd 配置文件中,config_path 参数用于指定镜像仓库证书和配置文件的搜索路径。
- 使用冒号
:分隔多个路径(Linux/Unix 系统) - containerd 会按顺序在这些路径中查找镜像仓库配置
# 编辑修改配置文件:
vim /etc/containerd/config.toml
# 找到指定镜像仓库证书和配置文件的搜索路径
......
[plugins.'io.containerd.cri.v1.images'.registry]
config_path = '/var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d:/etc/containerd/certs.d:/etc/docker/certs.d'
......
目录结构要求
确保配置文件放置在正确位置:
/var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/
├── docker.io/
│ └── hosts.toml
├── registry.k8s.io/
│ └── hosts.toml
└── k8s.gcr.io/
└── hosts.toml
配置 Kubernetes 相关的镜像仓库设置代理服务器,解决在国内环境访问
# 1. 创建正确的目录结构
sudo mkdir -p /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/registry.k8s.io
sudo mkdir -p /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/docker.io
sudo mkdir -p /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/k8s.gcr.io
# 2. 修正 hosts.toml 文件内容
# Kubernetes 官方镜像仓库
sudo tee /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/registry.k8s.io/hosts.toml << 'EOF'
server = "https://registry.k8s.io"
[host."https://registry.aliyuncs.com"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
# Docker Hub 镜像仓库
sudo tee /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/docker.io/hosts.toml << 'EOF'
server = "https://docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
# Google 容器镜像仓库
sudo tee /var/lib/containerd/io.containerd.content.v1.content/plugins/certs.d/k8s.gcr.io/hosts.toml << 'EOF'
server = "https://k8s.gcr.io"
[host."https://registry.aliyuncs.com"]
capabilities = ["pull", "resolve"]
override_path = true
EOF
步骤6:重启并启用containerd服务
单独配置以上每个步骤都需要重启 containerd:
sudo systemctl restart containerd
sudo systemctl enable containerd
步骤7:验证安装
# 检查服务状态
sudo systemctl status containerd
# 检查containerd版本
containerd --version
# 测试基本功能
sudo ctr images pull docker.io/library/hello-world:latest
sudo ctr images list
提前拉取pause镜像(可选)
# 使用crictl拉取(自动进入k8s.io命名空间)
crictl pull registry.aliyuncs.com/google_containers/pause:3.10
# 打标签为官方名称
ctr -n k8s.io images tag \
registry.aliyuncs.com/google_containers/pause:3.10 \
registry.k8s.io/pause:3.10
# 加个label防止被误删
ctr -n k8s.io images label registry.k8s.io/pause:3.10 keep=true
注意:ctr -n k8s.io中的k8s.io是Kubernetes使用的containerd命名空间,必须指定。
配置说明
SystemdCgroup:启用systemd cgroup驱动
镜像加速:解决国内访问registry.k8s.io和k8s.gcr.io网络问题
镜像预拉取:避免kubeadm初始化时因镜像拉取失败而卡住
完成以上步骤后,containerd容器运行时已成功安装并配置完成,可以继续进行Kubernetes其他组件的安装。
三、安装 kubeadm、kubelet、kubectl(所有节点)
安装 Kubernetes 核心工具。
步骤1:添加 Kubernetes v1.34 仓库
# 使用阿里云Docker镜像源
sudo mkdir -p /etc/apt/keyrings
# 添加 GPG 密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker-archive-keyring.gpg
# 添加 APT 源
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新软件包列表
sudo apt update
步骤2:安装组件
# 安装 ipvsadm(用于验证 IPVS)
sudo apt install -y ipvsadm
# 安装 kubeadm, kubelet, kubectl
sudo apt install -y kubelet kubeadm kubectl
# 锁定版本,防止意外升级
sudo apt-mark hold kubelet kubeadm kubectl
# 启用并启动 kubelet(此时会因缺少配置而报错,正常)
sudo systemctl enable --now kubelet
四、初始化 Master 节点
主节点直接初始化(不推荐)
$ sudo kubeadm init --control-plane-endpoint=master-ip:6443 \
--pod-network-cidr=192.168.0.0/16 \
--cri-socket=unix:///var/run/containerd/containerd.sock
使用kubeadm配置文件初始化主节点(推荐)
🔧初始化步骤
步骤1:创建kubeadm配置文件
方法1:查看默认配置模板
kubeadm config print init-defaults > kubeadm-config.yaml
方法2:从运行中集群导出配置
kubeadm config view > kubeadm-config.yaml
添加配置:
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: "192.168.2.101"
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
imagePullSerial: true
name: "master-node"
taints: null
timeouts:
controlPlaneComponentHealthCheck: 4m0s
discovery: 5m0s
etcdAPICall: 2m0s
kubeletHealthCheck: 4m0s
kubernetesAPICall: 1m0s
tlsBootstrap: 5m0s
upgradeManifests: 5m0s
---
apiServer: {}
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:
local:
dataDir: /var/lib/etcd
kind: ClusterConfiguration
kubernetesVersion: 1.34.2
imageRepository: "registry.aliyuncs.com/google_containers" # 关键配置:使用国内镜像源
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: "10.244.0.0/16"
proxy: {}
scheduler: {}
其他配置(可选但推荐)
配置 crictl 工具,方便调试。
cat <<EOF | sudo tee /etc/crictl.yaml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 2
debug: false
EOF
步骤2:初始化集群
# 可选:清理旧环境(重新初始化时使用)
sudo kubeadm reset -f
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/etcd
# 执行初始化
kubeadm init --config kubeadm-config.yaml --v=5
成功大概会返回以下信息
Your Kubernetes control-plane has initialized successfully!
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 master-ip:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
步骤3:配置 kubectl
普通用户配置
# 创建.kube目录
mkdir -p $HOME/.kube
# 复制管理员配置文件
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 设置正确的文件权限
sudo chown $(id -u):$(id -g) $HOME/.kube/config
root用户配置
# 直接设置环境变量
export KUBECONFIG=/etc/kubernetes/admin.conf
五、Calico网络部署
选用tigera-operator的优势:
- 策略管理:支持NetworkPolicy细粒度控制
- 性能优化:IPIP模式降低跨节点延迟
- 混合架构:完整支持ARM64节点
🔧安装步骤
步骤1:下载tigera-operator.yaml、custom-resources.yaml
# 下载 tigera-operator.yaml
wget -O tigera-operator.yaml https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/tigera-operator.yaml
# 下载 custom-resources.yaml
wget -O custom-resources.yaml https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/custom-resources.yaml
步骤2:修改custom-resources.yaml信息
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
calicoNetwork:
ipPools:
- blockSize: 26
cidr: 10.244.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()
nodeAddressAutodetectionV4:
interface: "enp3s0"
使用建议
初次安装时:
# Operator 只需创建一次
kubectl create -f tigera-operator.yaml
# 配置可以随时更新
kubectl apply -f custom-resources.yaml
后续更新时:
# 如果修改了 operator 配置,需要先删除再创建
kubectl delete -f tigera-operator.yaml
kubectl create -f tigera-operator.yaml
# 配置更新直接使用 apply
kubectl apply -f custom-resources.yaml
💡 实用建议:在日常工作中,对于需要频繁更新的配置类资源优先使用 apply,对于一次性安装的基础组件使用 create,这样既能保证安全性又方便后续维护。
步骤3:验证calico是否就绪
watch kubectl get pods -n calico-system -l k8s-app=calico-node
# 或 使用crictl ps 检查cni 容器中所有运行的组件
crictl ps
# 或 使用crictl ps -a 检查连同没运行的组件的所有列表
crlctl ps -a
指令:crictl ps 返回的结果应该会是:

步骤4、工作节点加入集群
如果前面初始化之后,忘记保存join命令,可以重新生成一个
生成join命令:
kubeadm token create --print-join-command
工作节点加入:
# sudo kubeadm join master-ip:6443 --token <token> \
# --discovery-token-ca-cert-hash sha256:<hash>
# 例如:
# kubeadm join 192.168.2.101:6443 --token l32ga7.zxs4v1nyd0s2y36k \
# --discovery-token-ca-cert-hash \
# sha256:8efe56c36985cb4899d57c4124bf49e4ecc134209e71b17ede8985b2966cec5d
验证节点:
# 获取节点列表
kubectl get nodes
返回
NAME STATUS ROLES AGE VERSION
master-node Ready control-plane 3h v1.34.2
worker-node01 Ready <none> 3h v1.34.2
worker-node02 Ready <none> 3h v1.34.2
六、Ingress-Nginx部署
为 Kubernetes 集群部署 Ingress-Nginx,提供外部 HTTP(S) 访问能力,并确保整个部署过程安全可靠。
🔧安装步骤
步骤1:下载Ingress-Nginx Controller文件
# 下载 Ingress-Nginx Controller 文件
wget -O Ingress-Nginx-deploy.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.0/deploy/static/provider/cloud/deploy.yaml
步骤2:部署 Ingress-Nginx Controller
部署 Ingress-Nginx Controller
kubectl apply -f Ingress-Nginx-deploy.yaml
步骤3:检查部署状态
# 检查部署状态
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
成功预计会返回以下
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-gqmmh 0/1 Completed 0 74m
ingress-nginx-admission-patch-djj5j 0/1 Completed 0 74m
ingress-nginx-controller-7d5845d948-wzlrq 1/1 Running 0 74m
# 如需 NodePort 方式暴露(适合测试环境)
kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec":{"type":"NodePort"}}'
📊 部署验证步骤
1. 验证 IPVS 负载均衡
sudo ipvsadm -ln
# 正常应显示大量 Kubernetes service 的 IPVS 规则:ml-citation{ref="1" data="citationList"}
2. 检查 Pod 网络分配
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'
# 输出应类似:10.244.1.0/24 10.244.2.0/24 ...:ml-citation{ref="2" data="citationList"}
3. 创建测试 Pod 验证网络
kubectl run testpod --image=nginx:alpine --restart=Never
kubectl get pod testpod -o wide
# IP 地址应属于 10.244.x.x 范围,表明 Pod 网络正常工作:ml-citation{ref="3" data="citationList"}
🔧 完整测试应用部署
以下是完整的 Nginx 演示应用部署配置,包含 Deployment、Service 和 Ingress:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx-demo
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: nginx.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
🌐 访问配置
本地 hosts 文件配置:
192.168.2.101 nginx.local
部署完成后,访问 http://nginx.local 即可看到 Nginx 欢迎页面,证明 Ingress 配置成功。
⚠️ 常见问题排查
Pod CIDR not assigned:检查 Calico 运行状态,确认 podSubnet 与 CALICO_IPV4POOL_CIDR 匹配
IPVS not working:检查 ip_vs、br_netfilter 内核模块,确认 kube-proxy ConfigMap 中 mode 设置为 ipvs
ImagePullBackOff:使用国内镜像仓库提前拉取镜像
NodeNotReady:检查 kubelet、containerd、CNI 插件日志
七、部署Dashboard
部署和访问 Kubernetes 仪表板(Dashboard)
Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment、Job、DaemonSet 等等)。 例如,你可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。
🔧安装步骤
步骤1:部署 Dashboard
执行以下命令安装最新稳定版 Dashboard:
# 下载 dashboard yaml文件
wget -O recommended.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# kubectl 应用recommended.yaml
kubectl apply -f recommended.yaml
步骤2:访问令牌类型与创建
Service Account 令牌创建
# 创建 Service Account:
kubectl -n kubernetes-dashboard create serviceaccount dashboard-admin
为 Service Account 授权:
kubectl create clusterrolebinding dashboard-admin-binding \
--clusterrole=cluster-admin \
--serviceaccount=kubernetes-dashboard:dashboard-admin
获取令牌:
kubectl -n kubernetes-dashboard create token dashboard-admin
执行上述命令序列后,会输出一个长字符串的令牌

步骤3:访问 Dashboard
方案一:端口转发(临时访问)
kubectl port-forward -n kubernetes-dashboard svc/kubernetes-dashboard 8080:443
访问:https://localhost:8080

方案二:NodePort 暴露(生产慎用)
修改 Service 类型:
kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}'
获取端口号:
kubectl get svc -n kubernetes-dashboard
返回:

访问:https://<节点IP>:<端口>,如:https://10.103.153.59:443

步骤4:登录 Dashboard
在登录界面选择 Token 方式,粘贴步骤2 获取的 Token。

💡注意事项
-
安全建议:
- 生产环境应配置 Ingress + HTTPS
- 限制访问 IP 范围
- 定期轮换 Token
-
版本兼容: Dashboard 版本需与 Kubernetes 版本匹配,可通过以下命令检查:
kubectl get pods -n kubernetes-dashboard -o jsonpath="{.items[0].metadata.labels.version}"
验证部署
kubectl get pods -n kubernetes-dashboard
正常状态应显示:
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-5ffb7d645f-vtjq7 1/1 Running 0 26m
kubernetes-dashboard-6c7b75ffc-7spw4 1/1 Running 0 26m
八、故障排查案例
1、在 kubeadm init 时几乎肯定会遇到 10.96.0.1:443 连接失败的问题,这会导致整个集群初始化失败。
Warning FailedCreatePodSandBox 13s (x1747 over 6h18m)
kubelet (combined from similar events):
Failed to create pod sandbox:
rpc error:
code = Unknown desc = failed to setup network for sandbox "a5857dffc00334d3df387d49aeb57d6ea8f0c889a6dcf91c840e67a0fa165ffa":
plugin type="calico" failed (add):
error getting ClusterInformation:
Get "https://10.96.0.1:443/apis/crd.projectcalico.org/v1/clusterinformations/default":
tls: failed to verify certificate: x509:
certificate signed by unknown authority (possibly because of
"crypto/rsa: verification error"
while trying to verify candidate authority certificate "kubernetes")
🔍 问题根源分析
10.96.0.1:443 是什么?
这是 Kubernetes API Server 的 ClusterIP 服务地址
默认的 Service CIDR 范围是 10.96.0.0/12
443 端口是 API Server 的安全通信端口
br_netfilter - 确保 iptables 能够正确管理桥接网络流量
IPVS 系列模块 - 提供负载均衡功能(替代 kube-proxy 的 iptables 模式)
nf_conntrack - 跟踪网络连接状态,支持 NAT
⚠️ 具体故障表现
如果没有这些模块,您可能会遇到:
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused
或者直接显示 API Server 无法启动,无法连接到 10.96.0.1:443。
2、节点处于NotReady状态
具体表现为:
-
Calico节点异常:
calico-node-4r7qp处于CrashLoopBackOff状态(已重启49次)calico-node-v6djb卡在Init:0/2状态csi-node-driverPod卡在ContainerCreating状态
-
CNI配置缺失:
/etc/cni/net.d/目录下只有.kubernetes-cni-keep文件,缺少Calio配置文件
-
网络插件依赖:
- Calico需要正确配置才能管理节点网络
- worker-node02缺少关键CNI配置文件
典型的CNI网络插件配置缺失问题。
🔍 问题诊断
核心问题:/etc/cni/net.d/目录中缺少必要的CNI配置文件,导致Calico网络插件无法正常初始化。
🚨 当前状态分析
正常运行组件:
- ✅ master-node(控制平面)
- ✅ worker-node01(工作节点)
- ✅ CoreDNS(服务发现)
- ✅ etcd、API Server等控制平面组件
异常状态组件:
- ❌ worker-node02 - NotReady
- ❌ calico-node-4r7qp - CrashLoopBackOff(已重启49次)
- ❌ calico-node-v6djb - Init:0/2(初始化卡住)
- ❌ kube-proxy-5lzrw - ContainerCreating
- ❌ csi-node-driver-hbh8p/rxgmm - ContainerCreating
🔧 解决方案
立即修复步骤:
1. 检查master节点的正确配置
# 在master节点查看CNI配置
ls -la /etc/cni/net.d/
cat /etc/cni/net.d/10-calico.conflist # 如果存在
2. 复制配置文件到worker-node02
# 从master节点复制到worker-node02
scp /etc/cni/net.d/* root@192.168.2.103:/etc/cni/net.d/
3. 重启相关服务
# 在worker-node02节点执行
systemctl restart containerd
systemctl restart kubelet
如果master节点也缺少配置:
重新部署Calico网络插件:
# 在master节点执行
kubectl delete -f custom-resources.yaml
kubectl delete -f tigera-operator.yaml
kubectl apply -f tigera-operator.yaml
kubectl apply -f custom-resources.yaml
💡 验证修复效果
修复完成后,执行以下验证:
检查节点状态:
kubectl get nodes
查看Calico Pods状态:
kubectl get pods -n calico-system
返回
NAME STATUS ROLES AGE VERSION
master-node Ready control-plane 4h26m v1.34.2
worker-node01 Ready <none> 4h14m v1.34.2
worker-node02 Ready <none> 4h14m v1.34.2
🎯 Kubernetes 集群异构搭建总结
📋 部署核心要点回顾
环境配置基础:成功部署 Kubernetes 集群始于正确的基础环境配置,包括主机名设置、Swap 关闭、内核模块加载和网络参数调优,这是集群稳定运行的基石。
容器运行时选择:containerd 作为推荐的容器运行时,其轻量级特性和稳定性为集群提供了可靠的容器管理能力。
核心组件协同:kubeadm、kubelet、kubectl 三者的完美配合构成了集群的管理核心,其中 kubeadm 的配置文件方式提供了最大的灵活性和可控性。
🌐 网络与插件部署精髓
Calico 网络部署:Tigera Operator 使用 create 确保一次性安装,而 Custom Resources 使用 apply 支持后续配置更新,这种设计体现了 Kubernetes 声明式管理的精髓。
Ingress-Nginx 控制器:从之前遇到的 ContainerCreating 状态经验来看,Ingress-Nginx 的正常启动需要耐心等待镜像拉取和容器初始化,这是集群网络流量的重要入口。
🔧 实践经验与故障排查
Dashboard 访问安全:Dashboard 的部署不仅要关注功能实现,更要重视安全配置,通过 ServiceAccount 和 ClusterRoleBinding 实现最小权限原则。
常见故障应对:
- kubeadm init 连接失败:通常是网络配置或防火墙问题
- 节点 NotReady 状态:多与容器运行时或网络插件配置相关
💡 关键部署建议
- 分阶段验证:每完成一个部署阶段都要进行验证,确保各组件正常运行
- 日志监控:充分利用
kubectl logs和kubectl describe进行问题诊断
- 资源预留:为系统组件预留足够的 CPU 和内存资源
- 备份策略:定期备份 etcd 数据和关键配置文件
🚀 从部署到生产
记住你之前在实践中积累的经验:耐心等待组件启动、理解命令的适用场景、重视配置的持久化。这些经验将使你的 Kubernetes 集群从"能用"升级到"好用"。
Kubernetes 集群部署是一个系统工程,每个环节都环环相扣。遵循本文的步骤,结合你的实践经验,你将能够构建出稳定、高效的容器化平台。

122

被折叠的 条评论
为什么被折叠?



