# kubeadm init 的工作流程
> $ kubeadm init --config kubeadm.yaml
## 1. Preflight Checks
## 2. 生成 Kubernetes 对外提供服务所需的各种证书和对应的目录
> 生成的证书文件都放在 Master 节点
> 最主要的证书文件是 ca.crt 和对应的私钥 ca.key
```
[root@k8smaster pki]# pwd
/etc/kubernetes/pki
[root@k8smaster pki]# ll
total 56
-rw-r--r--. 1 root root 1135 Dec 7 14:54 apiserver-etcd-client.crt
-rw-------. 1 root root 1675 Dec 7 14:54 apiserver-etcd-client.key
-rw-r--r--. 1 root root 1143 Dec 7 14:54 apiserver-kubelet-client.crt
-rw-------. 1 root root 1675 Dec 7 14:54 apiserver-kubelet-client.key
-rw-r--r--. 1 root root 1265 Dec 7 14:54 apiserver.crt
-rw-------. 1 root root 1679 Dec 7 14:54 apiserver.key
-rw-r--r--. 1 root root 1066 Dec 7 14:54 ca.crt
-rw-------. 1 root root 1675 Dec 7 14:54 ca.key
drwxr-xr-x. 2 root root 162 Dec 7 14:54 etcd
-rw-r--r--. 1 root root 1078 Dec 7 14:54 front-proxy-ca.crt
-rw-------. 1 root root 1675 Dec 7 14:54 front-proxy-ca.key
-rw-r--r--. 1 root root 1103 Dec 7 14:54 front-proxy-client.crt
-rw-------. 1 root root 1679 Dec 7 14:54 front-proxy-client.key
-rw-------. 1 root root 1679 Dec 7 14:54 sa.key
-rw-------. 1 root root 451 Dec 7 14:54 sa.pub
```
## 3. 为其他组件生成访问 kube-apiserver 所需的配置文件
> 这些文件的路径是:/etc/kubernetes/xxx.conf:
> 这些文件里面记录的是,当前这个 Master 节点的服务器地址、监听端口、证书目录等信息。这样,对应的客户端(比如 scheduler,kubelet 等),可以直接加载相应的文件,使用里面的信息与 kube-apiserver 建立安全连接。
```
[root@k8smaster kubernetes]# ll /etc/kubernetes/
total 32
-rw-------. 1 root root 5567 Dec 7 14:54 admin.conf
-rw-------. 1 root root 5603 Dec 7 14:54 controller-manager.conf
-rw-------. 1 root root 1927 Dec 7 14:55 kubelet.conf
drwxr-xr-x. 2 root root 113 Dec 7 14:54 manifests
drwxr-xr-x. 3 root root 4096 Dec 7 14:54 pki
-rw-------. 1 root root 5547 Dec 7 14:54 scheduler.conf
```
## 4. kubeadm 会为 Master 组件生成 Pod 配置文件
> Master 组件的 YAML 文件会被生成在 /etc/kubernetes/manifests 路径下
> Kubernetes 有三个 Master 组件 kube-apiserver、kube-controller-manager、kube-scheduler,而它们都会被使用 Pod 的方式部署起来
```
[root@k8smaster kubernetes]# ll /etc/kubernetes/manifests/
total 16
-rw-------. 1 root root 2206 Dec 7 14:54 etcd.yaml
-rw-------. 1 root root 3321 Dec 7 14:54 kube-apiserver.yaml
-rw-------. 1 root root 2828 Dec 7 14:54 kube-controller-manager.yaml
-rw-------. 1 root root 1414 Dec 7 14:54 kube-scheduler.yaml
```
> 而一旦这些 YAML 文件出现在被 kubelet 监视的 /etc/kubernetes/manifests 目录下,kubelet 就会自动创建这些 YAML 文件中定义的 Pod,即 Master 组件的容器。
> Master 容器启动后,kubeadm 会通过检查 localhost:6443/healthz 这个 Master 组件的健康检查 URL,等待 Master 组件完全运行起来。
## 5. kubeadm 就会为集群生成一个 bootstrap token
> 在后面,只要持有这个 token,任何一个安装了 kubelet 和 kubadm 的节点,都可以通过 kubeadm join 加入到这个集群当中。
> 在 token 生成之后,kubeadm 会将 ca.crt 等 Master 节点的重要信息,通过 ConfigMap 的方式保存在 Etcd 当中,供后续部署 Node 节点使用。这个 ConfigMap 的名字是 cluster-info。
## 6. 最后一步,就是安装默认插件
Kubernetes 默认 kube-proxy 和 DNS 这两个插件是必须安装的。它们分别用来提供整个集群的服务发现和 DNS 功能
## 7.
1. kubeadm 至少需要发起一次“不安全模式”的访问到 kube-apiserver,从而拿到保存在 ConfigMap 中的 cluster-info(它保存了 APIServer 的授权信息)。而 bootstrap token,扮演的就是这个过程中的安全验证的角色。
2. 只要有了 cluster-info 里的 kube-apiserver 的地址、端口、证书,kubelet 就可以以“安全模式”连接到 apiserver 上,这样一个新的节点就部署完成了。