我在GKE中创建了一个k8集群。
我在Artifactory中创建了一个docker注册表,该工件托管在AWS上。我在 aws.abc.com AWS的托管区域中有 docker-repo.aws.abc.com 的route53条目
现在,我需要配置集群,以便从工件中提取Docker映像。
我仔细阅读了文档,了解到我必须在 kube-dns 配置图中添加 stubDomain 。
kubectl edit cm kube-dns -n kube-system
apiVersion: v1
data:
stubDomains: |
{"aws.abc.com" : ["XX.XX.XX.XX"]}
kind: ConfigMap
metadata:
creationTimestamp: 2019-05-21T14:30:15Z
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: kube-dns
namespace: kube-system
resourceVersion: "7669"
selfLink: /api/v1/namespaces/kube-system/configmaps/kube-dns
uid: f378aa5f-7bd4-11e9-9df2-42010aa93d03
但是,docker pull命令仍然失败。
docker pull docker-repo.aws.abc.com/abc-sampleapp-java/abc-service:V-57bc9c9-201
Error response from daemon: Get https://docker-repo.aws.abc.com/v2/: dial tcp: lookup docker-dev-repo.aws.abc.com on 169.254.169.254:53: no such host
注意:当我在工作节点上的 / etc / hosts 文件中输入条目时,docker pull可以正常工作。
答案 0 :(得分:0)
与从群集内的Pod调用DNS相比,从Pod启动时从注册表中提取图像使用的 DNS设置不同。
当Kubernetes启动新的Pod时,它将其调度到节点,然后名为 kubelet 的节点上的代理调用容器引擎(Docker)下载映像并以设计的配置运行它。
Docker使用系统DNS解析注册表的地址,因为它可以在我们的主机系统上正常运行,而不是在Kubernetes中运行,这就是为什么任何DNS设置都不会影响映像上DNS解析的原因下载阶段。 https://github.com/kubernetes/kubernetes/issues/8735是在Github上进行的讨论。
如果我们要更改DNS设置并覆盖注册表IP以在图像下载阶段使用它,则应在主机系统中进行设置。在配置中,我们需要修改群集中所有节点上的DNS设置。最简单的方法是使用 / etc / hosts 文件,并使用您的自定义IP添加记录,例如192.168.1.124 example.com。
修改后,节点上的Docker将使用 / etc / hosts 中的记录而不是全局DNS记录作为注册表,因为该文件具有更高的优先级,并且您可以使用以下命令运行pod您的图片。
更新主机文件。 您可以将具有安全上下文的DeamonSet特权使用,如下所示:
apiVersion: extensions/v1beta1
metadata:
name: ssd-startup-script
labels:
app: ssd-startup-script
spec:
template:
metadata:
labels:
app: ssd-startup-script
spec:
hostPID: true
containers:
- name: ssd-startup-script
image: gcr.io/google-containers/startup-script:v1
imagePullPolicy: Always
securityContext:
privileged: true
env:
- name: STARTUP_SCRIPT
value: |
#!/bin/bash
<YOUR COMMAND LINE>
<YOUR COMMAND LINE>
<YOUR COMMAND LINE>
echo Done```
you need to run the kubectl apply -f <demonset yaml file>