Kubernetes 从私有网络拉取镜像 / 未能遵守服务器的 /etc/hosts

Kubernetes 从私有网络拉取镜像 / 未能遵守服务器的 /etc/hosts

(原帖转载自:https://stackoverflow.com/questions/73012913/kubernetes-pull-from-image-private-network-fails-to-respect-etc-hosts-of-serv因为这是一个更适合提出问题的地方)

我正在运行一个小型的 3 节点测试 kubernetes 集群(使用 kubeadm),该集群在 Ubuntu Server 22.04 上运行,并使用 Flannel 作为网络结构。我还有一个单独的 gitlab 私有服务器,其中的容器注册表已设置并正常运行。

我遇到的问题是我有一个简单的测试部署,当我应用部署 yaml 时,它无法从 gitlab 私人服务器中提取图像。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: platform-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: platform-service
  template:
    metadata:
      labels:
        app: platform-service
    spec:
      containers:
        - name: platform-service
          image: registry.examle.com/demo/platform-service:latest

Ubuntu 服务器:/etc/hosts(相关行)

192.168.1.30 registry.example.com

错误

Failed to pull image "registry.example.com/demo/platform-service:latest": 
rpc error: code = Unknown desc = failed to pull and unpack image 
"registry.example.com/deni/platform-service:latest": failed to resolve reference 
"registry.example.com/demo/platform-service:latest": failed to do request: Head 
"https://registry.example.com/v2/demo/platform-service/manifests/latest": dial tcp 
xxx.xxx.xxx.xxx:443: i/o timeout

'xxx.xxx.xxx.xxx' 与我的外部网络相关,该外部网络在 DNS 中存在域名,但是我的所有内部网络都设置为连接到内部网络表示,而'registry.example.com' 则是我自己的域的表示。

另请注意:

docker pull registry.example.com/demo/platform-service:latest

从服务器的命令行来看,工作得很好,只是从 kubernetes deploy yaml 来看却不行。

问题

虽然服务器上的网络和主机文件配置正确,但 docker 镜像无法解析,因为当我应用它时,它没有使用正确的 IP(在主机中配置),而是使用另一个服务器的公共 IP。超时的原因是面向公众的服务器设置不同。

当我运行时,kubectl apply -f platform-service.yaml为什么它不尊重服务器的主机文件,并且有没有办法在 Kubernetes 内部配置主机。

(如果这个问题不清楚,我很抱歉,我还很新,还在学习术语,也许这就是为什么谷歌没有帮助我解决这个问题。)

S/OI 能找到的最接近的结果是:

https://stackoverflow.com/questions/62940403/kubernetes-not-able-pull-image-from-private-registry-having-private-domain-point

(所以答案 #1):hostAliases(这是针对 pod 本身的,而不是拉取映像),也是通过 apt/package manager 而不是 snap 安装的。其余答案建议更改发行版,我宁愿使用我当前的设置也不愿更改它。

- - 更新):

  1. 我已经将问题范围缩小(我相信)为需要设置containerd,但尚未找到如何设置主机以匹配服务器的/etc/hosts文件
  2. 我使用 k3s 而不是 kubeadm 创建了第二个 kubernetes 集群:说明位于https://computingforgeeks.com/install-kubernetes-on-ubuntu-using-k3s/并且遇到了同样的问题。

更新

尝试将主机添加到 coredns 也不起作用: (https://stackoverflow.com/questions/65283827/how-to-change-host-name-resolve-like-host-file-in-coredns

kubectl -n kube-system edit configmap/coredns
...
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        hosts custom.hosts registry.example.com {
            192.168.1.30 registry.example.com
            fallthrough
        }
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
...

删除了 coredns pod(因此它们被重新创建)

并且部署中的 docker pull 仍然失败,原因是外部 IP 地址而不是内部地址。

答案1

在尝试了很多不同的解决方案以及大量的研究和测试之后,答案其实很简单。

我的解决方案

/etc/hosts 文件必须包含注册表的主机(也可能包含 gitlab 实例的条目)每一个集群的节点,包括主节点。

192.168.1.30 registry.example.com
192.168.1.30 gitlab.example.com    # Necessary in my case, not sure required

当我在 2 个从属服务器上分别添加该命令后,它尝试提取图像,但因凭证问题而失败(我原本以为主机问题解决后会出现这种情况)。然后我能够添加凭证,现在图像可以从私有注册表(而不是面向公众的注册表)顺利提取。

奖励:修复连接到私人注册表的凭据错误(不是原始问题的一部分,而是连接设置过程的一部分)

修复 /etc/hosts 问题后,您可能需要设置“regcred”凭据来访问私有注册表,Kubernetes 文档提供了该部分的步骤:

https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

相关内容