如何在GKE中将私有DNS区域添加到kube-dns

时间:2019-05-21 15:19:46

标签: kubernetes google-kubernetes-engine kube-dns coredns

我在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可以正常工作。

1 个答案:

答案 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>