(原帖转载自: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 能找到的最接近的结果是:
(所以答案 #1):hostAliases(这是针对 pod 本身的,而不是拉取映像),也是通过 apt/package manager 而不是 snap 安装的。其余答案建议更改发行版,我宁愿使用我当前的设置也不愿更改它。
- - 更新):
- 我已经将问题范围缩小(我相信)为需要设置
containerd
,但尚未找到如何设置主机以匹配服务器的/etc/hosts
文件 - 我使用 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/