使用yaml创建pod时发生以下报错的解决方法

pull access denied for , repository does not exist or may require ‘docker login’

原因:拉取镜像使用的secret是要分区 namespace的,原先使用的secret的namespace为default,而pod部署的namespace为另一个,导致找不到secret,

    spec:
      imagePullSecrets: 
      - name: harborsecret-mall

解决方法:在创建secret时,加入namespace

kubectl --namespace kube-system \
    create secret docker-registry regcred \
    --docker-server=<your-registry-server> \
    --docker-username=<your-name> \
    --docker-password=<your-pword> \
    --docker-email=<your-email>

参考链接:在Kubernetes中pull私有镜像

k8s的pod无法互联网

0x01 问题描述

k8s的pod无法互联网

0x02 原因排查

pod互联网访问测试

使用pod直接执行ping命令验证

kubectl exec -it mallpaycenterd-59d888b8c8-ktmhv -n mall ping baidu.com

发现返回报错为Name or service not known

coredns访问测试

通过以上测试初步怀疑是DNS解析出现问题,由于pod进行dns解析默认通过k8s集群的coredns进行域名解析。 查看coredns集群内地址

kubectl exec -it mallpaycenterd-9b775c749-5xnqm  -n mall cat /etc/resolv.conf
nameserver 10.0.0.2
search mall.svc.cluster.local. svc.cluster.local. cluster.local. openstacklocal
options ndots:5

可以发现pod内部使用的coredns地址为10.0.0.2
尝试使用pod内部的ping命令测试10.0.0.2

kubectl exec -it mallpaycenterd-59d888b8c8-ktmhv -n mall ping 10.0.0.2

发现返回报错为Time Out

pod所在的节点排查

查看问题pod所在节点

kubectl get pod -n mall -o wide| grep paycenter|awk '{print $1,$7}' 
mallpaycenterd-9b775c749-5xnqm  node1  

查看coredns所在节点

kubectl get pod -n kube-system -o wide| grep dns |awk '{print $1,$7}'
coredns-65cf74f9cb-snfcq master

发现两个pod部署与不同节点

排查flannel网络

查看master网络配置

ifconfig docker0 | grep inet
        inet 192.188.0.1  netmask 255.255.255.0  broadcast 192.188.0.255
        inet6 fe80::42:2ff:fe51:1a42  prefixlen 64  scopeid 0x20<link>
ifconfig flannel.1 | grep inet
        inet 172.17.28.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::6429:bbff:fe1f:ee2f  prefixlen 64  scopeid 0x20<link>

发现flannel与docker居然不是一个网段的 继续排查node网络配置

ifconfig docker0 | grep inet
        inet 192.188.66.1  netmask 255.255.255.0  broadcast  192.188.66.255
        inet6 fe80::42:55ff:feb4:7784  prefixlen 64  scopeid 0x20<link>
ifconfig flannel.1 | grep inet
        inet 172.17.67.0  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::30bd:faff:febc:5f1a  prefixlen 64  scopeid 0x20<link>

发现flannel与docker居然也不是一个网段的

排查etcd记录的网络信息

etcdctl --endpoints=https://masterip:2379 \
--ca-file=/k8s/etcd/ssl/ca.pem \
--cert-file=/k8s/etcd/ssl/server.pem \
--key-file=/k8s/etcd/ssl/server-key.pem \
ls /coreos.com/network/subnets
/coreos.com/network/subnets/172.17.67.0-24
/coreos.com/network/subnets/172.17.28.0-24

发现etcd存储的网络段正常的下发给了flannel,但docker并未使用该网段

排查docker启动配置

[Unit]
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

发现docker启动时并没有加载flannel网络配置,而是随机生成了一个网段

0x03 解决方案

  • 修改docker的启动配置,修改/usr/lib/systemd/system/docker.service

    ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock
    修改为
    EnvironmentFile=/run/flannel/subnet.env
    ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
  • 删除docker的网络配置缓存
    cp -r /var/lib/docker/network/files/ /var/lib/docker/network/files.bak
    rm -rf /var/lib/docker/network/files/
    
  • 重启docker
    systemctl-reload 
    systemctl restart docker
    

参考链接

1.我的 K8S 架构搭建 之旅
2.Flannel 只分配一个 /24 子网的问题解决
3.Kubernetes集群之Flannel网络
4.Kubernetes集群之Flannel网络