全部笔记All notes

Kubernetes 多节点集群部署完整指南

阅读 15m 50s15m 50s read

概述

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-master10.211.55.20控制平面CentOS 8
k8s-node110.211.55.21工作节点CentOS 8
k8s-node210.211.55.22工作节点CentOS 8

软件版本

组件版本说明
Kubernetes1.28.x最新稳定版
Docker20.10.x容器运行时
containerd1.6.x备选容器运行时
CNIFlannel/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 部署系列

容器基础技术

总结

本指南详细介绍了使用 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、负载均衡
  • 监控告警: 完整的监控体系