⑴ k8s kubectl常用命令總結
查看所有 pod 列表, -n 後跟 namespace, 查看指定的命名空間
kubectl get pod
kubectl get pod -n kube
查看所有的命名空間
kubectl get ns
刪除某個節點
kubectl delete pod 節點名稱 -n 命名空間
查看 RC 和 service 列表, -o wide 查看詳細信息
kubectl get rc,svc
kubectl get pod,svc -o wide
kubectl get pod -o yaml
查看某個名稱空間下的所有節點以及ip
kubectl get pod -n 名稱空間名 -o wide
模擬用戶發起請求:
(模擬100個用戶同時發起100000條請求,後面跟著ip地址)
ab -c 100 -k 100000 http://23.23.23.1 -o wide
顯示仔坦租 Node 的詳細信息
kubectl describe node 192.168.0.212
顯示 Pod 的詳細信息, 特別是查看 pod 無法創建的時候的日誌
kubectl describe pod
eg:
kubectl describe pod redis-master-tqds9
根據 yaml 創建資源, apply 可以重復執行,create 不行
kubectl create -f pod.yaml
kubectl apply -f pod.yaml
基於 pod.yaml 定義的名稱刪除 pod
kubectl delete -f pod.yaml
刪除所有包含某個 label 的pod 和 service
kubectl delete pod,svc -l name=
刪除所有 Pod
kubectl delete pod --all
查看 endpoint 列表
kubectl get endpoints
執行 pod 的 date 命令
kubectl exec – date
kubectl exec – bash
kubectl exec – ping 10.24.51.9
通過bash獲得 pod 中某個容器的TTY,相當信握於登錄容器
kubectl exec -it -c – bash
eg:
kubectl exec -it redis-master-cln81 – bash
查看容器的日誌
kubectl logs
kubectl logs -f # 實時查看日誌
kubectl get pods --all-namespaces
kubectl get pods kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system
查看pods具體信息
kubectl get pods -o wide kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system
查看集群健康狀態
kubectl get cs
獲取所有deployment
kubectl get deployment --all-namespaces
列出該 namespace 中的所有 pod 包括未初始化的
kubectl get pods --include-uninitialized
查看deployment()
kubectl get deployment nginx-app
kubectl get rc,services
查看pods結構信息(重點,通過這個看日誌分析錯誤)
對控制器和服務,node同樣有效
kubectl describe pods xxxxpodsname --namespace=xxxnamespace
其他控制器類似吧,就是kubectl get 控制器念兆 控制器具體名稱
查看pod日誌
kubectl logs $POD_NAME
查看pod變數
kubectl exec my-nginx-5j8ok – printenv | grep SERVICE
集群
kubectl get cs # 集群健康情況
kubectl cluster-info # 集群核心組件運行情況
kubectl get namespaces # 表空間名
kubectl version # 版本
kubectl api-versions # API
kubectl get events # 查看事件
kubectl get nodes //獲取全部節點
kubectl delete node k8s2 //刪除節點
kubectl rollout status deploy nginx-test
創建
kubectl create -f ./nginx.yaml # 創建資源
kubectl create -f . # 創建當前目錄下的所有yaml資源
kubectl create -f ./nginx1.yaml -f ./mysql2.yaml # 使用多個文件創建資源
kubectl create -f ./dir # 使用目錄下的所有清單文件來創建資源
kubectl create -f https://git.io/vPieo # 使用 url 來創建資源
kubectl run -i --tty busybox --image=busybox ----創建帶有終端的pod
kubectl run nginx --image=nginx # 啟動一個 nginx 實例
kubectl run mybusybox --image=busybox --replicas=5 ----啟動多個pod
kubectl explain pods,svc # 獲取 pod 和 svc 的文檔
kubectl rolling-update python-v1 -f python-v2.json # 滾動更新 pod frontend-v1
kubectl rolling-update python-v1 python-v2 --image=image:v2 # 更新資源名稱並更新鏡像
kubectl rolling-update python --image=image:v2 # 更新 frontend pod 中的鏡像
kubectl rolling-update python-v1 python-v2 --rollback # 退出已存在的進行中的滾動更新
cat pod.json | kubectl replace -f - # 基於 stdin 輸入的 JSON 替換 pod
強制替換,刪除後重新創建資源。會導致服務中斷。
kubectl replace --force -f ./pod.json
為 nginx RC 創建服務,啟用本地 80 埠連接到容器上的 8000 埠
kubectl expose rc nginx --port=80 --target-port=8000
更新單容器 pod 的鏡像版本(tag)到 v4
kubectl get pod nginx-pod -o yaml | sed 『s/(image: myimage):.*$/\1:v4/』 | kubectl replace -f -
kubectl label pods nginx-pod new-label=awesome # 添加標簽
kubectl annotate pods nginx-pod icon-url= http://goo.gl/XXBTWq # 添加註解
kubectl autoscale deployment foo --min=2 --max=10 # 自動擴展 deployment 「foo」
編輯資源
kubectl edit svc/docker-registry # 編輯名為 docker-registry 的 service
KUBE_EDITOR=「nano」 kubectl edit svc/docker-registry # 使用其它編輯器
動態伸縮pod
kubectl scale --replicas=3 rs/foo # 將foo副本集變成3個
kubectl scale --replicas=3 -f foo.yaml # 縮放「foo」中指定的資源。
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # 將deployment/mysql從2個變成3個
kubectl scale --replicas=5 rc/foo rc/bar rc/baz # 變更多個控制器的數量
kubectl rollout status deploy deployment/mysql # 查看變更進度
kubectl delete -f ./pod.json # 刪除 pod.json 文件中定義的類型和名稱的 pod
kubectl delete pod,service baz foo # 刪除名為「baz」的 pod 和名為「foo」的 service
kubectl delete pods,services -l name=myLabel # 刪除具有 name=myLabel 標簽的 pod 和 serivce
kubectl delete pods,services -l name=myLabel --include-uninitialized # 刪除具有 name=myLabel 標簽的 pod 和 service,包括尚未初始化的
kubectl -n my-ns delete po,svc --all # 刪除 my-ns namespace下的所有 pod 和 serivce,包括尚未初始化的
kubectl delete pods prometheus-7fcfcb9f89-qkkf7 --grace-period=0 --force 強制刪除
kubectl logs nginx-pod # mp 輸出 pod 的日誌(stdout)
kubectl logs nginx-pod -c my-container # mp 輸出 pod 中容器的日誌(stdout,pod 中有多個容器的情況下使用)
kubectl logs -f nginx-pod # 流式輸出 pod 的日誌(stdout)
kubectl logs -f nginx-pod -c my-container # 流式輸出 pod 中容器的日誌(stdout,pod 中有多個容器的情況下使用)
kubectl run -i --tty busybox --image=busybox – sh # 互動式 shell 的方式運行 pod
kubectl attach nginx-pod -i # 連接到運行中的容器
kubectl port-forward nginx-pod 5000:6000 # 轉發 pod 中的 6000 埠到本地的 5000 埠
kubectl exec nginx-pod – ls / # 在已存在的容器中執行命令(只有一個容器的情況下)
kubectl exec nginx-pod -c my-container – ls / # 在已存在的容器中執行命令(pod 中有多個容器的情況下)
kubectl top pod POD_NAME --containers # 顯示指定 pod和容器的指標度量
kubectl drain k8s-node # 清空 my-node 以待維護
kubectl top node k8s-node # 顯示 my-node 的指標度量
kubectl cluster-info mp --output-directory=/path/to/cluster-state # 將當前集群狀態輸出到 /path/to/cluster-state
⑵ kubernetes(k8s)secret使用
Secret有三種類型:
1、Opaque:base64 編碼格式的 Secret,用來存儲密碼、密鑰等;但數據也可以通過base64 –decode解碼得到原始數據,所以加密性很弱。
2、kubernetes.io/dockerconfigjson:用來存儲私有docker registry的認證信息。
3、kubernetes.io/service-account-token:用於被serviceaccount引用,serviceaccout 創建時Kubernetes會默認創建對應的secret。Pod如果使用了serviceaccount,對應的secret會自動掛載到Pod目錄/run/secrets/kubernetes.io/serviceaccount中。
Opaque 類型的數據是一個 map 類型,要求value是base64編碼格式,比如我們來創建一個用戶名為 admin,密碼為 admin321 的 Secret 對象,首先需要把這用戶名和密碼做 base64 編碼,
然後可以利用上面編碼過後的數據來編寫一個YAML文件:(secret-demo.yaml)
然後同樣使用kubectl命令來創建:
利用get secret命令查看:
其中default-token-n9w2d為創建集群時默認創建的 secret,被serviceacount/default 引用。
使用describe命令,查看詳情:
我們可以看到利用describe命令查看到的Data沒有直接顯示出來,如果想看到Data裡面的詳細信息,同樣我們可以輸出成YAML文件進行查看:
創建好Secret對象後,有兩種方式來使用它:
1、以環境變裂褲量的形式
2、以Volume的形式掛載
首先我們來測試下環境變數的方式,同樣的,我們來使用一個簡單的busybox鏡像來測試下:(secret1-pod.yaml)
創建上面的Pod:
然後我們查看Pod的日誌輸出:
可以看到有 USERNAME 和 PASSWORD 兩個環境變數輸出出來。需要注意的舉源帶是,環境變數的方式,不支持動態更新密碼。
同樣的我們用一個Pod來驗證下Volume掛載,創建一個Pod文件:(secret2-pod.yaml)
創建Pod:
然後我們查看輸出日誌:
可以看到secret把兩個key掛載成了兩個對應的文件。
除了上面的Opaque這種類型外,我們還可以來創建用戶docker registry認證的Secret,直接使用kubectl create命令創建即可,如下:
然後查看Secret列表:
注意 看上面的TYPE類型,myregistry是不是對應的kubernetes.io/dockerconfigjson,同樣的可以使用describe命令來查看詳細信息:
同樣的可以看到Data區域沒有直接展示出來,如果想查看的話可以使用-o yaml來輸出展示出來:
可以把上面的data.dockerconfigjson下面的數據做一個base64解碼正蘆,看看裡面的數據是怎樣的呢?
如果我們需要拉取私有倉庫中的docker鏡像的話就需要使用到上面的myregistry這個Secret:
我們需要拉取私有倉庫鏡像10.8.13.85/test:v1,我們就需要針對該私有倉庫來創建一個如上的Secret,然後在Pod的 YAML 文件中指定imagePullSecrets。
另外一種Secret類型就是kubernetes.io/service-account-token,用於被serviceaccount引用。serviceaccout 創建時 Kubernetes 會默認創建對應的 secret。Pod 如果使用了 serviceaccount,對應的secret會自動掛載到Pod的/run/secrets/kubernetes.io/serviceaccount目錄中。
這里我們使用一個nginx鏡像來驗證一下,大家想一想為什麼不是呀busybox鏡像來驗證?當然也是可以的,但是我們就不能在command裡面來驗證了,因為token是需要Pod運行起來過後才會被掛載上去的,直接在command命令中去查看肯定是還沒有 token 文件的。
最後我們來對比下Secret和ConfigMap這兩種資源對象的異同點:
key/value的形式
屬於某個特定的namespace
可以導出到環境變數
可以通過目錄/文件形式掛載
通過 volume 掛載的配置信息均可熱更新
Secret 可以被 ServerAccount 關聯
Secret 可以存儲 docker register 的鑒權信息,用在 ImagePullSecret 參數中,用於拉取私有倉庫的鏡像
Secret 支持 Base64 加密
Secret 分為 kubernetes.io/service-account-token、kubernetes.io/dockerconfigjson、Opaque 三種類型,而 Configmap 不區分類型