kubeadm init 初始化过程详解
预检 → 证书生成 → kubeconfig 配置 → 控制平面部署 → etcd 初始化 → 查验
一. 预检阶段(Preflight Checks)
- 权限检查:验证执行用户是否为 root,否则快速失败。
- 版本兼容性:确保
kubeadm
版本不低于目标 Kubernetes 版本。- 系统环境验证:
- 关闭 Swap 分区。
- 检查端口占用(如 6443、10250 等)和防火墙规则。
- 校验容器运行时(如 Containerd、CRI-O)是否已启动。
- 内核参数检测(如启用 IP 转发、桥接流量)。
二. 证书与密钥生成
- 根证书(CA)**:生成自签名根证书,用于签发其他组件的证书。
- API Server 证书:包含
apiserver
服务端证书、apiserver-kubelet-client
客户端证书等。- 前端代理证书:支持扩展 API Server 的安全通信。
- etcd 证书:为 etcd 集群生成服务端、对等通信及健康检查证书。
- ServiceAccount 密钥:生成用于服务账户令牌签名的公私钥对。
三. 生成 kubeconfig 文件
- 用途:配置各组件与 API Server 的通信权限。
- 关键文件:
admin.conf
:集群管理员配置文件。kubelet.conf
:kubelet 启动时的引导配置文件。controller-manager.conf
和scheduler.conf
:控制平面组件专用配置。
四. 部署控制平面组件
以下是 kubeadm init 初始化过程中“部署控制平面组件”阶段的详细解析,涵盖静态 Pod 生成、组件配置、运行机制及关键操作细节:
1. 静态 Pod 清单生成
路径与文件
- 存储路径:
/etc/kubernetes/manifests/
- 关键文件:
kube-apiserver.yaml
:定义 API Server 的 Pod 配置。kube-controller-manager.yaml
:定义控制器管理器的 Pod 配置。kube-scheduler.yaml
:定义调度器的 Pod 配置。etcd.yaml
:定义 etcd 的 Pod 配置(单节点模式)。生成方式
- 通过
kubeadm init
自动生成,基于以下参数动态填充:
--apiserver-advertise-address
:API Server 监听的 IP 地址。--pod-network-cidr
:Pod 网络的 CIDR 范围。--service-cidr
:Service 网络的 CIDR 范围。示例配置片段(kube-apiserver.yaml)
apiVersion: v1 kind: Pod metadata: labels: component: kube-apiserver tier: control-plane name: kube-apiserver namespace: kube-system spec: containers: - command: - kube-apiserver - --advertise-address=192.168.0.113 - --allow-privileged=true - --authorization-mode=Node,RBAC - --client-ca-file=/etc/kubernetes/pki/ca.crt - --enable-admission-plugins=NodeRestriction - --enable-bootstrap-token-auth=true - --etcd-servers=https://127.0.0.1:2379 - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt - --secure-port=6443 - --service-account-issuer=https://kubernetes.default.svc.cluster.local - --service-account-signing-key-file=/etc/kubernetes/pki/sa.key - --service-cluster-ip-range=10.96.0.0/12 - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key volumeMounts: - name: k8s-certs mountPath: /etc/kubernetes/pki readOnly: true
- 关键参数说明:
--etcd-servers
:指定 etcd 服务地址(单节点默认为本地)。--service-cluster-ip-range
:Service 的 IP 范围,需与kubeadm init
参数一致。2. kubelet 的角色与配置
kubelet 的作用
- 静态 Pod 管理:kubelet 监控
/etc/kubernetes/manifests/
目录,自动加载并运行其中的 Pod 定义文件。- 自托管机制:控制平面组件(API Server 等)以 Pod 形式运行,但不受 Kubernetes 自身调度管理(称为“静态 Pod”)。
kubelet 关键配置
- Systemd 单元文件:
/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
- 定义启动参数,如
--pod-manifest-path
(指定静态 Pod 路径)。- 运行时配置:
/var/lib/kubelet/config.yaml
- 包含动态生成的参数(如认证模式、Pod CIDR)。
3. etcd 的部署模式
单节点模式(默认)
- 生成位置:
/etc/kubernetes/manifests/etcd.yaml
- 特点:
- 与控制平面组件同节点部署。
- 数据目录:
/var/lib/etcd/
。- 证书路径:
/etc/kubernetes/pki/etcd/
。外部 etcd 集群模式
- 配置要求:
- 手动部署 etcd 集群并生成证书。
- 在
kubeadm init
时指定--external-etcd
参数及 etcd 端点信息。- 优势:
- 高可用性:etcd 独立于控制平面,避免单点故障。
- 性能隔离:减轻 Master 节点负载。
4. 镜像拉取与容器运行时
镜像来源
默认镜像仓库:
k8s.gcr.io
(国内需替换为阿里云镜像源)。加速配置:
使用
--image-repository=registry.aliyuncs.com/google_containers
参数指定镜像源。示例命令:
kubeadm init --image-repository=registry.aliyuncs.com/google_containers
容器运行时配置
- Containerd 配置:
- 配置文件:
/etc/containerd/config.toml
。- 关键参数:
systemd_cgroup = true
:确保与 kubelet 的 cgroup 驱动一致。sandbox_image
:替换为阿里云镜像源(如registry.aliyuncs.com/google_containers/pause:3.7
)。5. 初始化后的验证与调试
检查控制平面组件状态
kubectl get pods -n kube-system
预期输出:
NAME READY STATUS RESTARTS AGE etcd-kubevm1 1/1 Running 0 2m17s kube-apiserver-kubevm1 1/1 Running 0 2m kube-controller-manager-kubevm1 1/1 Running 0 2m kube-scheduler-kubevm1 1/1 Running 0 2m
常见问题:
- Pod 处于
Pending
状态:未安装网络插件(如 Flannel/Calico)。- 证书错误:检查
/etc/kubernetes/pki/
下的证书文件是否完整。日志排查
查看 kubelet 日志:
journalctl -u kubelet -f
查看组件日志:
kubectl logs -n kube-system <pod-name> -c <container-name>