Служба Kubernetes ExternalName не видна в DNS

Я пытаюсь представить один экземпляр базы данных как службу в двух пространствах имен Kubernetes. Kubernetes версия 1.11.3 работает на Ubuntu 16.04.1. Служба базы данных видима и работает в пространстве имен по умолчанию. Я создал службу ExternalName в пространстве имен не по умолчанию, ссылаясь на полное доменное имя в пространстве имен по умолчанию следующим образом:

kind: Service
apiVersion: v1
metadata:
  name: ws-mysql
  namespace: wittlesouth
spec:
  type: ExternalName
  externalName: mysql.default.svc.cluster.local
  ports:
  - port: 3306

Служба работает:

eric$ kubectl describe service ws-mysql --namespace=wittlesouth
Name:              ws-mysql
Namespace:         wittlesouth
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ExternalName
IP:                
External Name:     mysql.default.svc.cluster.local
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

Если я проверю, можно ли найти службу по имени из модуля, работающего в пространстве имен wittlesouth, это имя службы не разрешается, но другие службы в этом пространстве имен (например, Jira) делают:

root@rs-ws-diags-8mgqq:/# nslookup mysql.default.svc.cluster.local
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   mysql.default.svc.cluster.local
Address: 10.99.120.208

root@rs-ws-diags-8mgqq:/# nslookup ws-mysql.wittlesouth
Server:     10.96.0.10
Address:    10.96.0.10#53

*** Can't find ws-mysql.wittlesouth: No answer

root@rs-ws-diags-8mgqq:/# nslookup ws-mysql            
Server:     10.96.0.10
Address:    10.96.0.10#53

*** Can't find ws-mysql: No answer

root@rs-ws-diags-8mgqq:/# nslookup ws-mysql.wittlesouth
Server:     10.96.0.10
Address:    10.96.0.10#53

*** Can't find ws-mysql.wittlesouth: No answer

root@rs-ws-diags-8mgqq:/# nslookup ws-mysql.wittlesouth.svc.cluster.local
Server:     10.96.0.10
Address:    10.96.0.10#53

*** Can't find ws-mysql.wittlesouth.svc.cluster.local: No answer

root@rs-ws-diags-8mgqq:/# nslookup ws-mysql.wittlesouth
Server:     10.96.0.10
Address:    10.96.0.10#53

*** Can't find ws-mysql.wittlesouth: No answer

root@rs-ws-diags-8mgqq:/# nslookup jira.wittlesouth
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   jira.wittlesouth.svc.cluster.local
Address: 10.105.30.239

Любые мысли о том, что может быть проблема здесь? На данный момент я работал над этим, обновляя приложения, которым необходимо использовать базу данных для ссылки на полное доменное имя службы, работающей в пространстве имен по умолчанию, но я бы предпочел этого избежать. В конечном итоге я намерен сделать так, чтобы пространства имен имели отдельные экземпляры базы данных, и хотел бы развернуть приложения, настроенные для такой работы, прямо перед тем, как фактически поддерживать второй экземпляр.

1 ответ

Решение

Это не работает для меня с Kubernetes 1.11.2 с сердечками и бязью. Он работает, только если вы ссылаетесь на внешнюю службу напрямую в любом пространстве имен, в котором она работает:

$ kubectl get pods -n default
NAME      READY     STATUS    RESTARTS   AGE
mysql-0   2/2       Running   0          17m
mysql-1   2/2       Running   0          16m

$ kubectl get pods -n wittlesouth
NAME              READY     STATUS    RESTARTS   AGE
ricos-dummy-pod   1/1       Running   0          14s

kubectl exec -it ricos-dummy-pod -n wittlesouth bash
root@ricos-dummy-pod:/# ping mysql.default.svc.cluster.local
PING mysql.default.svc.cluster.local (192.168.1.40): 56 data bytes
64 bytes from 192.168.1.40: icmp_seq=0 ttl=62 time=0.578 ms
64 bytes from 192.168.1.40: icmp_seq=1 ttl=62 time=0.632 ms
64 bytes from 192.168.1.40: icmp_seq=2 ttl=62 time=0.628 ms
^C--- mysql.default.svc.cluster.local ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.578/0.613/0.632/0.025 ms
root@ricos-dummy-pod:/# ping ws-mysql
ping: unknown host
root@ricos-dummy-pod:/# exit

$ kubectl get svc mysql
NAME      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
mysql     ClusterIP   None         <none>        3306/TCP   45d

$ kubectl describe svc mysql
Name:              mysql
Namespace:         default
Labels:            app=mysql
Annotations:       <none>
Selector:          app=mysql
Type:              ClusterIP
IP:                None
Port:              mysql  3306/TCP
TargetPort:        3306/TCP
Endpoints:         192.168.1.40:3306,192.168.2.25:3306
Session Affinity:  None
Events:            <none>

Функция сервиса ExternalName поддерживается только с использованием kube-dns в соответствии с docs и Kubernetes 1.11.x по умолчанию coredns. Возможно, вы захотите попробовать перейти с coredns на kube-dns или, возможно, изменить конфиги для вашего развертывания coredns. Я ожидаю, что это будет доступно в какой-то момент с использованием сердечников.

Другие вопросы по тегам