Сертификат x509, подписанный неизвестным лицом - Кубернетес

Я настраиваю кластер Kubernetes с двумя узлами в coreos, как описано в https://coreos.com/kubernetes/docs/latest/getting-started.html без фланели. Оба сервера находятся в одной сети.

Но я получаю: x509: сертификат, подписанный неизвестным полномочным лицом (возможно, из-за "crypto/rsa: ошибка проверки" при попытке проверить сертификат уполномоченного органа "kube-ca") при запуске kubelet в работнике.

Я правильно настроил сертификаты TLS на обоих серверах, как описано в документации.

Мастер-узел работает нормально. И kubectl способен стрелять контейнеры и контейнеры в мастер.

Вопрос 1: Как решить эту проблему?

Вопросы 2: Есть ли способ настроить кластер без сертификатов TLS.?

Coreos version:
VERSION=899.15.0
VERSION_ID=899.15.0
BUILD_ID=2016-04-05-1035
PRETTY_NAME="CoreOS 899.15.0"

Etcd conf:

 $ etcdctl member list          
ce2a822cea30bfca: name=78c2c701d4364a8197d3f6ecd04a1d8f peerURLs=http://localhost:2380,http://localhost:7001 clientURLs=http://172.24.0.67:2379

Мастер: kubelet.service:

[Service]
ExecStartPre=/usr/bin/mkdir -p /etc/kubernetes/manifests
Environment=KUBELET_VERSION=v1.2.2_coreos.0
ExecStart=/opt/bin/kubelet-wrapper \
  --api-servers=http://127.0.0.1:8080 \
  --register-schedulable=false \
  --allow-privileged=true \
  --config=/etc/kubernetes/manifests \
  --hostname-override=172.24.0.67 \
  --cluster-dns=10.3.0.10 \
  --cluster-domain=cluster.local
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

Мастер: kube-controller.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kube-controller-manager
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - name: kube-controller-manager
    image: quay.io/coreos/hyperkube:v1.2.2_coreos.0
    command:
    - /hyperkube
    - controller-manager
    - --master=http://127.0.0.1:8080
    - --leader-elect=true 
    - --service-account-private-key-file=/etc/kubernetes/ssl/apiserver-key.pem
    - --root-ca-file=/etc/kubernetes/ssl/ca.pem
    livenessProbe:
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10252
      initialDelaySeconds: 15
      timeoutSeconds: 1
    volumeMounts:
    - mountPath: /etc/kubernetes/ssl
      name: ssl-certs-kubernetes
      readOnly: true
    - mountPath: /etc/ssl/certs
      name: ssl-certs-host
      readOnly: true
  volumes:
  - hostPath:
      path: /etc/kubernetes/ssl
    name: ssl-certs-kubernetes
  - hostPath:
      path: /usr/share/ca-certificates
    name: ssl-certs-host

Мастер: kube-proxy.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kube-proxy
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - name: kube-proxy
    image: quay.io/coreos/hyperkube:v1.2.2_coreos.0
    command:
    - /hyperkube
    - proxy
    - --master=http://127.0.0.1:8080
    securityContext:
      privileged: true
    volumeMounts:
    - mountPath: /etc/ssl/certs
      name: ssl-certs-host
      readOnly: true
  volumes:
  - hostPath:
      path: /usr/share/ca-certificates
    name: ssl-certs-host

Мастер: kube-apiserver.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kube-apiserver
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - name: kube-apiserver
    image: quay.io/coreos/hyperkube:v1.2.2_coreos.0
    command:
    - /hyperkube
    - apiserver
    - --bind-address=0.0.0.0
    - --etcd-servers=http://172.24.0.67:2379
    - --allow-privileged=true
    - --service-cluster-ip-range=10.3.0.0/24
    - --secure-port=443
    - --advertise-address=172.24.0.67
    - --admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota
    - --tls-cert-file=/etc/kubernetes/ssl/apiserver.pem
    - --tls-private-key-file=/etc/kubernetes/ssl/apiserver-key.pem
    - --client-ca-file=/etc/kubernetes/ssl/ca.pem
    - --service-account-key-file=/etc/kubernetes/ssl/apiserver-key.pem
    ports:
    - containerPort: 443
      hostPort: 443
      name: https
    - containerPort: 8080
      hostPort: 8080
      name: local
    volumeMounts:
    - mountPath: /etc/kubernetes/ssl
      name: ssl-certs-kubernetes
      readOnly: true
    - mountPath: /etc/ssl/certs
      name: ssl-certs-host
      readOnly: true
  volumes:
  - hostPath:
      path: /etc/kubernetes/ssl
    name: ssl-certs-kubernetes
  - hostPath:
      path: /usr/share/ca-certificates
    name: ssl-certs-host

Мастер: kube-scheduler.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kube-scheduler
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - name: kube-scheduler
    image: quay.io/coreos/hyperkube:v1.2.2_coreos.0
    command:
    - /hyperkube
    - scheduler
    - --master=http://127.0.0.1:8080
    - --leader-elect=true
    livenessProbe:
      httpGet:
        host: 127.0.0.1
        path: /healthz
        port: 10251
      initialDelaySeconds: 15
      timeoutSeconds: 1

Раб: kubelet.service

[Service]
ExecStartPre=/usr/bin/mkdir -p /etc/kubernetes/manifests

Environment=KUBELET_VERSION=v1.2.2_coreos.0 
ExecStart=/opt/bin/kubelet-wrapper \
  --api-servers=https://172.24.0.67:443 \
  --register-node=true \
  --allow-privileged=true \
  --config=/etc/kubernetes/manifests \
  --hostname-override=172.24.0.63 \
  --cluster-dns=10.3.0.10 \
  --cluster-domain=cluster.local \
  --kubeconfig=/etc/kubernetes/worker-kubeconfig.yaml \
  --tls-cert-file=/etc/kubernetes/ssl/worker.pem \
  --tls-private-key-file=/etc/kubernetes/ssl/worker-key.pem
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

Раб: kube-proxy.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kube-proxy
  namespace: kube-system
spec:
  hostNetwork: true
  containers:
  - name: kube-proxy
    image: quay.io/coreos/hyperkube:v1.2.2_coreos.0
    command:
    - /hyperkube
    - proxy
    - --master=https://172.24.0.67:443
    - --kubeconfig=/etc/kubernetes/worker-kubeconfig.yaml
    - --proxy-mode=iptables
    securityContext:
      privileged: true
    volumeMounts:
      - mountPath: /etc/ssl/certs
        name: "ssl-certs"
      - mountPath: /etc/kubernetes/worker-kubeconfig.yaml
        name: "kubeconfig"
        readOnly: true
      - mountPath: /etc/kubernetes/ssl
        name: "etc-kube-ssl"
        readOnly: true
  volumes:
    - name: "ssl-certs"
      hostPath:
        path: "/usr/share/ca-certificates"
    - name: "kubeconfig"
      hostPath:
        path: "/etc/kubernetes/worker-kubeconfig.yaml"
    - name: "etc-kube-ssl"
      hostPath:
        path: "/etc/kubernetes/ssl"

9 ответов

mkdir -p $HOME/.kube   
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config   
sudo chown $(id -u):$(id -g) $HOME/.kube/config

С официального сайта [kubernetes][1]:

  1. Убедитесь, что файл $HOME/.kube/config содержит действительный сертификат, и повторно создайте сертификат.
  2. Отключите переменную среды KUBECONFIG, используя:

    unset KUBECONFIG

    Или установите его в расположение KUBECONFIG по умолчанию:

    export KUBECONFIG=/etc/kubernetes/admin.conf

  3. Другой обходной путь - перезаписать существующий kubeconfig для пользователя "admin":

   mkdir $HOME/.kube
   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
   sudo chown $(id -u):$(id -g) $HOME/.kube/config```


**Reference:** [official site link reference][2]

[1]: https://kubernetes.io/
[2]: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/troubleshooting-kubeadm/

Пожалуйста, просмотрите это как ссылку и, возможно, поможете решить проблему, экспортировав свои сертификаты:

kops export kubecfg "your cluster-name"
export KOPS_STATE_STORE=s3://"paste your S3 store"

Надеюсь, что это поможет.

Чтобы ответить на ваш первый вопрос, я думаю, что вам нужно сделать несколько вещей, чтобы решить вашу проблему. Сначала запустите команду, приведенную в этой ссылке (kubernetes.io/docs/setup/independent/create-cluster-kubeadm‌ /…), затем несколько команд:1) mkdir -p $HOME/.kube 2)sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config 3) sudo chown $(id -u):$(id -g) $HOME/.kube/config . Этот admin.conf должен быть известен kubectl для правильной работы.

Упомянутый выше обычный метод не работает. Я попытался использовать полные команды для успешного сертификата. Пожалуйста, смотрите команды следующим образом.

$ sudo kubeadm reset
$ sudo swapoff -a 

$ sudo kubeadm init --pod-network-cidr=10.244.10.0/16 --kubernetes- 
  version "1.18.3"
$ sudo rm -rf /home/cm/.kube

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

$ sudo systemctl enable docker.service
$ sudo service kubelet restart

$ kubectl get nodes

Примечания:

Если порт отказывается подключаться, добавьте следующую команду.

$ export KUBECONFIG=$HOME/admin.conf

У меня проблема сохранялась даже после:

      mkdir -p $HOME/.kube   
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config   
sudo chown $(id -u):$(id -g) $HOME/.kube/config

В таком случае перезапуск kubeletрешил проблему:

      systemctl restart kubelet

Для тех, кто, как и я, сталкивается с той же ошибкой только в расширении vs code Kubernetes.

Я переустановил docker/Kubernetes и не обновлял расширение vs code Kubernetes

Вам нужно убедиться, что вы используете правильный kubeconfig, поскольку переустановка Kubernetes создает новый сертификат.

Либо используйте$HOME/.kube/configв опции setKubeconfig или просто скопируйте его в путь, где вы установили расширение vs code для чтения конфигурации. Используя следующую команду

      cp $HOME/.kube/config /{{path-for-kubeconfig}}

Я обнаружил эту ошибку в модулях coredns, создание модуля не удалось из-за x509: сертификат, подписанный неизвестным органом (возможно, из-за «crypto/rsa: ошибка проверки» при попытке проверить сертификат кандидата центра «kube-ca»). Проблема была для меня. заключается в том, что я уже установил кластер k8s на том же узле и использовалkubeadm resetКоманда для удаления кластера. Эта команда оставила некоторые файлы в/etc/cni/это, вероятно, вызвало проблему для меня. Я удалил эту папку и переустановил кластер сkubeadm init.

Я выполнил следующие шаги, и проблема была решена.

  1. Сделайте резервную копию оригинального файла. cp /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf_bkp

  2. Создайте файл символической ссылки в домашнем каталоге пользователя внутри ./kube/ln -s /etc/kubernetes/admin.conf $HOME/.kube/config

Теперь исходная конфигурация связана с основным файлом admin.conf, что решило проблему.

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