首頁 > 軟體

Dashboard管理Kubernetes叢集與API存取設定

2022-04-01 13:00:09

Kubectl 命令大全

下面列出了 kubectl 的所有命令以及其縮寫形式,供翻閱查詢。

kubectl 命令格式:

kubectl [command] [type] [Name] [flag]
allevents (ev)podsecuritypolicies (psp)
certificatesigningrequests (csr)horizontalpodautoscalers (hpa)podtemplates
clusterrolebindingsingresses (ing)replicasets (rs)
clusterrolesjobsreplicationcontrollers (rc)
clusters (valid only for federation apiservers)limitranges (limits)resourcequotas (quota)
componentstatuses (cs)namespaces (ns)rolebindings
configmaps (cm)networkpolicies (netpol)roles
controllerrevisionsnodes (no)secrets
cronjobspersistentvolumeclaims (pvc)serviceaccounts (sa)
customresourcedefinition (crd)persistentvolumes (pv)services (svc)
daemonsets (ds)poddisruptionbudgets (pdb)statefulsets
deployments (deploy)podpresetstorageclasses
endpoints (ep)pods (po) 

安裝 Kubernetes-Dashboard

Kubernetes-Dashboard 是一個 管理 Kubernetes 叢集的 Web UI,跟 kubectl 一樣,其後端是 API-Server,使用線上的 YAML 檔案部署 Kubernetes-Dashboard :

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml

dashboard 建立後會在 kubernetes-dashboard 名稱空間中。

root@instance-1:~# kubectl get pods --namespace=kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-856586f554-4nd9v   1/1     Running   0          9d
kubernetes-dashboard-78c79f97b4-288js        1/1     Running   0          9d

root@instance-1:~# kubectl get services --namespace=kubernetes-dashboard
NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper       ClusterIP   10.98.50.123     <none>        8000/TCP        9d
kubernetes-dashboard            NodePort    10.111.44.44     <none>        443/TCP   9d

由於其網路預設是 NodePort 的方式,沒有設定外界開啟,所以為了能夠被外界存取,可以修改其 service:

kubectl edit service kubernetes-dashboard --namespace=kubernetes-dashboard
  ports:
  - nodePort: 30633
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort

或者把 type 修改為 LoadBalancer。

在叢集內網可以通過 443 存取,在外網可以通過 30633 存取,存取方式是 https。

可以看到,存取方式有 Token 和組態檔方式(kubeconfing),這兩者後面再講。

通過下面這條命令我們可以檢視 Token:

kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token

複製,填寫到 Web UI 中,即可進入控制檯。

RESTful API

我們可以叢集中的任意節點存取 API-Server ,其埠是 6443。

API 可以使用 Token 和 證書方式 進行認證,我們可以使用上一小節查詢出來的 token,對 API 進行存取:

curl https://k8smaster:6443/api/v1/pods -k --header "Authorization: bearer {此處填寫你的token}"

注:使用 -k 可以忽略證書問題;k8smaster 是筆者設定 hosts 的,具體要以你的 主節點 ip為準。

也可以使用證書存取 API,其格式如下:

curl --cert /tmp/client.pem --key /tmp/client-key.pem 
--cacert /tmp/ca.pem -v -XGET  
https://k8smaster:6443/api/v1/pods

這裡不多介紹 k8s 的 API,只介紹幾個對偵錯有用的 API。

GET /api/v1/namespaces/{namespace}/pods/{name}/exec

GET /api/v1/namespaces/{namespace}/pods/{name}/log

GET /api/v1/watch/namespaces/{namespace}/pods/{name}

鑑權

由於 API-Server 需要一定許可權才能存取,所以實際上使用者使用 kubectl 工具時,也需要許可權才能執行命令。

kubectl auth can-i 命令用來確定一個使用者是否能夠存取 API。

如果要確定當前使用者是否有許可權存取 deployments,可以使用:

kubectl auth can-i create deployments
kubectl auth can-i {命令}

如果要檢查其它使用者是否有許可權,可以使用 --as

kubectl auth can-i create deployments --as ddddd
kubectl auth can-i create deployments --as ddddd --namespace kube-system

為了更加方便地獲得許可權,我們可以使用 SelfSubjectAccessReview 這個 API 來獲得許可權資訊資源,它將 API 伺服器鑑權公開給外部服務,其 API 說明檔案地址:

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/

另外還有三個相關的 API:

  • SubjectAccessReview - 對任意使用者的存取進行評估,而不僅僅是當前使用者。 當鑑權決策被委派給 API 伺服器時很有用。例如,kubelet 和擴充套件 API 伺服器使用 它來確定使用者對自己的 API 的存取許可權。
  • LocalSubjectAccessReview - 與 SubjectAccessReview 類似,但僅限於特定的 名稱空間。
  • SelfSubjectRulesReview - 返回使用者可在名稱空間內執行的操作集的審閱。 使用者可以快速彙總自己的存取許可權,或者用於 UI 中的隱藏/顯示動作。

這裡只需要瞭解,不需要深入。

註解

我們可以使用 Kubernetes 註解為物件附加任意的非標識的後設資料,註解使用 annotations 標識。使用者端程式(例如工具和庫)能夠獲取這些後設資料資訊。

我們檢視 dashboard 的相關 annotations :

kubectl describe services -n kubernetes-dashboard
... ...
Labels:                   k8s-app=kubernetes-dashboard
Annotations:              <none>
... ...

annotations 由 key/value 組成,類似 label,但是 annotations 支援一些特殊字元,可以用作構建釋出映象時的資訊、紀錄檔記錄等。

kubectl annotate service kubernetes-dashboard -n kubernetes-dashboard description='my test'
key=description

value=my test

重新檢視 describe,可以看到:

Annotations:              description: my test

如果要覆蓋 key 的值,需要加上 --overwrite 。

如果要刪除一個 key:

kubectl annotate service kubernetes-dashboard description-

Pod YAML 結構

這是一個簡單的 YAML 檔案:

apiVersion: v1
kind: Pod
metadata:
    name: firstpod
spec:
    containers:
    - image: nginx
      name: stan 

k8s 的 YAML 必須包含四個部分:

  • apiVersion:API 組的版本
  • kind:建立的物件型別
  • metadata:後設資料,name 欄位必填
  • spec:怎麼建立物件,如果是 pod,則 container 必填。

設定

在 $HOME/.kube/config 檔案中儲存了 Kubernetes 的設定資訊,可以直接開啟檔案檢視,也可以通過 kubectl config view 檢視(只顯示部分資訊)。

前面我們存取 API 時,使用了 token,現在我們可以通過這個 config,來建立證書檔案,通過證書存取。。

client 金鑰,就在這個 config 檔案的 client-certificate-data 欄位中儲存。

grep client-cert $HOME/.kube/config |cut -d" " -f 6

key,在 client-key-data 欄位中儲存:

grep client-key-data $HOME/.kube/config |cut -d " " -f 6

API-Server 的公鑰(auth),就在 certificate-authority-data 欄位中儲存:

grep certificate-authority-data $HOME/.kube/config |cut -d " " -f 6

意思就是三個重要的 金鑰資料,這裡為了方便,分別使用 client、key、auth 三個變數儲存查詢的資料。

export client=(grep client-cert $HOME/.kube/config |cut -d" " -f 6)
export key=(grep client-key-data $HOME/.kube/config |cut -d " " -f 6)
export auth=(grep certificate-authority-data $HOME/.kube/config |cut -d " " -f 6)

建立證書檔案:

echo $client | base64 -d - > ./client.pems
echo $key | base64 -d - > ./client-key.pem
echo $auth | base64 -d - > ./ca.pem

然後存取的時候就可以通過證書安全地存取 API-Server:

curl --cert ./client.pem --key ./client-key.pem --cacert ./ca.pem https://k8smaster:6443/api/v1/pod

到此這篇關於Dashboard管理Kubernetes叢集與API存取設定的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com