【问题标题】:how to get SRV DNS address for statefulset headless service如何为 statefulset 无头服务获取 SRV DNS 地址
【发布时间】:2019-09-30 17:58:50
【问题描述】:

在 dns 中查找 statefulsets srv 记录时出现问题

我的 yaml 文件

kind: List
apiVersion: v1
items:
- apiVersion: v1
  kind: Service
  metadata:
    name: sfs-svc
    labels:
      app: sfs-app
  spec:
    ports:
    - port: 80
      name: web
    clusterIP: None
    selector:
      app: sfs-app
- apiVersion: apps/v1
  kind: StatefulSet
  metadata:
    name: web
  spec:
    selector:
      matchLabels:
        app: sfs-app # has to match .spec.template.metadata.labels
    serviceName: "sfs-svc"
    replicas: 3 
    template:
      metadata:
        labels:
          app: sfs-app # has to match .spec.selector.matchLabels
      spec:
        terminationGracePeriodSeconds: 10
        containers:
        - name: test-container
          image: nginx
          imagePullPolicy: IfNotPresent
          command: [ "sh", "-c"]
          args:
          - while true; do
              printenv MY_NODE_NAME MY_POD_NAME MY_POD_NAMESPACE >> /var/sl/output.txt;
              printenv MY_POD_IP >> /var/sl/output.txt;
              date >> var/sl/output.txt; 
              cat /var/sl/output.txt;
              sleep 999999;
            done;
          env:
            - name: MY_NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: MY_POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: MY_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumeMounts:
          - name: www
            mountPath: /var/sl
    volumeClaimTemplates:
    - metadata:
        name: www
      spec:
        accessModes: [ "ReadWriteOnce" ]
        #storageClassName: classNameIfAny
        resources:
          requests:
            storage: 1Mi

$ Kubectl 集群信息

Kubernetes master 运行在https://192.168.99.100:8443 KubeDNS 运行在https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

$ kubectl 版本

客户端版本:version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.3", GitCommit:"721bfa751924da8d1680787490c54b9179b1fed0", GitTreeState:"clean", BuildDate:"2019-02-01T20 :08:12Z", GoVersion:"go1.11.5", 编译器:"gc", 平台:"linux/amd64"} 服务器版本:version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.1", GitCommit:"b7394102d6ef778017f2ca4046abbaa23b88c290", GitTreeState:"clean", BuildDate:"2019-04-08T17:02: 58Z", GoVersion:"go1.12.1", 编译器:"gc", 平台:"linux/amd64"}

$ kubectl get po,svc,statefulset

> NAME        READY   STATUS    RESTARTS   AGE
> pod/web-0   1/1     Running   0          45m
> pod/web-1   1/1     Running   0          45m
> pod/web-2   1/1     Running   0          45m
> 
> NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
> service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   46m
> service/sfs-svc      ClusterIP   None         <none>        80/TCP    45m
> 
> NAME                   READY   AGE
> statefulset.apps/web   3/3     45m
> 

问题:我没有获得 statefulset 无头服务的 DNS 地址

当我尝试 $ nslookup sfs-svc.default.svc.cluster.local

> Server:       127.0.0.53
> Address:  127.0.0.53#53
> 
**> ** server can't find sfs-svc.default.svc.cluster.local: SERVFAIL**
> 

【问题讨论】:

  • 看起来您使用的地址不是集群的 DNS 服务器,因为kube-dns 服务的 IP 将驻留在集群的 Service CIDR (10.96.0.x) 中(并且不会返回SERVFAIL 缺少记录)
  • 另外,虽然我坚信查询错误的地址是造成问题的根本原因,但您还必须专门询问 SRV 记录,因为默认情况下 nslookup 不会返回所有记录类型: nslookup -type=srv sfs-svc.default.svc.cluster.local
  • 您能否详细说明您是如何运行nslookup 的?这是任何豆荚吗?这个 yaml 对我来说很好用。

标签: kubernetes minikube kube-dns srv kubernetes-statefulset


【解决方案1】:

我的第一个猜测是,您是从 localhost 运行 nslookup,而不是从 pod 内部运行。

我尝试了 yaml,但我只能在从 localhost 运行 nslookup sfs-svc.default.svc.cluster.local 时重新生成此问题。

无论如何,要检查服务的 DNS 条目,请从 pod 内部运行 nslookup。这是一个例子,

~ $ kubectl run -it --rm --restart=Never dnsutils2 --image=tutum/dnsutils  --command -- bash

root@dnsutils2:/# nslookup sfs-svc.default.svc.cluster.local
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   sfs-svc.default.svc.cluster.local
Address: 172.17.0.6
Name:   sfs-svc.default.svc.cluster.local
Address: 172.17.0.5
Name:   sfs-svc.default.svc.cluster.local
Address: 172.17.0.4

root@dnsutils2:/# exit

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 2019-10-25
    • 1970-01-01
    • 2021-07-14
    • 2016-09-11
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多