美文网首页
kubernetes 容器 DNS 设置

kubernetes 容器 DNS 设置

作者: 走在成长的道路上 | 来源:发表于2019-03-28 18:39 被阅读0次

    添加默认配置

    在 kubernetes 中将 DNS 设置配置在 dnsConfig 配置项中, 而 dnsConfig 包含在 PodSpec 配置项中,因此 Pod 内所有容器都共享相同的 Network Namespace 。如下所示:

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: default
    spec:
      containers:
      - image: base/java
        command:
          - "java -jar /opt/app.jar"
        imagePullPolicy: IfNotPresent
        name: demo
      restartPolicy: Always
      dnsConfig:
        nameservers:
          - 172.xxx.xxx.201
        searches:
          - ns1.svc.cluster.local
          - my.dns.search.suffix
        options:
          - name: ndots
            value: "2"
          - name: edns0
    

    通过上述配置创建 Pod 之后,执行 kubectl exec demo cat /etc/resolv.conf 命令即可看到额外的配置项目,如下:

    nameserver 10.20.0.2
    nameserver 172.xxx.xxx.201
    search default.svc.cluster.local svc.cluster.local cluster.local ns1.svc.cluster.local my.dns.search.suffix
    options ndots:2 edns0
    

    即,在 nameservers 中多了 172.xxx.xxx.201search 中多了 ns1.svc.cluster.localmy.dns.search.suffix 两项值,及多了 options ndots:2 edns0 配置。

    因此,直接通过 dnsConfig 进行配置后,默认是追加到当前默认配置中。

    DNS 策略

    在 kubernetes 中还提供了 dnsPolicy 决定 Pod 内预设 DNS 配置策略:

    • None 无任何策略
    • Default 默认
    • ClusterFirst 集群 DNS 优先
    • ClusterFirstWithHostNet 集群 DNS 优先,并伴随着使用宿主机网络

    无策略 (None)

    清除 Pod 预设 DNS 配置,当 dnsPolicy 设置成为这个值之后, kubernetes 不会为 Pod 预先加载任何逻辑用于判定得到 DNS 的配置。因此若将 dnsPolicy 设置为 None , 为了避免 Pod 里面没有 DNS 配置,最好通过 dnsConfig 来描述自定义的 DNS 参数。如下所示:

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: default
    spec:
      containers:
      - image: base/java
        command:
          - "java -jar /opt/app.jar"
        imagePullPolicy: IfNotPresent
        name: demo
      restartPolicy: Always
      dnsPolicy: None
      dnsConfig:
        nameservers:
          - 172.xxx.xxx.201
        searches:
          - ns1.svc.cluster.local
          - my.dns.search.suffix
        options:
          - name: ndots
            value: "2"
          - name: edns0
    

    通过上述配置创建 Pod 之后,执行 kubectl exec demo cat /etc/resolv.conf 命令即可看到额外的配置项目,如下:

    nameserver 172.xxx.xxx.201
    search ns1.svc.cluster.local my.dns.search.suffix
    options ndots:2 edns0
    

    默认预设 (Default)

    Pod 里面的 DNS 配置继承了宿主机上的 DNS 配置。即,该 Pod 的 DNS 配置与宿主机完全一致。

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: default
    spec:
      containers:
      - image: base/java
        command:
          - "java -jar /opt/app.jar"
        imagePullPolicy: IfNotPresent
        name: demo
      restartPolicy: Always
      dnsPolicy: Default
    

    通过 cat /etc/resolv.conf 可查看到宿主机上的配置如下:

    # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
    #     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
    nameserver 172.xxx.xxx.201
    nameserver 114.114.114.114
    

    通过上述配置创建 Pod 之后,执行 kubectl exec demo cat /etc/resolv.conf 命令即可看到额外的配置项目,如下:

    nameserver 172.xxx.xxx.201
    nameserver 114.114.114.114
    

    集群优先 (ClusterFirst)

    与 Default 相反,会预先使用 kube-dns (或 CoreDNS ) 的信息当预设置参数写入到该 Pod 内的DNS配置。

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: default
    spec:
      containers:
      - image: base/java
        command:
          - "java -jar /opt/app.jar"
        imagePullPolicy: IfNotPresent
        name: demo
      restartPolicy: Always
      dnsPolicy: ClusterFirst
    

    通过上述配置创建 Pod 之后,执行 kubectl exec demo cat /etc/resolv.conf 命令即可看到额外的配置项目,如下:

    nameserver 10.20.0.2
    search default.svc.cluster.local svc.cluster.local cluster.local
    options ndots:5
    

    如设置了 hostNetwork = true 时,ClusterFirst 会被强制转化为 Default 。如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: default
    spec:
      containers:
      - image: base/java
        command:
          - "java -jar /opt/app.jar"
        imagePullPolicy: IfNotPresent
        name: demo
      hostNetwork: true
      restartPolicy: Always
      dnsPolicy: ClusterFirst
    

    通过上述配置创建 Pod 之后,执行 kubectl exec demo cat /etc/resolv.conf 命令即可看到额外的配置项目,如下:

    nameserver 172.xxx.xxx.201
    nameserver 114.114.114.114
    

    设置 hostNetwork = true 之后,会让 Pod 与该节点公用相同的网络空间(网卡/路由等)

    宿主机与 Kubernetes 共存 ( ClusterFirstWithHostNet )

    同时使用 hostNetworkkube-dns 作为 Pod 预设 DNS 配置。

    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: default
    spec:
      containers:
      - image: base/java
        command:
          - "java -jar /opt/app.jar"
        imagePullPolicy: IfNotPresent
        name: demo
      hostNetwork: true
      restartPolicy: Always
      dnsPolicy: ClusterFirstWithHostNet
    

    通过上述配置创建 Pod 之后,执行 kubectl exec demo cat /etc/resolv.conf 命令即可看到额外的配置项目,如下:

    nameserver 10.20.0.2
    search default.svc.k8s.local. svc.k8s.local. k8s.local.
    options ndots:5
    

    相关文章

      网友评论

          本文标题:kubernetes 容器 DNS 设置

          本文链接:https://www.haomeiwen.com/subject/oajcbqtx.html