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值一致。