Kubernetes 实战 | kubeadm 部署原理简介

通常来说,运行 Kubernetes 集群,需要 kubeletkube-apiserveretcdkube-scheduler 以及 kube-controller-manager 等组件。对于手工部署集群而言,我们需要生成证书,生成配置文件等,然后在不同机器上安装二进制文件,并设置 systemd 服务。

为了方便部署,K8s 官方开发了 kubeadm 工具来辅助我们的安装过程,运行原理如下:

  1. kubeadm 首先在 Master 节点上生成 API PKI 和 etcd PKI 所需的证书,然后配置必要的 Static Pod,Master 节点启动后,会将必要的配置信息写入集群 etcd 里,当其他节点加入集群的时候,就从集群读取模板配置文件,申请签发自己的证书,然后写到机器上。
  2. 所有节点的 kubelet 仍然以 systemd 服务形式存在。
  3. 在 Master 节点上,kubelet 被配置了 kube-apiserveretcdkube-controller-manager 以及 kube-scheduler 四个 Static Pod。Static Pod 不受调度器控制,只要 kubelet 服务运行,就会启动这些 Pod。相关配置文件可以在 /etc/kubernetes/manifests 下找到。所有的 Master Pod 默认都是使用 Host Network,会占用端口。
    1. etcd 是 Kubernetes 控制平面的持久化存储,集群的所有配置都依赖 etcd 来存储,万一 etcd 服务失败,那么集群就不可用了。
    2. kube-apiserver 是 Kubernetes API,用来提供 REST API 以及鉴权,以达到 kubectl 对集群进行 CRUD 操作的目的,其他机器上的 kubelet 也会通过它来上报信息。
    3. kube-controller-manager 负责集群控制器的管理(每一个资源都有对应的控制器来监控集群状态并进行 reconcile 操作)
    4. kube-scheduler 负责集群中 Pod 的调度。
  4. K8s 中对于 API 的通信采用了自建 PKI 以达到可信通信的目的,CA 证书等可以在 /etc/kubernetes/pki 下找到。证书中写死了 SAN,如果遇到机器更换 IP 或主机名的情况,需要重新签发证书(换端口不需要)。
    1. 修改 kubeadm.config (参考下面),加入需要额外添加的 SAN,本机的 hostname 和 IP 会自己添加,不需要额外填写。
    2. 运行 sudo kubeadm init phase upload-certs --upload-certs 重新生成证书。
apiServer:
  certSANs:
  - "kube-master"
  extraArgs:
    authorization-mode: Node,RBAC
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
controlPlaneEndpoint: "192.168.1.103:8443"
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    serverCertSANs:
      - 192.168.1.103
    peerCertSANs:
      - 192.168.1.103
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.15.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}