操作
一、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中使用私有鏡像庫主要分一下幾個流程:
- 在服務器上登錄harbor生成登錄認證文件
- 在k8s上配置連接harbor的秘鑰文件
- 在rancher鏡像中引用
從以上3點出發解決問題:
- 在集群的都每台節點上都要登陸一下harbor,在~/.docker/config.json文件中產生認證信息。
- 在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提供集群日志采集、存儲與查詢