#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
у облачного провайдера, который его поддерживает. Я бы предложил создать отдельную службу, если вы хотите предоставить ее извне.