gpt4 book ai didi

kubernetes - dnsConfig 在 GKE 中被跳过

转载 作者:行者123 更新时间:2023-12-03 23:51:28 24 4
gpt4 key购买 nike

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

    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 也不是一个选项,也不是设置预启动 Hook 来添加我的搜索区域。
---
# 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

最佳答案

根据 Pods DnsConfig Documentation :

searches: a list of DNS search domains for hostname lookup in the Pod. This property is optional. When specified, the provided list will be merged into the base search domain names generated from the chosen DNS policy. Duplicate domain names are removed. Kubernetes allows for at most 6 search domains.


  • 即使 resolv.conf docs提到它在最新版本上接受超过 6 个搜索域,通过 kubernetes 部署还不可能超过这个搜索域数量。
  • 我创建了一个解决方法,其中一个 InitContainer创建一个新的 resolv.conf 并挂载到 pod容器启动后,它会替换自动生成的容器。
    这样,如果容器崩溃或重新启动 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 个或更少的域,您可以更改 dnsPolicyNone并跳过 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}}}

    关于kubernetes - dnsConfig 在 GKE 中被跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60508061/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com