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.confscheduler.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>
    
posted @ 2025-03-10 13:55  HoraceXie  阅读(753)  评论(0)    收藏  举报