概述
Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。本指南将详细介绍如何使用 kubeadm 工具部署一个生产级的多节点 Kubernetes 集群。
核心优势
- 自动化编排:自动管理容器的生命周期
- 弹性伸缩:根据负载自动调整资源
- 服务发现:内置服务发现和负载均衡
- 自我修复:自动重启失败的容器
架构组件
| 组件 | 类型 | 功能 | 运行位置 |
|---|---|---|---|
| kube-apiserver | 控制平面 | API 服务器 | Master 节点 |
| etcd | 控制平面 | 分布式键值存储 | Master 节点 |
| kube-scheduler | 控制平面 | 调度器 | Master 节点 |
| kube-controller-manager | 控制平面 | 控制器管理器 | Master 节点 |
| kubelet | 节点组件 | 节点代理 | 所有节点 |
| kube-proxy | 节点组件 | 网络代理 | 所有节点 |
💡 提示: 本指南适用于 CentOS 7/8、RHEL 7/8、Ubuntu 18.04+ 等主流 Linux 发行版。
环境准备
硬件要求
Master 节点(控制平面):
- CPU: 2 核心以上
- 内存: 2GB 以上(推荐 4GB)
- 存储: 20GB 以上
Worker 节点:
- CPU: 1 核心以上
- 内存: 1GB 以上(推荐 2GB)
- 存储: 10GB 以上
网络要求
- 节点间网络: 所有节点能够相互通信
- 容器网络: 10.244.0.0/16(可自定义)
- 服务网络: 10.96.0.0/12(可自定义)
- 端口开放: 确保必要端口开放
集群规划
本指南以 3 节点集群为例:
| 主机名 | IP 地址 | 角色 | 系统 |
|---|---|---|---|
| k8s-master | 10.211.55.20 | 控制平面 | CentOS 8 |
| k8s-node1 | 10.211.55.21 | 工作节点 | CentOS 8 |
| k8s-node2 | 10.211.55.22 | 工作节点 | CentOS 8 |
软件版本
| 组件 | 版本 | 说明 |
|---|---|---|
| Kubernetes | 1.28.x | 最新稳定版 |
| Docker | 20.10.x | 容器运行时 |
| containerd | 1.6.x | 备选容器运行时 |
| CNI | Flannel/Calico | 网络插件 |
系统配置
1. 配置主机名和 hosts
在所有节点执行以下操作:
设置主机名
# Master 节点
sudo hostnamectl set-hostname k8s-master
# Worker 节点 1
sudo hostnamectl set-hostname k8s-node1
# Worker 节点 2
sudo hostnamectl set-hostname k8s-node2
# 验证主机名
hostname
配置 hosts 文件
# 在所有节点编辑 hosts 文件
sudo vim /etc/hosts
# 添加以下内容
10.211.55.20 k8s-master
10.211.55.21 k8s-node1
10.211.55.22 k8s-node2
验证网络连通性
# 在所有节点测试网络连通性
ping -c 3 k8s-master
ping -c 3 k8s-node1
ping -c 3 k8s-node2
2. 时间同步
# CentOS 7/8 安装 chrony
sudo yum install -y chrony
# Ubuntu 安装 chrony
sudo apt update && sudo apt install -y chrony
# 启动并启用 chrony 服务
sudo systemctl start chronyd
sudo systemctl enable chronyd
# 强制同步时间
sudo chronyc makestep
# 验证时间同步
timedatectl status
3. 关闭防火墙和 SELinux
# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 关闭 SELinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 验证 SELinux 状态
getenforce
4. 关闭交换分区
# 临时关闭交换分区
sudo swapoff -a
# 永久关闭交换分区
sudo sed -i 's/.*swap.*/#&/' /etc/fstab
# 验证交换分区状态
free -h
5. 内核参数配置
# 创建内核参数配置文件
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
# 加载模块
sudo modprobe overlay
sudo modprobe br_netfilter
# 配置内核参数
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用内核参数
sudo sysctl --system
# 验证配置
lsmod | grep br_netfilter
lsmod | grep overlay
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
容器运行时安装
方案一:安装 Docker
1. 安装 Docker
# CentOS 安装 Docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
# Ubuntu 安装 Docker
sudo apt update
sudo apt install -y apt-transport-https 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=amd64 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 docker-ce docker-ce-cli containerd.io
2. 配置 Docker
# 创建 Docker 配置目录
sudo mkdir -p /etc/docker
# 配置 Docker daemon
sudo tee /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"registry-mirrors": [
"https://docker.1panel.live"
]
}
EOF
# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
# 验证 Docker 安装
docker --version
sudo docker run hello-world
方案二:安装 containerd(推荐)
# 安装 containerd
sudo yum install -y containerd.io
# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 配置 systemd 作为 cgroup 驱动
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 国内网络把 pause 镜像换成阿里云地址
sudo sed -i 's#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
# 确认 disabled_plugins 中没有 "cri",否则 kubelet 无法连接 containerd
grep disabled_plugins /etc/containerd/config.toml
# 重启 containerd 服务
sudo systemctl restart containerd
sudo systemctl enable containerd
# 验证 containerd 安装
sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock version
Kubernetes 组件安装
1. 添加 Kubernetes 软件源
# CentOS/RHEL 添加 Kubernetes 源
sudo tee /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# Ubuntu/Debian 添加 Kubernetes 源
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
2. 安装 kubeadm、kubelet 和 kubectl
# CentOS/RHEL 安装
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# Ubuntu/Debian 安装
sudo apt install -y kubelet kubeadm kubectl
# 锁定版本(防止意外升级)
sudo yum versionlock kubelet kubeadm kubectl # CentOS
sudo apt-mark hold kubelet kubeadm kubectl # Ubuntu
# 启用 kubelet 服务
sudo systemctl enable kubelet
3. 验证安装
# 检查版本
kubeadm version
kubelet --version
kubectl version --client
# 检查 kubelet 状态(暂时可能失败,初始化后正常)
sudo systemctl status kubelet
集群初始化
1. 在 Master 节点初始化集群
# 使用 kubeadm 初始化集群
sudo kubeadm init \
--apiserver-advertise-address=10.211.55.20 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
# 如果初始化失败,可以重置后重试
# sudo kubeadm reset
# sudo rm -rf /etc/cni/net.d
2. 配置 kubectl
# 为普通用户配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 验证集群状态
kubectl cluster-info
kubectl get nodes
kubectl get pods -A
3. 保存加入集群的命令
初始化完成后,会输出类似以下的命令,请保存用于 Worker 节点加入集群:
# 示例加入命令(实际命令以初始化输出为准)
kubeadm join 10.211.55.20:6443 --token abcdef.1234567890abcdef \
--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
网络插件部署
方案一:部署 Flannel(推荐)
# 下载 Flannel 配置文件
curl -O https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 部署 Flannel
kubectl apply -f kube-flannel.yml
# 验证 Flannel 部署
kubectl get pods -n kube-flannel
kubectl get daemonset -n kube-flannel
方案二:部署 Calico
# 下载 Calico 配置文件
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
# 部署 Tigera Operator
kubectl create -f tigera-operator.yaml
# 修改 custom-resources.yaml 中的 CIDR(如果需要)
sed -i 's/192.168.0.0\/16/10.244.0.0\/16/g' custom-resources.yaml
# 部署 Calico
kubectl create -f custom-resources.yaml
# 验证 Calico 部署
kubectl get pods -n calico-system
多网卡时指定 Calico 使用的网卡
节点有多块网卡时,Calico 可能选错网卡,导致跨节点 Pod 不通。使用 Operator 部署时在 custom-resources.yaml 的 calicoNetwork 下指定:
spec:
calicoNetwork:
nodeAddressAutodetectionV4:
interface: ens33 # 通过 ip addr 查询网卡名
如果用的是单文件 calico.yaml 部署,则在 calico-node 容器的环境变量 CLUSTER_TYPE 下方加入:
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33"
Calico 与 Kubernetes 的版本对应关系见 Calico 官方要求,旧版本文档在 归档页。
验证网络插件
# 等待所有 Pod 运行
kubectl get pods -A -w
# 检查节点状态
kubectl get nodes
# 查看网络接口
ip addr show flannel.1 # Flannel
ip addr show cali0 # Calico
持久化存储
为集群启用默认 StorageClass 以支持 PVC 动态供给。开发/测试环境可使用 Local Path Provisioner;生产建议使用 Rook-Ceph、Longhorn 等分布式存储。
方案一:Local Path Provisioner(开发/测试)
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
# 将其设置为默认 StorageClass(如未默认)
kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
验证 PVC:
# pvc-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-demo
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 2Gi
kubectl apply -f pvc-demo.yaml
kubectl get pvc pvc-demo
方案二:Rook-Ceph(生产)
- 使用 Operator/Helm 部署 Rook 与 CephCluster,提供块存储
- 创建
CephBlockPool与StorageClass,并设置默认 SC - 参考 rook/rook 官方 quickstart 与 cluster 示例
节点加入集群
1. 在 Worker 节点执行加入命令
# 在 k8s-node1 和 k8s-node2 上执行
# 使用保存的加入命令
sudo kubeadm join 10.211.55.20:6443 --token abcdef.1234567890abcdef \
--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
# 如果 token 过期,可以在 Master 节点生成新的
# kubeadm token create --print-join-command
2. 验证节点加入
在 Master 节点执行:
# 查看节点状态
kubectl get nodes
# 查看节点详细信息
kubectl get nodes -o wide
# 等待所有节点状态变为 Ready
watch kubectl get nodes
3. 为节点添加标签
# 为 Worker 节点添加标签
kubectl label node k8s-node1 node-role.kubernetes.io/worker=worker
kubectl label node k8s-node2 node-role.kubernetes.io/worker=worker
# 验证标签
kubectl get nodes --show-labels
集群验证
1. 检查集群状态
# 查看集群信息
kubectl cluster-info
# 查看所有节点
kubectl get nodes -o wide
# 查看系统 Pod 状态
kubectl get pods -A
# 查看集群事件
kubectl get events -A --sort-by=.metadata.creationTimestamp
2. 部署测试应用
# 创建测试命名空间
kubectl create namespace test
# 部署 nginx 测试应用
kubectl create deployment nginx --image=nginx --replicas=3 -n test
# 暴露服务
kubectl expose deployment nginx --port=80 --type=NodePort -n test
# 查看部署状态
kubectl get pods -n test -o wide
kubectl get svc -n test
# 测试访问
curl http://10.211.55.21:$(kubectl get svc nginx -n test -o jsonpath='{.spec.ports[0].nodePort}')
3. 验证 DNS
# 创建测试 Pod
kubectl run test-pod --image=busybox --restart=Never --rm -it -- sh
# 在 Pod 内测试 DNS
nslookup kubernetes.default.svc.cluster.local
nslookup nginx.test.svc.cluster.local
应用部署
1. 部署 Dashboard
# 部署 Kubernetes Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 创建管理员用户
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
# 获取访问 token
kubectl -n kubernetes-dashboard create token admin-user
# 启动代理访问
kubectl proxy --address='0.0.0.0' --port=8001 --accept-hosts='^.*$'
访问地址:http://master-ip:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
2. 部署 Ingress Controller
# 部署 Nginx Ingress Controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
# 等待部署完成
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=120s
# 查看 Ingress Controller 状态
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
集群管理
1. 集群扩容
# 在新节点上重复系统配置和组件安装步骤
# 然后在 Master 节点生成加入命令
kubeadm token create --print-join-command
# 在新节点执行加入命令
sudo kubeadm join ...
# 为新节点添加标签
kubectl label node new-node node-role.kubernetes.io/worker=worker
2. 节点维护
# 标记节点为不可调度
kubectl cordon k8s-node1
# 驱逐节点上的 Pod
kubectl drain k8s-node1 --ignore-daemonsets --delete-emptydir-data
# 维护完成后恢复调度
kubectl uncordon k8s-node1
3. 集群升级
# 查看可升级版本
kubeadm upgrade plan
# 升级集群组件(在 Master 节点)
sudo kubeadm upgrade apply v1.28.3
# 升级 kubelet(在所有节点)
sudo yum update -y kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
监控配置
1. 部署 Metrics Server
# 部署 Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 如果遇到 TLS 问题,需要修改配置
kubectl patch deployment metrics-server -n kube-system --type='json' -p='[
{
"op": "add",
"path": "/spec/template/spec/containers/0/args/-",
"value": "--kubelet-insecure-tls"
}
]'
# 验证 Metrics Server
kubectl get pods -n kube-system -l k8s-app=metrics-server
kubectl top nodes
kubectl top pods -A
2. 部署 Prometheus
# 克隆 kube-prometheus 项目
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
# 部署 Prometheus Operator
kubectl create -f manifests/setup
kubectl wait \
--for condition=Established \
--all CustomResourceDefinition \
--namespace=monitoring
# 部署监控组件
kubectl create -f manifests/
# 验证部署
kubectl get pods -n monitoring
3. 访问监控界面
# 端口转发访问 Prometheus
kubectl port-forward -n monitoring svc/prometheus-k8s 9090:9090 --address='0.0.0.0'
# 端口转发访问 Grafana
kubectl port-forward -n monitoring svc/grafana 3000:3000 --address='0.0.0.0'
- Prometheus:
http://master-ip:9090 - Grafana:
http://master-ip:3000(admin/admin)
故障排除
1. 常见问题排查
节点 NotReady
# 查看节点状态详情
kubectl describe node k8s-node1
# 检查 kubelet 日志
sudo journalctl -u kubelet -f
# 检查网络插件状态
kubectl get pods -n kube-flannel
kubectl logs -n kube-flannel daemonset/kube-flannel-ds
Pod 无法调度
# 查看 Pod 事件
kubectl describe pod pod-name -n namespace
# 查看节点资源使用
kubectl top nodes
kubectl describe nodes
# 检查污点和容忍度
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
网络连接问题
# 测试 Pod 间网络连通性
kubectl exec -it pod1 -- ping pod2-ip
# 检查 kube-proxy 状态
kubectl get pods -n kube-system -l k8s-app=kube-proxy
kubectl logs -n kube-system -l k8s-app=kube-proxy
# 检查 iptables 规则
sudo iptables -t nat -L
2. 集群重置
# 重置集群配置
sudo kubeadm reset
sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F && sudo iptables -X
sudo rm -rf /etc/cni/net.d
sudo rm -rf $HOME/.kube
# 清理 etcd 数据
sudo rm -rf /var/lib/etcd
3. 日志收集
# 收集集群诊断信息
kubectl cluster-info dump > cluster-dump.txt
# 检查组件日志
sudo journalctl -u kubelet > kubelet.log
kubectl logs -n kube-system kube-apiserver-k8s-master > apiserver.log
kubectl logs -n kube-system kube-scheduler-k8s-master > scheduler.log
最佳实践
1. 安全加固
# 启用 RBAC(默认启用)
kubectl get clusterrolebindings
# 网络策略示例
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
EOF
# 使用 Pod Security Standards
kubectl label namespace default pod-security.kubernetes.io/enforce=restricted
2. 资源管理
# 设置资源限制
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: default
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
EOF
# 设置 LimitRange
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: LimitRange
metadata:
name: cpu-limit-range
namespace: default
spec:
limits:
- default:
cpu: "1"
memory: "512Mi"
defaultRequest:
cpu: "0.5"
memory: "256Mi"
type: Container
EOF
3. 备份策略
# 备份 etcd 数据
sudo ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
# 验证备份
sudo ETCDCTL_API=3 etcdctl snapshot status /backup/etcd-snapshot.db
# 定期备份脚本
cat <<'EOF' > /usr/local/bin/k8s-backup.sh
#!/bin/bash
BACKUP_DIR="/backup/k8s/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 备份 etcd
ETCDCTL_API=3 etcdctl snapshot save $BACKUP_DIR/etcd-snapshot.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
# 备份证书
cp -r /etc/kubernetes/pki $BACKUP_DIR/
# 删除 7 天前的备份
find /backup/k8s -type d -mtime +7 -exec rm -rf {} \;
EOF
chmod +x /usr/local/bin/k8s-backup.sh
常见问题
问题1:kubeadm init 失败
现象: 初始化过程中出现错误
排查步骤:
# 检查系统配置
sudo kubeadm init phase preflight
# 检查容器运行时
sudo systemctl status docker
sudo systemctl status containerd
# 检查网络配置
sudo sysctl net.bridge.bridge-nf-call-iptables
解决方案:
# 重置后重新初始化
sudo kubeadm reset
sudo rm -rf /etc/cni/net.d
sudo kubeadm init --v=5 # 详细日志输出
问题2:节点 NotReady
现象: 节点状态显示 NotReady
排查步骤:
# 检查节点详情
kubectl describe node node-name
# 检查 kubelet 状态
sudo systemctl status kubelet
sudo journalctl -u kubelet -n 50
# 检查网络插件
kubectl get pods -n kube-flannel
解决方案:
# 重启 kubelet
sudo systemctl restart kubelet
# 重新部署网络插件
kubectl delete -f kube-flannel.yml
kubectl apply -f kube-flannel.yml
问题3:Pod 启动失败
现象: Pod 无法正常启动
排查步骤:
# 查看 Pod 状态
kubectl get pods -o wide
kubectl describe pod pod-name
# 检查事件
kubectl get events --sort-by=.metadata.creationTimestamp
# 检查日志
kubectl logs pod-name
解决方案:
# 检查镜像拉取
docker pull image-name
# 检查资源限制
kubectl top nodes
kubectl top pods
# 调整资源配置
kubectl edit deployment deployment-name
问题4:网络连接问题
现象: Pod 间无法通信
排查步骤:
# 测试 Pod 间连通性
kubectl exec -it pod1 -- ping pod2-ip
# 检查网络策略
kubectl get networkpolicies -A
# 检查 kube-proxy
kubectl get pods -n kube-system -l k8s-app=kube-proxy
解决方案:
# 重启网络组件
kubectl delete pods -n kube-flannel -l app=flannel
kubectl delete pods -n kube-system -l k8s-app=kube-proxy
# 检查防火墙规则
sudo iptables -L
sudo firewall-cmd --list-all
问题5:证书过期
现象: API Server 无法访问
排查步骤:
# 检查证书有效期
sudo kubeadm certs check-expiration
# 查看证书详情
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
解决方案:
# 更新证书
sudo kubeadm certs renew all
# 重启控制平面组件
sudo systemctl restart kubelet
⚠️ 注意: 生产环境中,建议设置证书自动更新机制,并定期备份集群数据。
问题6:Worker 节点执行 kubectl 报 localhost:8080 拒绝连接
现象:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
原因: Worker 节点上没有 kubeconfig,kubectl 默认去连本机 8080 端口。
解决方案: 从 Master 节点复制管理员配置:
# 在 Worker 节点执行
mkdir -p $HOME/.kube
scp root@k8s-master:/etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
也可以
export KUBECONFIG=/etc/kubernetes/kubelet.conf临时使用节点自身的凭据,但它只有节点级权限,很多资源查不到。
常用命令
kubectl 命令补全
yum install -y bash-completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
Token 管理
加入集群的 token 默认 24 小时过期:
# 查看现有 token
kubeadm token list
# 创建新 token 并直接输出完整的 join 命令
kubeadm token create --print-join-command
资源查看
# 所有命名空间的 Pod,带节点和 IP 信息
kubectl get pods -A -o wide
# 查看 Pod 详情和事件
kubectl -n <namespace> describe pod <pod>
# 进入 Pod
kubectl -n <namespace> exec -it <pod> -- bash
# 删除 Pod(由控制器管理的会自动重建)
kubectl -n <namespace> delete pod <pod>
# ServiceAccount、PV、PVC、RoleBinding
kubectl get sa -A
kubectl get pv
kubectl get pvc -A
kubectl get rolebinding -A -o wide
相关文章
Kubernetes 部署系列
- 本地部署K8s集群(一键部署) - KubeKey快速部署K8s和KubeSphere
- Centos 9单节点安装K8s、KubeSphere(arm64) - ARM64架构单节点部署指南
容器基础技术
- Docker安装 - Docker容器运行时安装配置
- Docker环境部署 - Docker生产环境部署指南
总结
本指南详细介绍了使用 kubeadm 部署多节点 Kubernetes 集群的完整流程:
🎯 核心步骤
- 环境准备: 硬件配置、网络规划、系统要求
- 系统配置: 主机名、时间同步、内核参数、安全设置
- 组件安装: 容器运行时、kubeadm、kubelet、kubectl
- 集群部署: 初始化、网络插件、节点加入、验证测试
🛠️ 关键技术
- kubeadm: 官方集群部署工具
- containerd/Docker: 容器运行时
- Flannel/Calico: 容器网络插件
- systemd: 服务管理和启动
🔧 运维管理
- 集群监控: Metrics Server、Prometheus
- 应用管理: Dashboard、Ingress Controller
- 故障排除: 日志分析、网络诊断、证书管理
- 备份恢复: etcd 备份、证书备份
🚀 最佳实践
- 安全加固: RBAC、网络策略、Pod Security Standards
- 资源管理: ResourceQuota、LimitRange
- 高可用: 多 Master、负载均衡
- 监控告警: 完整的监控体系