Не удалось настроить службу DNS в кластере Kubernetes

Версия Kubernetes --> 1.5.2

Я впервые настраиваю DNS для сервисов Kubernetes и столкнулся со SkyDNS. Итак, следуя документации, мой файл skydns-svc.yaml:

apiVersion: v1
kind: Service
spec:
  clusterIP: 10.100.0.100
  ports:
  - name: dns
    port: 53
    protocol: UDP
    targetPort: 53
  - name: dns-tcp
    port: 53
    protocol: TCP
    targetPort: 53
  selector:
    k8s-app: kube-dns
  sessionAffinity: None
  type: ClusterIP

И мой файл skydns-rc.yaml:

apiVersion: v1
kind: ReplicationController
spec:
  replicas: 1
  selector:
    k8s-app: kube-dns
    version: v18
  template:
    metadata:
      creationTimestamp: null
      labels:
        k8s-app: kube-dns
        kubernetes.io/cluster-service: "true"
        version: v18
    spec:
      containers:
      - args:
        - --domain=kube.local
        - --dns-port=10053
        image: gcr.io/google_containers/kubedns-amd64:1.6
        imagePullPolicy: IfNotPresent
        name: kubedns
        ports:
        - containerPort: 10053
          name: dns-local
          protocol: UDP
        - containerPort: 10053
          name: dns-tcp-local
          protocol: TCP
        resources:
          limits:
            cpu: 100m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 100Mi
        terminationMessagePath: /dev/termination-log
      - args:
        - --cache-size=1000
        - --no-resolv
        - --server=127.0.0.1#10053
        image: gcr.io/google_containers/kube-dnsmasq-amd64:1.3
        imagePullPolicy: IfNotPresent
        name: dnsmasq
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
      - args:
        - -cmd=nslookup kubernetes.default.svc.kube.local 127.0.0.1 >/dev/null &&
          nslookup kubernetes.default.svc.kube.local 127.0.0.1:10053 >/dev/null
        - -port=8080
        - -quiet
        image: gcr.io/google_containers/exechealthz-amd64:1.0
        imagePullPolicy: IfNotPresent
        name: healthz
        ports:
        - containerPort: 8080
          protocol: TCP
        resources:
          limits:
            cpu: 10m
            memory: 20Mi
          requests:
            cpu: 10m
            memory: 20Mi

Также на своих миньонах я обновил файл /etc/systemd/system/multi-user.target.wants/kubelet.service и добавил следующее в раздел ExecStart:

ExecStart=/usr/bin/kubelet \
        $KUBE_LOGTOSTDERR \
        $KUBE_LOG_LEVEL \
        $KUBELET_API_SERVER \
        $KUBELET_ADDRESS \
        $KUBELET_PORT \
        $KUBELET_HOSTNAME \
        $KUBE_ALLOW_PRIV \
        $KUBELET_POD_INFRA_CONTAINER \
        $KUBELET_ARGS \
            --cluster-dns=10.100.0.100 \
            --cluster-domain=kubernetes \

Сделав все это и успешно подняв rc и svc :

[root@kubernetes-master DNS]# kubectl get po | grep dns
kube-dns-v18-hl8z6                                                3/3       Running             0          6s
[root@kubernetes-master DNS]# kubectl get svc | grep dns
kube-dns                            10.100.0.100     <none>        53/UDP,53/TCP                                                    20m

Это все, что я получил с точки зрения конфигурации. Теперь, чтобы проверить свою установку, я скачал busybox и протестировал nslookup

[root@kubernetes-master DNS]# kubectl get svc | grep kubernetes
kubernetes                          10.100.0.1       <none>        443/TCP 

[root@kubernetes-master DNS]# kubectl exec busybox -- nslookup kubernetes
nslookup: can't resolve 'kubernetes'
Server:    10.100.0.100
Address 1: 10.100.0.100

Есть ли что-то, что я пропустил?

ИЗМЕНИТЬ ::

Просматривая журналы, я вижу что-то, что может объяснить, почему это не работает:

kubectl logs $(kubectl get pods -l k8s-app=kube-dns -o name) -c kubedns
.
.
.
E1220 17:44:48.403976       1 reflector.go:216] pkg/dns/dns.go:154: Failed to list *api.Endpoints: Get https://10.100.0.1:443/api/v1/endpoints?resourceVersion=0: x509: failed to load system roots and no roots provided
E1220 17:44:48.487169       1 reflector.go:216] pkg/dns/dns.go:155: Failed to list *api.Service: Get https://10.100.0.1:443/api/v1/services?resourceVersion=0: x509: failed to load system roots and no roots provided
I1220 17:44:48.487716       1 dns.go:172] Ignoring error while waiting for service default/kubernetes: Get https://10.100.0.1:443/api/v1/namespaces/default/services/kubernetes: x509: failed to load system roots and no roots provided. Sleeping 1s before retrying.
E1220 17:44:49.410311       1 reflector.go:216] pkg/dns/dns.go:154: Failed to list *api.Endpoints: Get https://10.100.0.1:443/api/v1/endpoints?resourceVersion=0: x509: failed to load system roots and no roots provided
I1220 17:44:49.492338       1 dns.go:172] Ignoring error while waiting for service default/kubernetes: Get https://10.100.0.1:443/api/v1/namespaces/default/services/kubernetes: x509: failed to load system roots and no roots provided. Sleeping 1s before retrying.
E1220 17:44:49.493429       1 reflector.go:216] pkg/dns/dns.go:155: Failed to list *api.Service: Get https://10.100.0.1:443/api/v1/services?resourceVersion=0: x509: failed to load system roots and no roots provided
.
.
.

Похоже, kubedns не может авторизоваться на главном узле K8S. Я даже пытался сделать вызов вручную:

curl -k https://10.100.0.1:443/api/v1/endpoints?resourceVersion=0
Unauthorized

person Community    schedule 20.12.2017    source источник
comment
Возможно, вы захотите попробовать coredns.io, он отлично работает на одном из моих кластеров. Кроме того, кажется, что в вашем развертывании отсутствуют некоторые фрагменты, посмотрите на этот шаблон для хорошей отправной точки   -  person Radek 'Goblin' Pieczonka    schedule 20.12.2017
comment
Да, он работает на всех (мастер и миньоны) /usr/bin/kube-proxy --logtostderr=true --v=0 --master=http://master:8080   -  person    schedule 20.12.2017
comment
Я думаю, что нашел проблему. Пожалуйста, прочитайте мой РЕДАКТИРОВАТЬ. Но я не уверен, что делать дальше, учитывая, что kubedns требуется авторизация. Есть идеи ?   -  person    schedule 20.12.2017


Ответы (1)


Похоже, модуль kube-dns не может пройти аутентификацию на сервере API kubernetes. Я не вижу secret и serviceaccount в файле YAML для модуля kube-dns.

Я предлагаю сделать следующее:

  1. Создайте k8s secret, используя kubectl create secret для модуля kube-dns с нужным файлом сертификата ca.crt и token:

    $ kubectl get secrets -n=kube-system | grep dns
    kube-dns-token-66tfx     kubernetes.io/service-account-token   3      1d
    
  2. Создайте k8s serviceaccount, используя kubectl create serviceaccount для модуля kube-dns:

    $ kubectl get serviceaccounts -n=kube-system | grep dns
    kube-dns               1         1d`
    
  3. Смонтируйте secret в /var/run/secrets/kubernetes.io/serviceaccount внутри контейнера kube-dns в файле YAML:

    ...
    kind: Pod
    ...
    spec:
      ...
      containers:
        ...
        volumeMounts:
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: kube-dns-token-66tfx
          readOnly: true
      ...
      volumes:
      - name: kube-dns-token-66tfx
        secret:
          defaultMode: 420
          secretName: kube-dns-token-66tfx
    

Вот ссылки о создании сервисных аккаунтов для модулей:

https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/

https://kubernetes.io/docs/admin/service-accounts-admin/< /а>

person Vikram Hosakote    schedule 10.02.2018