
1、K8S命令概述
在學習K8s基礎命令前,了解和學習docker命令是很有必要的,kubectl和docker很多命令都有相通之處。
docker ps #查看所有up狀態容器
docker ps -a#查看所有狀態的容器
docker inspect containerid#查看容器詳情
docker images #查看容器鏡像
docker start/stop/restart containerid #啟動/停止/重啟容器
docker exec -it containerid bash #進入容器
docker exec containerid bash -c 'uptime' #容器外執行命令
docker rmi imageid #刪除鏡像
docker rm containerid #刪除容器

2、K8S集群資源操作
kubectl get cs #集群健康情況
kubectl version #K8S集群版本查看
kubectl get node #查看集群節點
kubectl get pods -o wide -A #查看所有命命空間pod
-n #后跟指定命名空間
--all-namespaces #等同于-A
kubect get deployments -A
kubectl get svc,ep -A #查看svc和endpoints
kubectl get pod --show-labels #查看pod標簽
kubectl get node --show-labels #查看node標簽
查看配置
kubectl get deployments.apps nginxtest-xxx -oyaml #查看deployment資源
kubectl get pods nginxtest-xxx -oyaml #查看pod資源配置
查看是否有資源限制
kubectl describe node 192.168.1.2Capacity:
cpu: 16
ephemeral-storage: 524030980Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 82320508Ki
pods: 253
Allocatable:
cpu: 15100m
ephemeral-storage: 520373252Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 79101052Ki
pods: 253
capacity代表減去系統預留的資源總量。
Allocatable可分配給K8S資源的總量。
pod資源限制,防止單個服務占用資源過高影響其他pod,達到limits數值后會oom重啟。
kubectl get pods nginx-test -oyaml | grep -A 6 resources
resources:
limits:
cpu: "5"
memory: 5000Mi
requests:
cpu: 55m
memory: 100Mikubectl --help 多用help
3、K8S運維場景
通過副本擴容實現流量分攤,避免單個節點負載過高,建議資源中增加反親和性,達到不同副本調度到不同node
kubectl scale deployment nginx-test --replicas=2 #副本擴容
kubectl edit deployment nginx-test #直接編輯修改spec.replicas標簽擴容
kubectl exec -it podname bash #或者sh
-n 指定名字空間
kubectl exec nginx-965048598-jt28d -n test uptime #不進入容器,只獲取命令輸出
kubectl delete pods nginx-test-6fc6d8666b-mhl48 #常規刪除
kubectl delete pod -l app=test #基于標簽刪除,批量操作效率高
kubectl delete pods nginx-test -n dev --grace-period=0 --force #強制刪除,沒有terminationGracePeriodSeconds 30s的時間
還可以通過kubectl scale命令將副本縮為0的方式刪除pod
對于設置了污點的服務,普通pod無法調用到此節點,只有增加了Tolerations容忍配置才可以。
[root@wpseco-node-1 log]# kubectl describe node 192.168.0.1 | grep Taints
Taints: <none>
kubectl taint node 192.168.0.1 test-access-node=:NoSchedule --overwrite=true #污點添加
kubectl taint node 192.168.0.1 test-access-node:NoSchedule- #污點刪除
其中[effect] 可取值:
NoSchedule :一定不能被調度(新來的不要來,在這的就別動了)
PreferNoSchedule:盡量不要調度(盡量不要來,除非沒辦法)
NoExecute:不僅不會調度,還會驅逐Node上已有的Pod
kubectl cp my_item.tar.gz redis-6c98cb5b5f-nxb59:/tmp/ #宿主機拷貝到容器內
kubectl cp redis-6c98cb5b5f-nxb59:/tmp/start.sh ./start.sh #pod內文件拷貝到宿主機
靜態pod
是由 kubelet
管理的,只在特定node上存在的pod;靜態pod總是由kubelet創建的,并且只在kubelet所在的Node上運行。靜態pod 不能通過
api-server來管理,無法和 RC,RS,Deployment或者 DaemonSet進行關聯;并且 kubelet無法對靜態pod
進行健康檢查。
靜態pod資源文件默認存放路徑/etc/kubernetes/manifests,也可以直接查看kubelet啟動參數staticPodPath: /etc/kubernetes/manifests配置確定。?
kubectl exec -it kafka-1-192.168.0.1 -c kafka sh #進入靜態pod
-c #po有多個容器要加-c指定
kubectl logs kafka-1-192.168.0.1 -c kafka
4、K8S問題定位
處理K8S環境問題,首先要了解pod的生命周期和pod的狀態

常見狀態原因
- ImagePullBackOff 鏡像拉取失敗,網絡不通,鏡像名稱有誤或者鏡像倉庫認證失敗都可能有這個報錯。
- CrashLoopBackOff 探針檢測失敗,服務對網絡或者其他pod服務有依賴等,此外宿主機上的安全軟件可能也會導致容器無法正常啟動。
- Pending 一般是調度失敗,pod沒有可調度的節點,常見原因:節點有污點,不滿足節點親和性,或者節點處于notready狀態。
- Evicted 當節點內存、磁盤或者cpu資源不足時,K8s 會按照 QoS 等級對節點上的某些 Pod 進行驅逐,釋放資源保證節點可用性,kubelet可以配置內存,cpu和磁盤的驅逐閾值。
- Terminating pod刪除后超過terminationGracePeriodSeconds參數時間還處于Terminating狀態可能是存在節點故障,和master節點失聯,可以檢查節點狀態或者嘗試重啟kubelet
- Completed 此狀態通常是job類的pod執行完成了正常退出容器。
- Init:Error pod初始化失敗,可以查看init pod的日志定位。
問題定位經常需要使用如下命令:
kubectl logs -f podname
kubectl logs -f -l app=nginx-test #多副本情況下,可以看到所有pod日志
kubectl describe pods podname #pod啟動日志
kubectl describe node 192.168.0.1 #節點狀態日志
kubectl get events #查看集群事件
系統服務查看
systemctl status kubelet/docker/etcd
系統服務日志查看
journalctl -xeu kubelet/docker
--since指定時間
??https://kubernetes.io/zh-cn/docs/home/???