DNS не работает с Kubernetes PetSet

#docker #kubernetes

#docker #kubernetes

Вопрос:

Хорошо, следуя примерам и документации на веб-сайте Kubernetes, а также обширным исследованиям в Google, я все еще не могу получить разрешение DNS между контейнерами в моем модуле.

У меня есть служба и PetSet с определенными 2 контейнерами. Когда я развертываю PetSet и Service, они запускаются и выполняются успешно, но если я попытаюсь выполнить пинг хоста одного из моих контейнеров из другого по имени хоста или по полному доменному имени, я получаю пункт назначения недоступным. Однако я могу выполнить пинг по IP-адресу.

Вот мой файл конфигурации Kubernetes:

 apiVersion: v1
kind: Service
metadata:
  name: ml-service
  labels:
    app: marklogic
  annotations:
    service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:
  #restartPolicy: OnFailure
  clusterIP: None
  selector:
    app: marklogic
  ports:
    - protocol: TCP
      port: 7997
      #nodePort: 31997
      name: ml7997
    - protocol: TCP
      port: 8000
      #nodePort: 32000
      name: ml8000
    # ... More ports defined
  #type: NodePort

---
apiVersion: apps/v1alpha1
kind: PetSet
metadata:
  name: marklogic
spec:
  serviceName: "ml-service"
  replicas: 2
  template:
    metadata:
      labels:
        app: marklogic
      annotations:
        pod.alpha.kubernetes.io/initialized: "true"
    spec:
      terminationGracePeriodSeconds: 30
      containers:
        - name: 'marklogic'
          image: "{local docker registry ip}:5000/dcgs-sof/ml8-docker-final:v1"
          imagePullPolicy: Always
          command: ["/opt/entry-point.sh", "-l", "/opt/mlconfig.sh"]
          ports:
            - containerPort: 7997
              name: ml7997
            - containerPort: 8000
              name: ml8000
            - containerPort: 8001
              name: ml8001
            - containerPort: 8002
              name: ml8002
            - containerPort: 8040
              name: ml8040
            - containerPort: 8041
              name: ml8041
            - containerPort: 8042
              name: ml8042
            - containerPort: 8050
              name: ml8050
            - containerPort: 8051
              name: ml8051
            - containerPort: 8060
              name: ml8060
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          lifecycle:
            preStop:
              exec:
                command: ["/etc/init.d/MarkLogic stop"]
          volumeMounts:
            - name: ml-data
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: ml-data
        annotations:
          volume.alpha.kubernetes.io/storage-class: anything
      spec:
        accessModes: [ "ReadWriteOnce" ]
        resources:
          requests:
            storage: 1Gi
  

Я прокомментировал type: NodePort определение, поскольку думал, что это может быть причиной, но по-прежнему безуспешно.

Кроме того, если я запускаю docker@minikube:/$ docker exec b4d21c4bc065 /bin/bash -c 'nslookup marklogic-1.marklogic.default.svc.cluster.local' , он не может разрешить имя.

Чего мне не хватает???

Ответ №1:

Вы разрешаете неправильное доменное имя. См. http://kubernetes.io/docs/user-guide/petset/#network-identity

Вы должны попытаться решить:

marklogic-0.ml-service.default.svc.cluster.local

Если все находится в пространстве имен по умолчанию, DNS-имя:

<pod_name>.<svc_name>.default.svc.cluster.local

Комментарии:

1. Спасибо за быстрый ответ! Итак, в моей конфигурации службы я изначально создал ее как службу без головы. Если я установлю для ClusterIP адрес типа 10.0.0.199 вместо None, nslookup завершится ошибкой, но я смогу получить доступ к своему контейнеру со своего хоста. При None в качестве ClusterIP хосты могут видеть друг друга внутри, но я не могу получить доступ к then извне. Это очень сбивает с толку! Есть предложения?

2. Если вы хотите получить к ним доступ извне, вам нужен тип службы LoadBalancer у облачного провайдера, который его поддерживает. Я бы предложил создать отдельную службу, если вы хотите предоставить ее извне.