通常来说,运行 Kubernetes 集群,需要 kubelet
、kube-apiserver
、etcd
、kube-scheduler
以及 kube-controller-manager
等组件。对于手工部署集群而言,我们需要生成证书,生成配置文件等,然后在不同机器上安装二进制文件,并设置 systemd
服务。
为了方便部署,K8s 官方开发了 kubeadm
工具来辅助我们的安装过程,运行原理如下:
kubeadm
首先在 Master 节点上生成 API PKI 和 etcd PKI 所需的证书,然后配置必要的 Static Pod,Master 节点启动后,会将必要的配置信息写入集群etcd
里,当其他节点加入集群的时候,就从集群读取模板配置文件,申请签发自己的证书,然后写到机器上。- 所有节点的
kubelet
仍然以systemd
服务形式存在。 - 在 Master 节点上,
kubelet
被配置了kube-apiserver
、etcd
、kube-controller-manager
以及kube-scheduler
四个 Static Pod。Static Pod 不受调度器控制,只要kubelet
服务运行,就会启动这些 Pod。相关配置文件可以在/etc/kubernetes/manifests
下找到。所有的 Master Pod 默认都是使用 Host Network,会占用端口。etcd
是 Kubernetes 控制平面的持久化存储,集群的所有配置都依赖etcd
来存储,万一etcd
服务失败,那么集群就不可用了。kube-apiserver
是 Kubernetes API,用来提供 REST API 以及鉴权,以达到kubectl
对集群进行 CRUD 操作的目的,其他机器上的kubelet
也会通过它来上报信息。kube-controller-manager
负责集群控制器的管理(每一个资源都有对应的控制器来监控集群状态并进行reconcile
操作)kube-scheduler
负责集群中 Pod 的调度。
- K8s 中对于 API 的通信采用了自建 PKI 以达到可信通信的目的,CA 证书等可以在
/etc/kubernetes/pki
下找到。证书中写死了 SAN,如果遇到机器更换 IP 或主机名的情况,需要重新签发证书(换端口不需要)。- 修改
kubeadm.config
(参考下面),加入需要额外添加的 SAN,本机的 hostname 和 IP 会自己添加,不需要额外填写。 - 运行
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: {}