排错常用的命令
journalctl -xefu kubelet
systemctl status kubelet
docker ps | grep NAME
kubectl get cs
kubectl get nodes #获取集群状态
kubectl get pods -n kube-system
1.系统初始化时遇到的问题
this version of kubeadm only supports deploying clusters with the control plane version >= 1.13.0. Current version: v1.11.1
换一个k8s的版本:
kubeadm init --kubernetes-version=v1.18.6 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
2.镜像拉取的问题
a.先进入https://hub.docker.com/search?q=kube-proxy&type=image,找一个k8s的镜像源,点击进去复制拉取的地址
b.写个脚本自动拉取镜像,并自动打tag
c.配置一个加速源,添加一个文件/etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
重启:systemctl daemon-reload
systemctl restart docker
#!/bin/bash
#可能有些版本镜像在这个仓库下是没有的,这时可以拉取一个其他版本的,然后打个tag就行
KUBE_VERSION=v1.18.6
KUBE_PAUSE_VERSION=3.2
ETCD_VERSION=3.4.3-0
DNS_VERSION=1.6.7
GCR_URL=k8s.gcr.io
##这里就是写你要使用的仓库
DOCKERHUB_URL=kubesphere
##这里是镜像列表
images=(
kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${DNS_VERSION}
)
##这里是拉取和改名的循环语句
for imageName in ${images[@]} ; do
docker pull $DOCKERHUB_URL/$imageName
docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
docker rmi $DOCKERHUB_URL/$imageName
done
3.拉取镜像报错
Error response from daemon: manifest for kubesphere/etcd:3.4.3 not found: manifest unknown: manifest unknown
这个是因为镜像不存在,可以拉取一个其他版本的镜像然后tag一下,恢复到指定的名称
4.docker驱动配置问题
Failed to start ContainerManager failed to initialize top level QOS containers: failed to update top
配置完成后,重启一下主机
vim /usr/lib/systemd/system/docker.service文件
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
5.failed to set supported cgroup subsystems for cgroup [kubepods besteffort]: failed to find subsystem mount for required subsystem: pids
解决:在/etc/sysconfig/kubelet文件中添加--feature-gates SupportPodPidsLimit=false --feature-gates SupportNodePidsLimit=false
6.unable to recognize “https://raw.githubusercontent.com/coreos/flannel/c5d10c8/Documentation/kube-flannel.yml”: no matches for kind “DaemonSet” in version “extensions/v1beta1”
解决:换一个flannel文件,部署完成后,稍等几分钟网络pods就可以起来了,网络pods起来了coredns就可以起来了
7.Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitializ
稍等几分钟
8.kubectl get cs获取集群状态时
Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused
解决: 修改/etc/kubernetes/manifest/中的相应文件,去掉--port字段,稍等1分钟就好了
9.failed to decode cluster configuration data: no kind “ClusterConfiguration” is registered
kubernetes的源不一致,会导致两台机器安装的kubadm版本不一致,致使node节点使用join命令加入集群时报上面的错误。
最好使用scp命令将kuernetes源文件copy成一致,并重新安装kubeadm,使版本一致
10.使用root用户运行相应的命令报错
# 应该使用普通用户运行相关命令,而不是root用户(提前需要配置普通用户)
[root@k8s-master ~]# kubectl get pods -n kube-system
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
11./var/lib/kubelet/config.yaml", error: open /var/lib/kubelet/config.yaml: no such file or directory(查看集群状态是,node01位NotReady状态)
解决:a.可能是集群中原本就有这个节点的信息,因此需要kubectl delete node node_name来删除,然后再重新加入集群
12.使用kubectl get pods -n kube-system
时,有一个kube-proxy是异常的,同时flannel插件本来是正常running状态,但是过一会后也变得异常。
这个一般是多个节点中,有一个节点的镜像版本是有问题的,因为集群的kube-proxy使用
的是同一个版本,一旦某个节点的镜像版本不符合,那么就会有问题
13.使用local path provisioner
创建的pv, storageClassName
为local-path
,granfana上使用,在一次机缘巧合之下,某个节点被移出了集群,并且pvc是绑定在这个节点上的,所以导致了pod一直处于pending
状态,pod报错内容为2 node(s) had volume node affinity conflict.
解决方式
1.查看pv,找到pod使用的pv
~]# kubectl get pv
~]# kubectl describe pv pvc-e9d1dc5d-3316-49af-b73f-26600d80bc0f
Name: pvc-e9d1dc5d-3316-49af-b73f-26600d80bc0f
Labels: <none>
Annotations: pv.kubernetes.io/provisioned-by: rancher.io/local-path
Finalizers: [kubernetes.io/pv-protection]
StorageClass: local-path
Status: Bound
Claim: default/prom-data-prometheus-kube-prometheus-stack-prometheus-0
Reclaim Policy: Delete
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 50Gi
Node Affinity: # 此处的配置表示他已经绑定到了test-k8s-node-03节点,
# 但是节点test-k8s-node-03已经被移除集群了,因此这个pv是有问题的
Required Terms:
Term 0: kubernetes.io/hostname in [test-k8s-node-03]
Message:
Source:
Type: HostPath (bare host directory volume)
Path: /opt/local-path-zcy/pvc-e9d1dc5d-3316-49af-b73f-26600d80bc0f_default_prom-data-prometheus-kube-prometheus-stack-prometheus-0
HostPathType: DirectoryOrCreate
Events: <none>
2.导出pv配置,删除关联的pvc,删除此pv
3.删除重新创建pod,一般到这一步问题就会解决
4.如果pod不能自建pvc,那么就得手动重新创建一个pvc(可选)
手动重建pvc
# 创建pvc后,local path provisioner`会自动创建相应的pv
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: kube-prometheus-stack-grafana
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 10Gi
14.使用kubectl apply -f example.yaml
的时候。报rom server for: "example.yaml": resource name may not be empty
解决
1.这是因为这个yaml文件里面有某个或者某些资源没有名字,简单来说就是metadata字段里面没有name字段
2.需要编辑这个yaml文件,然后在资源的metadata字段下加一个name字段,然后自定义一个名字