[TOC]

0x00 简述

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


0x01 配置文件与启动参数

Kubelet 启动参数

启动参数总结一览表:

1
--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
    2
    3
    4
    5
    6
    #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状态查看异常问题
问题描述:

1
2
3
$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 的情况
    1
    2
    3
    NAME                                          READY   STATUS              RESTARTS   AGE
    coredns-94d74667-6dj45 1/1 ImagePullBackOff 0 12m
    calico-node-4vql2 1/1 Pending 0 12m
    解决方法如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #(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

    WeiyiGeek.Pending

  • 2.输出结果中某个 Pod 长期处于 ContainerCreating、PodInitializing 或 Init:0/3 的状态:
    解决办法:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #(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 是否正确设置? 是否有安全组或防火墙的限制?
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      #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
错误信息:

1
2
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
解决办法:
1
2
3
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config


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

1
2
3
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);
解决办法: 执行以下命令重置初始化信息,然后在重新初始化;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
错误信息:

1
2
[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服务然后再执行节点的重置操作
1
docker stop $(docker ps -aq) && systemctl stop docker


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

1
2
3
4
5
6
7
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查看镜像是否能被拉取;
1
2
3
4
5
6
7
# 常规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;
问题描述:

1
2
3
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进行访问与
问题解决:
1
2
3
$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