k8s常見操作、報錯匯總-持續更新


操作

一、k8s禁止master節點調度

有兩種方法,一種是自帶的命令(越來越完善了)另一種是通過添加污點來禁止調度。

1、自帶命令
cordon 和 uncordon是k8s上的兩個維護命令,一般用於節點出現問題時維護使用的。

kubectl cordon master禁止節點調度

kubectl uncordon master 允許節點調度

2、設置污點

語法:

kubectl taint node [node] key=value[effect]

[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
NoSchedule: 一定不能被調度
PreferNoSchedule: 盡量不要調度
NoExecute: 不僅不會調度, 還會驅逐Node上已有的Pod

示例:
kubectl taint node k8s-master node-role.kubernetes.io/master-允許master調度

kubectl taint nodes master node-role.kubernetes.io/master=:NoSchedule禁止master調度

kubectl describe node master |grep Taints查看污點

3、設置容忍master污點
在 pod 的 spec 中設置 tolerations 字段
tolerations:

  • key: "node-role.kubernetes.io/master"
    operator: "Equal"
    value: ""
    effect: "NoSchedule"

二、k8s強制刪除Terminating狀態的資源

kubectl delete pod [pod name] --force --grace-period=0 -n [namespace] pod

kubectl patch pv pv001 -p '{"metadata":{"finalizers":null}}' pv

kubectl patch pvc my-pvc -p '{"metadata":{"finalizers": []}}' --type=merge pvc

三、運行狀態查看

nodeport 占用
kubectl get service -n kxyyq4 |grep NodePort
cpu占用
kubectl top pod -n kxyyq4
列出的cpu,比如700m就是7個完整的CPU。找到對應的rs調整他的cpu就好了。

命名空間設置資源限額
kubectl describe namespace kxyyq4

四、k8s時區問題

時區問題其實是docker容器的問題,制作鏡像的時候設置好的話是沒有這種問題的。
如果忘記設置的話,只好在k8s部署pod的時候,設置環境變量或者掛載本地時區文件來解決。

apiVersion: v1
kind: Pod
metadata:
  name: busy-box-test
  namespace: default
spec:
  restartPolicy: OnFailure
  containers:
  - name: busy-box-test
    image: busybox
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: date-config
      mountPath: /etc/localtime
    command: ["sleep", "60000"]
  volumes:
  - name: date-config
    hostPath:
      path: /etc/localtime

五、刪除terminating狀態的命名空間

查看命名空間kubect get ns 發現有命名空間rook-ceph是removeing狀態

1、執行刪除沒有反應

kubectl delete ns rook-ceph

2、執行強制刪除狀態變為terminating狀態

kubectl delete ns rook-ceph --force --grace-period=0

3、從接口刪除

(1)生成狀態文件

kubectl get ns rook-ceph -ojson > tmp.json

(2)在生成的tmp.json中刪除一下代碼段

 "spec": {        
 	"finalizers": [            
 		"kubernetes"        
 	]    
 },

(3)創建匿名用戶權限

不開啟權限執行刪除會報403錯誤

kubectl create clusterrolebinding test:anonymous --clusterrole=cluster-admin --user=system:anonymous

(4)刪除

curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://k8s.ict.ac.cn:6443/api/v1/namespaces/rook-ceph/finalize

(5)刪除匿名用戶

kubectl  get  clusterrolebinding

kubectl delete clusterrolebinding test:anonymous

六、加入節點命令

k8s加入節點的token有效期只有24小時,之后想要加入節點就要重新生成token
在master上執行
kubeadm token create --print-join-command
將生成的命令到要加入集群的節點上執行

七、添加label

#添加
kubectl label nodes <node-name> <label-key>=<label-value> 
#刪除
kubectl label nodes <node-name> <label-key>-
#修改
kubectl label nodes <node-name> <label-key>=<label-value> --overwrite
#查看
kubectl get node --show-labels

報錯

一、rancher無法連接鏡像庫憑證

rancher中使用私有鏡像庫主要分一下幾個流程:

  1. 在服務器上登錄harbor生成登錄認證文件
  2. 在k8s上配置連接harbor的秘鑰文件
  3. 在rancher鏡像中引用

從以上3點出發解決問題:

  1. 在集群的都每台節點上都要登陸一下harbor,在~/.docker/config.json文件中產生認證信息。
  2. 在k8s集群中生成秘鑰文件
    kubectl create secret docker–registry —docker–server=<your–registry–server> —docker–username=<your–name> —docker–password=<your–pword> —docker–email=<your–email>。

:所創建的私有鏡像倉庫密鑰的名稱;
:為鏡像倉庫的服務器地址;
:登錄鏡像倉庫的用戶名;
:登錄鏡像倉庫的密碼;
:用戶的郵箱地址。
注意secret的名稱空間,在哪個名稱空間部署應用就把secret建在哪個名稱空間下

3.在rancher發布的時候要引用完整的鏡像地址

如果是rancher導入的外部集群,還可能是因為rancher配置的鏡像庫憑證和K8S集群使用命令行創建的憑證不一致導致的。解決的辦法就是在K8S集群上刪除憑證,在rancher上再創建一次憑證。或者在鏡像中使用imagePullSecrets指定鏡像憑證

二、在節點執行kubectl報錯

kbectl get nodes 提示the server doesn't have a resource type "nods"
需要把master的/root/.kube/config 拷貝到該節點同樣位置

三、重裝節點后,無法加入master

Failed to connect to API Server "10.61.1.29:6443": token id "3d069l" is invalid for this cluster or it has expired. Use "kubeadm token create" on the master node to creating a new valid token
這個問題一般是token過期了,執行kubeadm token create將生成的tocken放入jion命令:
如:kubeadm join x.x.x.x:6443 --token 8fo1ol.5ffzezsgfrp7rmc1 --discovery-token-ca-cert-hash sha256:d626ee9be9d4fcbe8c2cce33225e04e3eb775b641ee95bfa9740f1a0113ed376

四、點重新加入集群后,啟動網絡失敗

Failed create pod sandbox: rpc error: code = Unknown desc = NetworkPlugin cni failed to set up pod "busybox-test-bl7w2_kxyyq4" network: failed to set bridge addr: "cni0" already has an IP address different from 10.244.9.1/24
處理辦法重置node節點,重新加入集群

kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
##重啟kubelet
systemctl restart kubelet
##重啟docker
systemctl restart docker

五、read-only range request "key: xxxxx took too long

1、現象:使用rancher導入k8s集群的時候,無法運行,rancherUI顯示等待apiserver啟動。
2、查看master的apiserver發現以下報錯:

read-only range request "key:\"/registry/validatingwebhookconfigurations/\" range_end:\"/registry/validatingwebhookconfigurations0\" " with result "range_response_count:0 size:7" took too long (131.950418ms) to execute

此時容器是運行狀態,沒有問題。

3、解決:
先不管報錯,查看k8s集群的狀態,挨個查master上的apiserver。發現其中一台master的apiserver是掛掉的狀態,原因沒有更新這一台的證書。更新后重啟apiserver容器,重新導入集群,成功。查看apiserver日志,報錯消失。

六、kubeadm init的時候可能出現cgroup driver: "systemd

failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"
原因是docker的Cgroup Driver和kubelet的Cgroup Driver不一致。
有兩種方式解決問題,一種是修改docker,,另一種是修改kubelet;
1.修改/etc/docker/daemon.json文件

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl daemon-reload
systemctl restart docker

2、修改kubelet的Cgroup Driver
修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件,增加--cgroup-driver=cgroupfs
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=cgroupfs"
重啟kubelet

systemctl daemon-reload
systemctl restart kubelet

那么為什么要修改docker的cgroup driver呢,
Kubernetes 推薦使用 systemd 來代替 cgroupfs
因為systemd是Kubernetes自帶的cgroup管理器, 負責為每個進程分配cgroups, 但docker的cgroup driver默認是cgroupfs,這樣就同時運行有兩個cgroup控制管理器, 當資源有壓力的情況時,有可能出現不穩定的情況。

七、節點加入集群命令

在master上執行
kubeadm token create --print-join-command

八、failed to set supported cgroup subsystems for cgroup

ailed to start ContainerManager failed to initialize top level QOS containers:
failed to update top level Burstable QOS cgroup :
failed to set supported cgroup subsystems for cgroup
[kubepods burstable]: failed to find subsystem mount for required subsystem: pids

解決:vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--feature-gates SupportPodPidsLimit=false --feature-gates SupportNodePidsLimit=false"

故障排查思路

Kubernetes主要由以下幾個核心組件組成:

etcd保存了整個集群的狀態;
apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API注冊和發現等機制;
controller manager負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;
kubelet負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理;
Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI);
kube-proxy負責為Service提供cluster內部的服務發現和負載均衡;
除了核心組件,還有一些推薦的Add-ons:

kube-dns負責為整個集群提供DNS服務
Ingress Controller為服務提供外網入口
Heapster提供資源監控
Dashboard提供GUI
Federation提供跨可用區的集群
Fluentd-elasticsearch提供集群日志采集、存儲與查詢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM