n-Kubernetes配置解析与入坑解决FAQ记录

时间:2022-07-28
本文章向大家介绍n-Kubernetes配置解析与入坑解决FAQ记录,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

[TOC]

0x00 简述

描述:在学习任何一门新技术总是免不了坑坑拌拌,当您学会了记录坑后然后将其记录当下次遇到,相同问题的时候可以第一时间进行处理;

0x01 配置文件与启动参数

Kubelet 启动参数

启动参数总结一览表:

--register-node [Boolean] # 节点是否自动注册

/etc/kubernetes/kubelet.conf

关于构建环境

您可以根据自己的情况将构建环境与部署环境分开,例如:

学习时,参考本教程,使用 kubernetes 的 master 节点完成 构建和镜像推送
开发时,在自己的笔记本上完成 构建和镜像推送
工作中,使用 Jenkins Pipeline 或者 gitlab-runner Pipeline 来完成 构建和镜像推送

0x02 入坑弃坑

安装所遇

问题1.初始化master节点问题:

  • APISERVER_NAME 不能是 master 的 hostname,且必须全为小写字母、数字、小数点,不能包含减号export APISERVER_NAME=apiserver.weiyi
  • POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠( CIDR 值:无类别域间路由,Classless Inter-Domain Routing),export POD_SUBNET=10.100.0.1/16
#1.如不能下载 kubernetes 的 docker 镜像 ,请替换镜像源以及手工初始化
imageRepository: gcr.azk8s.cn/google-containers
imageRepository: mirrorgcrio

#2.检查环境变量
echo MASTER_IP=${MASTER_IP} && echo APISERVER_NAME=${APISERVER_NAME} && echo POD_SUBNET=${POD_SUBNET}

注意事项:

  • 重新初始化 master 节点前,请先执行 kubeadm reset -f 操作;

问题2.Master与pod状态查看异常问题 问题描述:

$kubectl get pods calico-node-4vql2 -n kube-system -o wide
NAME                READY   STATUS    RESTARTS   AGE     IP       NODE   NOMINATED NODE   READINESS GATES
calico-node-4vql2   0/1     Pending[ImagePullBackoff ]   0          7m22s   <none>   node   <none>           <none>
  • 1.如果输出结果中出现 ImagePullBackoff 或者长时间处于 Pending 的情况
NAME                                          READY   STATUS              RESTARTS   AGE
coredns-94d74667-6dj45                        1/1     ImagePullBackOff    0          12m
calico-node-4vql2                             1/1     Pending             0          12m
  • 12m 解决方法如下:
#(1)通过get pods找到pod被调度到了哪一个节点并,确定 Pod 所使用的容器镜像:
kubectl get pods calico-node-4vql2 -n kube-system -o  yaml | grep image:
- image: calico/node:v3.13.1
- image: calico/cni:v3.13.1
- image: calico/pod2daemon-flexvol:v3.13.1

kubectl get pods coredns-94d74667-6dj45 -n kube-system -o yaml | grep image:
- image: registry.aliyuncs.com/google_containers/coredns:1.3.1

#(2)在 Pod 所在节点执行 docker pull 指令(当Node状态为NotReady时候也可以采用此种方法,但不是唯一)d
docker pull calico/node:v3.13.1
docker pull calico/cni:v3.13.1
docker pull calico/pod2daemon-flexvol:v3.13.1

docker pull registry.aliyuncs.com/google_containers/coredns:1.3.1

#(3)然后在master节点上查看状态恢复正常
NAME                                       READY   STATUS    RESTARTS   AGE   IP              NODE   NOMINATED NODE   READINESS GATES
calico-node-4vql2                          1/1     Running   0          36m   10.10.107.192   node   <none>           <none>

WeiyiGeek.Pending

  • 2.输出结果中某个 Pod 长期处于 ContainerCreating、PodInitializing 或 Init:0/3 的状态: 解决办法:
#(1)查看该 Pod 的状态
kubectl describe pods -n kube-system calico-node-4vql2
kubectl describe pods -n kube-system coredns-8567978547-bmd9f

#(2)如果输出结果中,最后一行显示的是 Pulling image,请耐心等待
Normal  Pulling   44s   kubelet, k8s-worker-02  Pulling image "calico/pod2daemon-flexvol:v3.13.1"

#(3)将该 Pod 删除,系统会自动重建一个新的 Pod
kubectl delete pod kube-flannel-ds-amd64-8l25c -n kube-system

问题3.worker节点 join加入cluster集群不成功的几种情况

  • 1.#worker 节点不能访问 apiserver
    • 如果 master 节点能够访问 apiserver、而 worker 节点不能,则请检查自己的网络设置,/etc/hosts 是否正确设置? 是否有安全组或防火墙的限制?
#master节点验证
curl -ik https://localhost:6443
#worker节点验证
curl -ik https://apiserver.weiyi:6443
#正常输出结果如下所示:
HTTP/1.1 403 Forbidden
Cache-Control: no-cache, private
Content-Type: application/json
X-Content-Type-Options: nosniff
Date: Fri, 15 Nov 2019 04:34:40 GMT
Content-Length: 233
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
...
  • 2.#worker 节点默认网卡
    • Kubelet使用的 IP 地址 与 master 节点可互通(无需 NAT 映射),且没有防火墙、安全组隔离
  • 3.#master 节点生成的token已过有效时间为 2 个小时 kubeadm token create

问题4.在master节点上执行kubectl命令报错localhost:8080 was refused 错误信息:

kubectl apply -f calico-3.13.1.yaml
The connection to the server localhost:8080 was refused - did you specify the right host or port?

错误原因: 由于在初始化之后没将k8s的/etc/kubernetes/admin.conf拷贝到用户的加目录之中/root/.kube/config

解决办法:

rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

问题5:安装K8s时候kubelet报错提示Container runtime network not ready 错误信息:

systemctl status kubelet
6月 23 09:04:02 master-01 kubelet[8085]: E0623 09:04:02.186893    8085 kubelet.go:2187] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady mes...ninitialized
6月 23 09:04:04 master-01 kubelet[8085]: W0623 09:04:04.938700    8085 cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d

问题原因: 由于master节点初始化安装后报错,在未进行重置的情况下又进行初始化操作或者重置操作不完整导致,还有一种情况是没有安装网络组件比如(flannel 或者 calico);

解决办法: 执行以下命令重置初始化信息,然后在重新初始化;

systemctl stop kubelet
docker stop $(docker ps -aq)
docker rm -f $(docker ps -aq)
systemctl stop docker
kubeadm reset
rm -rf $HOME/.kube /etc/kubernetes
rm -rf /var/lib/cni/ /etc/cni/ /var/lib/kubelet/* 
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
systemctl start docker
systemctl start kubelet


#安装 calico 网络插件
rm -f calico-3.13.1.yaml
wget -L https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml

问题6:执行kubeadm reset无法进行节点重置,提示retrying of unary invoker failed; 错误信息:

[reset] Removing info for node "master-01" from the ConfigMap "kubeadm-config" in the "kube-system" Namespace
{"level":"warn","ts":"2020-06-23T09:10:30.074+0800","caller":"clientv3/retry_interceptor.go:61","msg":"retrying of unary invoker failed","target":"endpoint://client-174bf993-5731-4b29-9b30-7e958ade79a4/10.10.107.191:2379","attempt":0,"error":"rpc error: code = Unknown desc = etcdserver: re-configuration failed due to not enough started members"}

问题原因: 在重置前etcd容器处于运转之中导致无法进行节点的重置操作;

解决办法: 停止所有的容器以及docker服务然后再执行节点的重置操作

docker stop $(docker ps -aq) && systemctl stop docker

问题7:节点初始化在进行preflight时候提示error execution phase preflight:[ERROR ImagePull] 问题描述:

kubeadm init --config=kubeadm-config.yaml --upload-certs
W0623 09:17:13.281279   29557 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.18.4
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR ImagePull]: failed to pull image registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.4: output: Error response from daemon: manifest for registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.4 not found: manifest unknown: manifest unknown
, error: exit status 1

问题原因: 由于k8s.gcr.io官方镜像网站无法下载镜像,而采用的同步镜像源站registry.cn-hangzhou.aliyuncs.com/google_containers/仓库中没有指定k8s版本的依赖组件;

解决办法: 换其它镜像进行尝试或者离线将镜像包导入的docker中(参考前面的笔记2-Kubernetes入门手动安装部署),建议在进行执行上面的命令前先执行kubeadm config images pull --image-repository mirrorgcrio --kubernetes-version=1.18.4查看镜像是否能被拉取;

# 常规k8s.gcr.io镜像站点
gcr.azk8s.cn/google_containers/
registry.aliyuncs.com/google_containers/
registry.cn-hangzhou.aliyuncs.com/google_containers/

# harbor中k8s.gcr.io的镜像
mirrorgcrio

问题8:容器内部Kubernetes Service不能ping; 问题描述:

PING gateway-example.example.svc.cluster.local (10.105.141.232) 56(84) bytes of data.
From 172.17.76.171 (172.17.76.171) icmp_seq=1 Time to live exceeded
From 172.17.76.171 (172.17.76.171) icmp_seq=2 Time to live exceeded

问题原因:在 Kubernetes 的网络中Service 就是 ping 不通的,因为 Kubernetes 只是为 Service 生成了一个虚拟 IP 地址,实现的方式有三种 User space / Iptables / IPVS 等代理模式;

不管是哪种代理模式Kubernetes Service 的 IP 背后都没有任何实体可以响应「ICMP」全称为 Internet 控制报文协议(Internet Control Message Protocol),但是可以通过curl或者telnet进行访问与

问题解决:

$kubectl cluster-info
# Kubernetes master is running at https://k8s.weiyigeek.top:6443
# KubeDNS is running at https://k8s.weiyigeek.top:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

0x03 FAQ

https://www.cnblogs.com/dwq-good/p/13175150.html

https://www.cnblogs.com/klvchen/archive/2018/09/04/9585746.html

https://blog.csdn.net/weixin_39963973/article/details/80568498

https://blog.csdn.net/weixin_43224068/article/details/104060320

https://www.cnblogs.com/djoker/p/10700607.html

https://www.cnblogs.com/minseo/p/12447147.html

https://www.cnblogs.com/1gaoyu/p/12983127.html