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提供集群日志采集、存储与查询

posted @ 2020-08-12 16:13  名字很长容易被惦记  阅读(4812)  评论(0编辑  收藏  举报