Kubernetes: Apiserver ne parvient pas à démarrer à l'intérieur du conteneur dans 1.6

Créé le 8 avr. 2017  ·  3Commentaires  ·  Source: kubernetes/kubernetes

S'agit-il d'un rapport de bogue ou d'une demande de fonctionnalité ? (choisir une option) : RAPPORT DE BUG

Version de Kubernetes (utilisez kubectl version ) :
Client : v1.6.1
Serveur : v1.6.1+coreos.0

Environnement :

  • Fournisseur de cloud ou configuration matérielle : Bare metal, 1 nœud (également testé pour 3 nœuds = 1 maître + 2 travailleurs)
  • Système d'exploitation : CoreOS 1298.7.0
  • Noyau : 4.9.16-coreos-r1
  • Installer les outils : quay.io/coreos/hyperkube:v1.6.1_coreos.0 image en tant que systemd kubelet.service + manifestes dans /etc/kubernetes/manifests pour les composants principaux

Le kubelet.service est :

# /etc/systemd/system/kubelet.service
[Unit]
Description=Kubelet service of Kubernetes

[Service]
# Mounting /etc/hosts is required for kubelet to be able to resolve
# nodes via its aliases (which may be not DNS routable).
Environment="RKT_RUN_ARGS= \
  --volume=etc-hosts,kind=host,source=/etc/hosts --mount volume=etc-hosts,target=/etc/hosts \
  --volume=var-log,kind=host,source=/var/log --mount volume=var-log,target=/var/log \
  --volume=dns,kind=host,source=/etc/resolv.conf --mount volume=dns,target=/etc/resolv.conf \
  --uuid-file-save=/var/run/kubelet-pod.uuid"
Environment=KUBELET_IMAGE_URL=quay.io/coreos/hyperkube
Environment=KUBELET_IMAGE_TAG=v1.6.1_coreos.0
ExecStartPre=/usr/bin/mkdir -p /etc/kubernetes/manifests
ExecStartPre=/usr/bin/mkdir -p /var/log/containers
ExecStartPre=-/usr/bin/rkt rm --uuid-file=/var/run/kubelet-pod.uuid
# Specifying all node labels here is required for kubelet
# to let it know its node state for correct recovery/restarts
# before sychronization with kube-apiserver happens.
ExecStart=/usr/lib/coreos/kubelet-wrapper \
  --port=10250 \
  --tls-cert-file=/etc/kubernetes/ssl/kubelet.crt \
  --tls-private-key-file=/etc/kubernetes/ssl/kubelet.key \
  --kubeconfig=/etc/kubernetes/kubeconfig-kubelet.yaml \
  --require-kubeconfig \
  --register-node=true \
  --allow-privileged=true \
  --pod-manifest-path=/etc/kubernetes/manifests \
  --hostname-override=n1.myhost.net \
  --cluster-dns=10.3.0.10 \
  --cluster-domain=cluster.local \
  --node-labels=role/apiserver=true,role/application=true \
  --network-plugin= \
  --sync-frequency=30s
ExecStop=-/usr/bin/rkt stop --uuid-file=/var/run/kubelet-pod.uuid
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Le /etc/kubernetes/manifests/kube-apiserver.yml est :

kind: Pod
apiVersion: v1
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
    - name: kube-apiserver
      image: quay.io/coreos/hyperkube:v1.6.1_coreos.0
      command:
        - /hyperkube
        - apiserver
        - --bind-address=0.0.0.0
        - --secure-port=8443
        - --insecure-port=8081
        - --advertise-address=<public ip>
        - --external-hostname=n1.myhost.net
        - --client-ca-file=/etc/kubernetes/ssl/ca.crt
        - --tls-cert-file=/etc/kubernetes/ssl/apiserver.crt
        - --tls-private-key-file=/etc/kubernetes/ssl/apiserver.key
        - --service-account-key-file=/etc/kubernetes/ssl/apiserver.key
        - --service-cluster-ip-range=10.3.0.0/24
        - --etcd-servers=http://n1.myhost.net:4001
        - --etcd-cafile=/etc/ssl/etcd/ca.crt
        - --etcd-certfile=/etc/ssl/etcd/client.crt
        - --etcd-keyfile=/etc/ssl/etcd/client.key
        - --storage-backend=etcd2
        - --storage-media-type=application/json
        - --kubelet-https=true
        - --kubelet-certificate-authority=/etc/kubernetes/ssl/ca.crt
        - --kubelet-client-certificate=/etc/kubernetes/ssl/apiserver.crt
        - --kubelet-client-key=/etc/kubernetes/ssl/apiserver.key
        - --allow-privileged=true
        - --anonymous-auth=false
        - --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota
        - --runtime-config=extensions/v1beta1=true,extensions/v1beta1/thirdpartyresources=true
      ports:
        - name: https
          containerPort: 8443
          hostPort: 8443
        - name: local
          containerPort: 8081
          hostPort: 8081
      volumeMounts:
        - name: ssl-certs-kubernetes
          mountPath: /etc/kubernetes/ssl
          readOnly: true
        - name: ssl-certs-etcd
          mountPath: /etc/ssl/etcd
          readOnly: true
        - name: ssl-certs-host
          mountPath: /etc/ssl/certs
          readOnly: true
  volumes:
    - name: ssl-certs-kubernetes
      hostPath:
        path: /etc/kubernetes/ssl
    - name: ssl-certs-etcd
      hostPath:
        path: /etc/ssl/etcd
    - name: ssl-certs-host
      hostPath:
        path: /usr/share/ca-certificates

Que s'est-il passé :

kube-apiserver Le pod démarre et se ferme immédiatement avec une erreur (à partir de docker logs ):

F0408 09:01:03.289906       1 controller.go:128] Unable to perform initial IP allocation check: unable to refresh the service IP block: Get https://localhost:8443/api/v1/services: dial tcp: lookup localhost on 8.8.8.8:53: no such host

D'une manière ou d'une autre, apiserver essaie de résoudre localhost via un DNS externe.

Ce à quoi vous vous attendiez :

kube-apiserver devrait démarrer normalement comme sur les versions 1.5 de Kubernetes.

Comment le reproduire (le moins et le plus précisément possible) :

En démarrant le cluster Kubernetes sur CoreOS mais pour la version v1.6.1 Kubernetes.

Tout ce que nous devons savoir :

Au cours de mes recherches, la ClusterFirstWithHostNet a été ajoutée au paramètre dnsPolicy de PodSpec dans 1.6 . Ça dit:

Pour que les options DNS soient définies avec hostNetwork, vous devez spécifier explicitement la politique DNS sur 'ClusterFirstWithHostNet'.

J'ai essayé de spécifier explicitement dnsPolicy: ClusterFirstWithHostNet et j'ai eu une erreur différente :

F0408 08:57:52.675808       1 controller.go:128] Unable to perform initial IP allocation check: unable to refresh the service IP block: Get https://localhost:8443/api/v1/services: dial tcp: lookup localhost on 10.3.0.10:53: write udp <public ip>:37836->10.3.0.10:53: write: operation not permitted

En outre, j'ai examiné les options CLI kube-apiserver et je n'ai pas trouvé quelque chose à régler.

Le KubeDNS dans mon installation est déployé comme d'habitude Déploiement dans l'espace de noms kube-system , pas en tant qu'addon de cluster dans le répertoire /etc/kubernetes/manifests .

Commentaire le plus utile

Jetez un œil au /etc/hosts de votre hôte et voyez s'il contient localhost. C'était le problème sur ma configuration avec exactement la même configuration, mon /etc/hosts ne contenait que le nom d'hôte de ma machine et une adresse IP mais pas d'hôte local. Lorsque j'ai ajouté 127.0.0.1 localhost et redémarré l'apiserver, cela a fonctionné.

Tous les 3 commentaires

Des suggestions pour lesquelles apiserver essaie de résoudre localhost sur 8.8.8.8 ?

Jetez un œil au /etc/hosts de votre hôte et voyez s'il contient localhost. C'était le problème sur ma configuration avec exactement la même configuration, mon /etc/hosts ne contenait que le nom d'hôte de ma machine et une adresse IP mais pas d'hôte local. Lorsque j'ai ajouté 127.0.0.1 localhost et redémarré l'apiserver, cela a fonctionné.

Génial ! 🤦🤦🤦🤦

C'est exactement le problème.

@lorenz merci beaucoup !

Cette page vous a été utile?
0 / 5 - 0 notes