1. 程式人生 > >K8s-部署 kubectl 命令列工具.03

K8s-部署 kubectl 命令列工具.03

內容轉載自:https://github.com/opsnull/follow-me-install-kubernetes-cluster/blob/master/03.%E9%83%A8%E7%BD%B2kubectl%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%B7%A5%E5%85%B7.md

03.部署 kubectl 命令列工具

kubectl 是 kubernetes 叢集的命令列管理工具,本文件介紹安裝和配置它的步驟。

kubectl 預設從 ~/.kube/config 檔案讀取 kube-apiserver 地址、證書、使用者名稱等資訊,如果沒有配置,執行 kubectl 命令時可能會出錯:

$ kubectl get pods
The connection to the server localhost:8080 was refused - did you specify the right host or port?

本文件只需要部署一次,生成的 kubeconfig 檔案與機器無關。

下載和解壓:

wget https://dl.k8s.io/v1.10.4/kubernetes-server-linux-amd64.tar.gz
tar -xzvf kubernetes-server-linux-amd64.tar.gz

分發到所有使用 kubectl 的節點:

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IP[@]}
  do
    echo ">>> ${master_ip}"
    scp kubernetes/client/bin/kubectl [email protected]${master_ip}:/opt/k8s/bin/
    ssh [email protected]${master_ip} "chmod +x /opt/k8s/bin/*"
  done

建立 admin 證書和私鑰

kubectl 與 apiserver https 安全埠通訊,apiserver 對提供的證書進行認證和授權。

kubectl 作為叢集的管理工具,需要被授予最高許可權。這裡建立具有最高許可權的 admin 證書。

建立證書籤名請求:

cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "system:masters",
      "OU": "4Paradigm"
    }
  ]
}
EOF
  • O 為 system:masters,kube-apiserver 收到該證書後將請求的 Group 設定為 system:masters;
  • 預定義的 ClusterRoleBinding cluster-admin 將 Group system:masters 與 Role cluster-admin 繫結,該 Role 授予所有 API的許可權;
  • 該證書只會被 kubectl 當做 client 證書使用,所以 hosts 欄位為空;

生成證書和私鑰:

cfssl gencert -ca=/etc/kubernetes/cert/ca.pem \
  -ca-key=/etc/kubernetes/cert/ca-key.pem \
  -config=/etc/kubernetes/cert/ca-config.json \
  -profile=kubernetes admin-csr.json | cfssljson -bare admin
ls admin*

建立 kubeconfig 檔案

kubeconfig 為 kubectl 的配置檔案,包含訪問 apiserver 的所有資訊,如 apiserver 地址、CA 證書和自身使用的證書;

source /opt/k8s/bin/environment.sh
# 設定叢集引數
kubectl config set-cluster kubernetes \
  --certificate-authority=/etc/kubernetes/cert/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=kubectl.kubeconfig

# 設定客戶端認證引數
kubectl config set-credentials admin \
  --client-certificate=admin.pem \
  --client-key=admin-key.pem \
  --embed-certs=true \
  --kubeconfig=kubectl.kubeconfig

# 設定上下文引數
kubectl config set-context kubernetes \
  --cluster=kubernetes \
  --user=admin \
  --kubeconfig=kubectl.kubeconfig
  
# 設定預設上下文
kubectl config use-context kubernetes --kubeconfig=kubectl.kubeconfi
  • --certificate-authority:驗證 kube-apiserver 證書的根證書;
  • --client-certificate--client-key:剛生成的 admin 證書和私鑰,連線 kube-apiserver 時使用;
  • --embed-certs=true:將 ca.pem 和 admin.pem 證書內容嵌入到生成的 kubectl.kubeconfig 檔案中(不加時,寫入的是證書檔案路徑);

分發 kubeconfig 檔案

分發到所有使用 kubectl 命令的節點:

source /opt/k8s/bin/environment.sh
for master_ip in ${MASTER_IP[@]}
  do
    echo ">>> ${master_ip}"
    ssh [email protected]${master_ip} "mkdir -p ~/.kube"
    scp kubectl.kubeconfig [email protected]${master_ip}:~/.kube/config
    ssh [email protected]${master_ip} "mkdir -p ~/.kube"
    scp kubectl.kubeconfig [email protected]${master_ip}:~/.kube/config
  done
  • 儲存到使用者的 ~/.kube/config 檔案;

    •