kubeadm join用于将当前的节点加入到kubelet集群当中去。
kubeadm join 148.70.251.10:6443 --token nh819o.pzcpohatm7p3a5cm --discovery-token-ca-cert-hash sha256:55254659ea80b335a09dd627757d6aecd10b2c6fbdaddc63dd9bae9ec353cc49
--discovery-token-ca-cert-hash:用于Node验证master身份。
执行join时,API Server会下发ca.crt,这个证书会被node存放在/etc/kubernetes/pki目录下。
然后kubeadm join再用ca设置公钥证书的hash值,与discovery-token-ca-cert-hash的值进行比对。
确定是否为正确的master。可以通过以下方法计算hash值。
ubuntu@VM-0-3-ubuntu:~$ openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -pubkey | openssl rsa -pubin -outform DER 2>/dev/null | sha256sum | cut -d' ' -f1 55254659ea80b335a09dd627757d6aecd10b2c6fbdaddc63dd9bae9ec353cc49
--token:用于Master验证Node身份。
要想集群首次引导启动时,支持bootstrap-token验证,APIServer需要开启下面的配置选项:
--enable-bootstrap-token-auth=true
root@VM-16-6-ubuntu:/etc/kubernetes/manifests# kubectl get secret -n kube-system|grep bootstrap-token bootstrap-token-nh819o bootstrap.kubernetes.io/token 7 2d
nh819o是token的id。pzcpohatm7p3a5cm是secret。
当kubeadm join访问APIServer,会在请求的header中携带这一token。APIServer会根据token进行身份验证。
API会查询是否有bootstrap-token的前缀的secret对象。
我们可以查看secret对象的内容。
root@VM-16-6-ubuntu:~# kubectl get secret/bootstrap-token-nh819o -n kube-system -o yamlapiVersion: v1 data: auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4= description: VGhlIGRlZmF1bHQgYm9vdHN0cmFwIHRva2VuIGdlbmVyYXRlZCBieSAna3ViZWFkbSBpbml0Jy4= expiration: MjAxOS0wNi0yMFQxMToyNDoyOCswODowMA== token-id: bmg4MTlv token-secret: cHpjcG9oYXRtN3AzYTVjbQ== usage-bootstrap-authentication: dHJ1ZQ== usage-bootstrap-signing: dHJ1ZQ== kind: Secret metadata: creationTimestamp: 2019-06-19T03:24:28Z name: bootstrap-token-nh819o namespace: kube-system resourceVersion: "160" selfLink: /api/v1/namespaces/kube-system/secrets/bootstrap-token-nh819o uid: bea32cfa-9241-11e9-a613-52540095a842 type: bootstrap.kubernetes.io/token
对token-secret进行解码:
root@VM-16-6-ubuntu:~# echo cHpjcG9oYXRtN3AzYTVjbQ==|base64 -d pzcpohatm7p3a5cm
这个与token参数的secret值一致。