【问题标题】:dnsConfig is skipped in GKEdnsConfig 在 GKE 中被跳过
【发布时间】:2020-06-15 21:11:59
【问题描述】:

面临以下问题: 我需要在一些 pod 上添加一个搜索域,以便能够与无头服务进行通信。 Kubernetes 文档建议设置一个 dnsConfig 并在其中设置所有内容。这就是我所做的。还有一个限制,只能设置 6 个搜索域。 清单的一部分:

    spec:
  hostname: search
  dnsPolicy: ClusterFirst
  dnsConfig:
    searches:
      - indexer.splunk.svc.cluster.local
  containers:
  - name: search

不幸的是,它没有效果,目标 pod 上的 resolv.conf 文件不包含此搜索域:

search splunk.svc.cluster.local svc.cluster.local cluster.local us-east4-c.c.'project-id'.internal c.'project-id'.internal google.internal
nameserver 10.39.240.10
options ndots:5

快速浏览一下这个配置,我发现目前指定了6个搜索域,这可能是没有添加新搜索域的原因。您可以手动添加,一切都会正常进行,但这不是我想要实现的目标。

您对如何绕过此限制有任何想法吗?

P.S 将 dnsPolicy 设置为 None 也不是设置预启动挂钩以添加我的搜索区域的选项。

---
# Search-head deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: search
  namespace: splunk
  labels:
    app: splunk
spec:
  replicas: 1
  selector:
    matchLabels:
      app: splunk
  template:
    metadata:
      labels:
        app: splunk
    spec:
      hostname: search
      dnsPolicy: ClusterFirst
      dnsConfig:
        searches:
          - indexer.splunk.svc.cluster.local
      containers:
      - name: search
        image: splunk/splunk
        env:
          - name: SPLUNK_START_ARGS
            value: "--accept-license"
          - name: SPLUNK_PASSWORD
            valueFrom:
              secretKeyRef:
                name: splunk-password
                key: password
          - name: SPLUNK_ROLE
            value: splunk_search_head
          - name: SPLUNK_SEARCH_HEAD_URL
            value: search
          - name: SPLUNK_INDEXER_URL # TODO: make this part dynamic.
            value: indexer-0,indexer-1
        ports:
          - name: web
            containerPort: 8000
          - name: mgmt
            containerPort: 8089
          - name: kv
            containerPort: 8191
        volumeMounts:
        - mountPath: /opt/splunk/var
          name: sh-volume
      volumes:
      - name: sh-volume
        persistentVolumeClaim:
          claimName: sh-volume

【问题讨论】:

  • 欢迎来到堆栈!你能发布整个yaml吗?您的缩进似乎是错误的,请编辑您需要的任何信息,但我需要查看结构,还要添加您的 GKE 版本。
  • 谢谢@willrof!添加了清单。 GKE 版本是 1.14.10-gke.17 我认为结构还可以,问题是我如何将它粘贴到这里。
  • 感谢您的信息,这看起来是一个非常独特的问题,它可能与 glibc 版本有关。我有一个部分答案,我正在发布它,但一旦我完成研究,我会发布更新。
  • 只要您在线,我们就在chat 继续。

标签: kubernetes google-cloud-platform google-kubernetes-engine kubernetes-pod


【解决方案1】:

根据Pods DnsConfig Documentation

searches:用于在 Pod 中查找主机名的 DNS 搜索域列表。该属性是可选的。指定后,提供的列表将合并到从所选 DNS 策略生成的基本搜索域名中。重复的域名被删除。 Kubernetes 最多允许 6 个搜索域。

  • 尽管 resolv.conf docs 提到它在最新版本中接受超过 6 个搜索域,但通过 kubernetes 部署还不可能超过这个数量的搜索域。

  • 我创建了一个解决方法,InitContainer 创建并挂载到 pod 一个新的resolv.conf,在容器启动后,它会替换自动生成的。 这样,如果容器崩溃或重新启动,resolv.conf 将始终得到加强。

nginx-emulating-your-splunk-deploy.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: search
  namespace: default
  labels:
    app: splunk
spec:
  replicas: 1
  selector:
    matchLabels:
      app: splunk
  template:
    metadata:
      labels:
        app: splunk
    spec:
      hostname: search
      initContainers:
        - name: initdns
          image: nginx
          imagePullPolicy: IfNotPresent
          command: ["/bin/bash","-c"] 
          args: ["echo -e \"nameserver 10.39.240.10\nsearch indexer.splunk.svc.cluster.local splunk.svc.cluster.local svc.cluster.local cluster.local us-east4-c.c.'project-id'.internal c.'project-id'.internal google.internal\noptions ndots:5\n \" > /mnt/resolv.conf"]
          volumeMounts:
          - mountPath: /mnt
            name: volmnt      
      containers:
        - name: search
          image: nginx
          env:
          - name: SPLUNK_START_ARGS
            value: "--accept-license"
          - name: SPLUNK_PASSWORD
            value: password
          - name: SPLUNK_ROLE
            value: splunk_search_head
          - name: SPLUNK_SEARCH_HEAD_URL
            value: search
          ports:
          - name: web
            containerPort: 8000
          - name: mgmt
            containerPort: 8089
          - name: kv
            containerPort: 8191
          volumeMounts:
          - mountPath: /mnt
            name: volmnt
          command: ["/bin/bash","-c"] 
          args: ["cp /mnt/resolv.conf /etc/resolv.conf ; nginx -g \"daemon off;\""]
      volumes:
      - name: volmnt
        emptyDir: {}
  • 记得勾选以下字段并根据您的环境进行设置:
    • namespace, nameserver, container.image, container.args

  • 复制:
$ kubectl apply -f search-head-splunk.yaml 
deployment.apps/search created

$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
search-64b6fb5854-shm2x   1/1     Running   0          5m14sa

$ kubectl exec -it search-64b6fb5854-shm2x -- cat /etc/resolv.conf 
nameserver 10.39.240.10
search indexer.splunk.svc.cluster.local splunk.svc.cluster.local svc.cluster.local cluster.local us-east4-c.c.'project-id'.internal c.'project-id'.internal google.internal
options ndots:5

您可以看到 resolv.conf 保持配置不变,请在您的环境中重现,如果您发现任何问题,请告诉我。


编辑 1:

  • 上述方案专为需要 6 个以上搜索域的环境而设计。
  • 我们必须对 DNS 服务器进行硬编码,但 kube-dns 服务在集群生命周期内坚持使用相同的 IP,有时甚至在集群重建之后,这取决于网络配置。

  • 如果您需要 6 个或更少的域,您只需将 dnsPolicy 更改为 None 并跳过 InitContainer

apiVersion: apps/v1
kind: Deployment
metadata:
  name: search
  namespace: splunk
  labels:
    app: splunk
spec:
  replicas: 1
  selector:
    matchLabels:
      app: splunk
  template:
    metadata:
      labels:
        app: splunk
    spec:
      hostname: search
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
          - 10.39.240.10
        searches:
          - indexer.splunk.svc.cluster.local
          - splunk.svc.cluster.local
          - us-east4-c.c.'project-id'.internal
          - c.'project-id'.internal
          - svc.cluster.local
          - cluster.local
        options:
          - name: ndots
          - value: "5"
      containers:
      - name: search
        image: splunk/splunk
...
{{{the rest of your config}}}

【讨论】:

  • 嗯 @willrof 看起来已经安装了适当版本的 glibc:$ /lib64/libc.so.6 --version GNU C Library (GNU libc) stable release version 2.28
  • 这是从 splunk 容器输出的
  • 感谢您的确认。这就是我现在正在研究的。您提到您不能将 dnsPolicy 设置为 none,这将是绕过此问题的快速方法。看起来问题出在将 yaml 处理到 pod 的过程中,在 pod 内没有正确创建 resolv.conf,我正在查找哪个组件对此负责,因为即使我将策略设置为 none ,我不能手动设置7个搜索域,我也在研究。
  • 是的,我看到您可以将 dnsPolicy 设置为 none 并且可以根据您的要求调整 resolv.conf,但据我所知,您需要硬编码名称服务器的 IP 地址,因此我不是对此解决方案感到满意。
  • 去检查如何在 dns 服务器中设置调试模式。可能它会提供一些信息。
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多