kubernetes中master节点添加node流程分析

问题:

1)从kubelet.service中我们能看到参数–kubeconfig=/etc/kubernetes/kubelet.kubeconfig,但是节点配置流程中却并未添加该文件,如下,那么该文件是怎么来的呢?记录了什么信息?

ls /etc/kubernetes/
bootstrap.kubeconfig  ca  kube-proxy.kubeconfig

2)节点配置完成启动kubelet后,执行kubectl get csr能看到Pending状态,那么kubectl certificate approve是怎么认证节点并建立通信的呢?

$ kubectl get csr
NAME                                                   AGE       REQUESTOR           CONDITION
node-csr-URWr1jYw4q-Zg9sqnbzMJ1do9OMCWfiJkWbqy8zaQ7s   1h        kubelet-bootstrap   Pending

分析:

首先看看kubelet相关启动流程,如下:

kubelet.go:
command.Execute()
server.go:
NewKubeletCommand()->Run()->run()->bootstrap.LoadClientCert()
bootstrap.go:
LoadClientCert()->verifyBootstrapClientConfig(kubeconfigPath)->loadRESTClientConfig(bootstrapPath)->certificates.NewForConfig(bootstrapClientConfig)->csr.RequestNodeCertificate->clientcmd.WriteToFile(kubeconfigData, kubeconfigPath)

a)verifyBootstrapClientConfig中的kubeconfigPath自然就是kubelet启动参数中传入的–kubeconfig,这里的配置验证主要是解析客户端配置、加载传输配置、加载tls配置、解析证书、证书过期校验。如果一切正常,LoadClientCert会直接返回nil,进入后续工作流程。
b)如果配置、证书错误或者kubelet.kubeconfig不存在均会返回false,之后加载解析的的就是bootstrap.kubeconfig这个文件了。这就进入关键点csr.RequestNodeCertificate了,首先会通过MakeEllipticPrivateKeyPEM生成私钥,之后使用认证请求、私钥、节点名生成CSR请求证书,发送后通过WaitForCertificate等待master审批,超时等待时间为1小时。审批完成后将相关配置以及证书写入kubelet.kubeconfig文件中。

结论:

这样问题的答案已经很清晰了,对于问题1),kubelet.kubeconfig是master批复CSR请求后客户端生成的。而问题2),其实master、node建立通信的过程就是标准的CSR请求流程,而Pending状态就是节点等待master审批CSR请求的等待状态,在这期间节点会一直阻塞在这里。

你可能感兴趣的:(容器云)