Kubespray выдает ошибку "Найдено несколько сокетов CRI, используйте --cri-socket для выбора одного"

Возникла проблема

При развертывании кластера с Kubespray, CRI-O и Cilium я получаю сообщение об ошибке о наличии нескольких сокетов CRI на выбор.

Полная ошибка

fatal: [p3kubemaster1]: FAILED! => {"changed": true, "cmd": " mkdir -p /etc/kubernetes/external_kubeconfig &&  /usr/local/bin/kubeadm  init phase   kubeconfig admin --kubeconfig-dir /etc/kubernetes/external_kubeconfig  --cert-dir /etc/kubernetes/ssl --apiserver-advertise-address 10.10.3.15 --apiserver-bind-port 6443  >/dev/null && cat /etc/kubernetes/external_kubeconfig/admin.conf && rm -rf /etc/kubernetes/external_kubeconfig ", "delta": "0:00:00.028808", "end": "2019-09-02 13:01:11.472480", "msg": "non-zero return code", "rc": 1, "start": "2019-09-02 13:01:11.443672", "stderr": "Found multiple CRI sockets, please use --cri-socket to select one: /var/run/dockershim.sock, /var/run/crio/crio.sock", "stderr_lines": ["Found multiple CRI sockets, please use --cri-socket to select one: /var/run/dockershim.sock, /var/run/crio/crio.sock"], "stdout": "", "stdout_lines": []}

Интересная часть

kubeadm  init phase kubeconfig admin --kubeconfig-dir /etc/kubernetes/external_kubeconfig [...] >/dev/null,"stderr": "Found multiple CRI sockets, please use --cri-socket to select one: /var/run/dockershim.sock, /var/run/crio/crio.sock"}

Что я пробовал

  • 1) Я пробовал установить --cri-socket флаг внутри /var/lib/kubelet/kubeadm-flags.env:
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/var/run/crio/crio.sock --cri-socket=/var/run/crio/crio.sock"

=> Не имеет значения

  • 2) Я проверил /etc/kubernetes/kubeadm-config.yaml но он уже содержит следующий раздел:
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.10.3.15
  bindPort: 6443
certificateKey: 9063a1ccc9c5e926e02f245c06b8d9f2ff3xxxxxxxxxxxx
nodeRegistration:
  name: p3kubemaster1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
  criSocket: /var/run/crio/crio.sock

=> Это уже заканчивается criSocket флаг, так что делать нечего...

  • 3) Пытался отредактировать скрипт ansible, чтобы добавить --cri-socket к существующей команде, но она не работает с Unknow command --cri-socket

Существующий:

{% if kubeadm_version is version('v1.14.0', '>=') %}
    init phase`

Пытался:

{% if kubeadm_version is version('v1.14.0', '>=') %}
    init phase --crio socket /var/run/crio/crio.sock`

Теории

Похоже, проблема исходит от команды kubeadm init phase который несовместим с --crio-socket флаг... (см. пункт 3)

Несмотря на то, что правильный сокет установлен (см. Пункт 2) с помощью файла конфигурации, kubeadm init phase не использует его.

Любые идеи будут оценены;-)
thx

3 ответа

Решение

Наконец-то я понял!

Первоначальная команда kubespray была:
kubeadm init phase kubeconfig admin --kubeconfig-dir {{ kube_config_dir }}/external_kubeconfig

⚠️ Похоже, что --kubeconfig-dir флаг не учитывал количество сокетов крио.

Поэтому я изменил строку на:
kubeadm init phase kubeconfig admin --config /etc/kubernetes/kubeadm-config.yaml


Для людей с похожими проблемами:

Часть InitConfig, которая заставила его работать на мастере, следующая:

apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.10.3.15
  bindPort: 6443
certificateKey: 9063a1ccc9c5e926e02f245c06b8d9f2ff3c1eb2dafe5fbe2595ab4ab2d3eb1a
nodeRegistration:
  name: p3kubemaster1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
  criSocket: /var/run/crio/crio.sock

В kubespray необходимо обновить файл roles/kubernetes/client/tasks/main.yml вокруг строки 57.

Вы должны прокомментировать начальный --kubeconfig-dir раздел и замените его на путь к файлу InitConfig.

Для меня это было создано kubespray в /etc/kubernetes/kubeadm-config.yamlна мастере кубе. Убедитесь, что этот файл существует на вас стороне и что она содержит criSocket ключ в nodeRegistration разделе.

Это сработало для меня для нескольких сокетов cri

      kubeadm init --pod-network-cidr=10.244.0.0/16 --cri-socket=unix:///var/run/cri-dockerd.sock

Команда извлечения изображения перед инициализацией для нескольких cri:

      kubeadm config images pull --cri-socket=unix:///var/run/cri-dockerd.sock

Вы можете выбрать путь к сокету cri из следующей таблицы. Смотрите оригинальную документацию здесь

Я провел небольшое исследование и наткнулся на эту ветку github.

Который указал мне на другой здесь.

Кажется, это kubeadm проблема, которая уже была исправлена, поэтому решение доступно в версии 1.15. Не могли бы вы обновить ее до этой версии (я не уверен, какую из них вы используете, основываясь на обоих ваших вопросах, над которыми я работал) и посмотрите, сохраняется ли проблема сохраняется?

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