【问题标题】:How to add custom nameserver under /etc/resolv.conf into pod?如何将 /etc/resolv.conf 下的自定义名称服务器添加到 pod 中?
【发布时间】:2020-02-29 04:55:50
【问题描述】:

哪个服务在 pods 的 /etc/resolv.conf 下分配名称服务器,通常它应该从主机 /etc/resolv.conf 提取,我在 pods 的 /etc/resolv.conf 下看到不同的名称服务器,有没有kbernetes(kubedns) 上的配置,我可以对其进行配置,以便 pod /etc/resolv.conf 具有 8.8.8.8

【问题讨论】:

    标签: kubernetes kubernetes-helm kubernetes-pod


    【解决方案1】:

    kube-dns 确实修改了这个文件(通过 Kubelet)。 kube-dns 监视 API 服务器并观察服务和端点的变化并保持 DNS 记录是最新的。 在集群中,您应该使用内部 Kubernetes DNS。

    DNS 是附加控制器,您可以使用任何其他实现。

    看看here

    如果你想覆盖 kube-dns

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: default
      name: dns-example
    spec:
      containers:
        - name: test
          image: nginx
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
          - 1.2.3.4
        searches:
          - ns1.svc.cluster-domain.example
          - my.dns.search.suffix
        options:
          - name: ndots
            value: "2"
          - name: edns0
    

    DNS Policy

    【讨论】:

    • 你能提供任何支持这个理论的信息吗?从未听说过 kube-dns 修改 /etc/resolv.conf 文件。
    • @suren 当然,这是通过 Kubelet 间接完成的。
    • 我不这么认为。我想说你把kube-dnskube-proxy 混淆了。
    • 我相信 kube-proxy(在当前实现中)只会修改 iptables。
    • 那么,您是否阅读过kube-dns 修改(直接或间接)resolv.conf 文件的任何地方?因为“绝对”听起来很自信,而且根本没有任何意义。
    【解决方案2】:

    从k8s 1.9开始,如果你想为一个pod设置一个特定的dns配置,你可以使用dns policy None

    它允许 Pod 忽略 Kubernetes 环境中的 DNS 设置。所有 DNS 设置都应该使用 Pod Spec 中的 dnsConfig 字段来提供。

    默认情况下,nameserver IP 是 kube-dns 的 Kubernetes 服务 IP

    cat /etc/resolv.conf
    nameserver 10.96.0.10
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
    
    kubectl get service -n kube-system
    kube-dns               ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   2d21h
    

    在部署部分使用此配置:

      dnsConfig:
        nameservers:
          - 8.8.8.8
      dnsPolicy: "None"
    

    cat /etc/resolv.conf nameserver 8.8.8.8

    【讨论】:

      【解决方案3】:

      你有两个选择:

      1.- 将其放在configMap 中,并将其映射到/etc/resolv.conf,在这种情况下,它将被configMap 中的内容替换。

      2.- 你可以这样做:

      apiVersion: v1
      kind: Pod
      metadata:
        namespace: default
        name: my-pod
      spec:
        containers:
          - name: nginx
            image: nginx
        dnsPolicy: "None"
        dnsConfig:
          nameservers:
            - 8.8.8.8
      

      这样您就可以映射dnsConfig/etc/resolv.conf 下的任何内容

      # cat /etc/resolv.conf
      nameserver 8.8.8.8
      

      实际上还有另一种方法,通过“破解”kube-dns,upstreamNameservers

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: kube-dns
        namespace: kube-system
      data:
        upstreamNameservers: |
          ["8.8.8.8", "8.8.4.4"]
      

      但在这种情况下,您不会在 pod 内执行任何操作(因此 /etc/resolv.conf 不会被修改),但 kube-dns 会使用这些名称服务器来解析。

      【讨论】:

      • 谢谢 是否可以在 podTemplate(label: label, containers: [ containerTemplate(name: 'maven', image: 'maven:3.5-jdk-8', command: 'cat ', ttyEnabled: true) ],
      【解决方案4】:

      @venkatesh 我认为您指的是詹金斯文件中使用的 podTemplate() 。 如果是这样的话,试试这个

      podTemplate( yaml:"""
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod-example
      spec:
        containers:
        - name: ubuntu
          image: ubuntu:trusty
          command: ["echo"]
          args: ["Hello World"]
       dnsPolicy: "None"
       dnsConfig:
         nameservers:
         - 8.8.8.8
      """)
      

      yaml 文件可以直接在 jenkins 文件中用作模板。 https://github.com/jenkinsci/kubernetes-plugin/blob/master/examples/ 中有更多示例。

      【讨论】:

        【解决方案5】:

        对于部署在 Kubernetes 上的 Jenkins,我遇到了同样的问题。如果您没有提及名称服务器,那么 /etc/resolv.conf 会显示默认名称服务器(k8s 的 ip)。 我通过修改部署文件解决了这个问题

              dnsPolicy: "None"
              dnsConfig:
                nameservers:
                  - 8.8.8.8
        

        并应用它。

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: jenkins
          namespace: jenkins
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: jenkins
          template:
            metadata:
              labels:
                app: jenkins
            spec:
              containers:
              - name: jenkins
                image: jenkins/jenkins:lts
                ports:
                  - name: http-port
                    containerPort: 8080
                  - name: jnlp-port
                    containerPort: 50000
                volumeMounts:
                  - name: jenkins-vol
                    mountPath: /var/jenkins_vol
              dnsPolicy: "None"
              dnsConfig:
                nameservers:
                  - 8.8.8.8    
              volumes:
                - name: jenkins-vol
                  emptyDir: {}
        

        【讨论】:

          猜你喜欢
          • 2016-08-22
          • 2013-05-18
          • 2011-05-23
          • 1970-01-01
          • 2016-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-04
          相关资源
          最近更新 更多