1. Kubernetes初始化问答全解析
刚接触Kubernetes时,最让人头疼的就是集群初始化这个环节。作为容器编排领域的事实标准,Kubernetes的初始化过程涉及众多组件和配置选项,一个参数设置不当就可能导致后续的部署运维工作陷入困境。我结合自己搭建数十个生产级集群的经验,整理了这份初始化专题问答,帮你避开那些教科书上不会写的"坑"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础概念与准备
2.1 为什么需要初始化?
Kubernetes集群初始化本质上是在各个节点上建立控制平面(Control Plane)与工作节点(Worker Node)之间的信任关系,并部署核心组件。这个过程会生成:
- PKI证书体系(用于组件间TLS通信)
- kubeconfig配置文件(集群访问凭证)
- 静态Pod清单(etcd、kube-apiserver等关键组件)
- 核心插件(如CoreDNS、kube-proxy)
注意:初始化过程是不可逆的,一旦执行kubeadm init后,除非彻底重置环境,否则无法重新初始化同一组节点。
2.2 环境准备清单
在运行kubeadm init之前,需要确保所有节点满足以下条件:
-
操作系统要求:
- 禁用swap分区(永久关闭需修改/etc/fstab)
- 确保时钟同步(chrony或ntpd服务)
- 唯一的主机名、MAC地址和product_uuid
-
网络要求:
- 各节点间网络互通(建议关闭防火墙或放行必要端口)
- 每个节点有唯一IP
- 预先规划好Pod和Service的CIDR范围
-
容器运行时:
- 已安装Docker或containerd
- 配置正确的cgroup驱动(与kubelet一致)
3. 初始化参数详解
3.1 核心参数配置
一个典型的初始化命令如下:
bash复制kubeadm init \
--apiserver-advertise-address=192.168.1.100 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.4 \
--control-plane-endpoint=cluster.example.com:6443
关键参数说明:
--apiserver-advertise-address:指定API Server对外暴露的IP--pod-network-cidr:必须与后续安装的CNI插件匹配(Flannel默认使用10.244.0.0/16)--image-repository:国内环境建议使用阿里云镜像源--control-plane-endpoint:高可用集群必填,指向负载均衡器地址
3.2 证书管理策略
Kubernetes默认生成的证书有效期只有1年,生产环境建议通过以下方式延长:
- 修改kubeadm配置:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
apiServer:
certSANs:
- "cluster.example.com"
- "192.168.1.100"
certificatesDir: /etc/kubernetes/pki
clusterName: my-cluster
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kubernetesVersion: v1.28.4
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.1.100
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: master01
taints: null
certificateValidityPeriod: 87600h # 10年有效期
- 已有集群更新证书:
bash复制kubeadm certs renew all
4. 初始化后必做操作
4.1 配置kubectl
初始化成功后,按照提示执行:
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
验证集群状态:
bash复制kubectl get nodes
kubectl get pods -n kube-system
4.2 安装网络插件
Flannel安装示例:
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
Calico安装示例:
bash复制kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
4.3 添加工作节点
在worker节点执行初始化输出的join命令,例如:
bash复制kubeadm join cluster.example.com:6443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxx
提示:token默认24小时有效,过期后可通过master节点执行
kubeadm token create --print-join-command生成新命令
5. 常见问题排查
5.1 初始化卡住不动
可能原因及解决方案:
-
镜像拉取失败
- 检查
kubeadm config images list列出的镜像是否可用 - 手动拉取镜像:
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
- 检查
-
端口冲突
- 确认6443、2379-2380、10250-10259等端口未被占用
-
证书问题
- 重置环境:
kubeadm reset -f - 清理残留文件:
rm -rf /etc/kubernetes/ /var/lib/etcd/
- 重置环境:
5.2 节点NotReady状态
检查步骤:
bash复制journalctl -u kubelet -n 50 --no-pager # 查看kubelet日志
systemctl status kubelet # 检查服务状态
ip a # 验证网络配置
常见修复方法:
- 确保CNI插件已正确安装
- 检查容器运行时是否正常
- 验证节点资源是否充足(内存、CPU)
5.3 证书过期处理
查看证书有效期:
bash复制kubeadm certs check-expiration
手动续期单个证书:
bash复制kubeadm certs renew apiserver
systemctl restart kubelet
6. 生产环境优化建议
6.1 高可用部署方案
对于生产环境,建议采用以下架构:
code复制 +-----------------+
| Load Balancer |
+--------+--------+
|
+----------------+----------------+
| | |
+----------+-------+ +------+--------+ +-----+----------+
| Master Node 1 | | Master Node 2 | | Master Node 3 |
| (Control Plane) | | (Control Plane)| | (Control Plane)|
+------------------+ +---------------+ +-----------------+
| | |
+----------------+----------------+
|
+--------+--------+
| Worker Nodes |
+-----------------+
实现步骤:
- 配置负载均衡器(如HAProxy+Keepalived)
- 使用
--control-plane-endpoint参数指向VIP - 通过
kubeadm join添加额外控制平面节点
6.2 离线安装方案
在内网环境部署时:
- 提前下载所有依赖镜像:
bash复制kubeadm config images list --kubernetes-version=v1.28.4
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.4
# ...其他镜像同理
- 打包镜像并导入内网节点:
bash复制docker save -o k8s-images.tar $(kubeadm config images list)
docker load -i k8s-images.tar
- 使用
--image-repository参数指定本地仓库
6.3 安全加固措施
- 禁用匿名访问:
bash复制kubectl delete clusterrolebinding system:anonymous
- 启用RBAC:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: limited-user
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list", "watch"]
- 定期轮换证书:
bash复制kubeadm certs renew all
systemctl restart kubelet
7. 版本升级策略
7.1 小版本升级(如v1.28.3→v1.28.4)
- 升级控制平面:
bash复制apt-get update && apt-get install -y kubeadm=1.28.4-00
kubeadm upgrade plan
kubeadm upgrade apply v1.28.4
- 升级工作节点:
bash复制kubectl drain <node-name> --ignore-daemonsets
apt-get update && apt-get install -y kubelet=1.28.4-00 kubectl=1.28.4-00
systemctl daemon-reload
systemctl restart kubelet
kubectl uncordon <node-name>
7.2 大版本升级(如v1.27→v1.28)
需要逐步升级:
- 先升级到最新v1.27.z版本
- 升级到v1.28.0
- 最后升级到v1.28.z最新版本
重要:升级前务必备份etcd数据(/var/lib/etcd)和kubeadm配置
8. 监控与日志收集
8.1 基础监控部署
使用kube-prometheus-stack:
bash复制helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
8.2 关键指标监控
需要特别关注的指标:
- API Server延迟:
apiserver_request_duration_seconds - 节点资源使用:
node_memory_MemAvailable_bytes - Pod状态:
kube_pod_status_phase - 网络错误:
node_network_receive_errs_total
8.3 日志收集方案
EFK栈部署示例:
bash复制helm install elasticsearch elastic/elasticsearch --namespace logging
helm install fluent-bit fluent/fluent-bit --namespace logging \
--set-json='extraVolumes=[{"name": "varlog","hostPath": {"path": "/var/log"}}]' \
--set-json='extraVolumeMounts=[{"name": "varlog","mountPath": "/var/log"}]'
helm install kibana elastic/kibana --namespace logging
