kubectl «ошибка: вы должны войти в систему на сервере (не авторизовано)» с использованием kubectx, при этом не возникает ошибок, если используется тот же конфиг напрямую - PullRequest
1 голос
/ 10 февраля 2020

Я сталкиваюсь со странным поведением, когда пытаюсь настроить несколько записей среды KUBECONFIG, объединенных с :, например, в следующем примере:

export KUBECONFIG=/Users/user/Work/company/project/setup/secrets/dev-qz/users/admin.conf:/Users/user/Work/company/project/setup/secrets/dev-wer/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test-wer/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test/users/admin.conf:/Users/user/Work/company/project/setup/secrets/dev-jg/users/admin.conf:/Users/user/Work/company/project/setup/secrets/preprod/users/admin.conf:/Users/user/Work/company/project/setup/secrets/dev/users/admin.conf:/Users/user/Work/company/project/setup/secrets/dev-fxc/users/admin.conf:/Users/user/Work/company/project/setup/secrets/cluster-setup/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test-fxc/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test-jg/users/admin.conf:/Users/user/Work/company/project/setup/secrets/test-qz/users/admin.conf

Это то, что происходит: если я выбираю с kubectx кластер (не каждый кластер из списка, а просто любой), когда я пытаюсь kubectl get po я получаю: error: You must be logged in to the server (Unauthorized). Но если попытаться достичь того же кластера, передав его непосредственно команде kubectl с --kubeconfig=<path to the config>, это сработает. Я довольно борюсь с этим и просто хочу знать, сталкивался ли кто-то еще с такими проблемами и как их решить

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

В конце концов я нашел проблему. Команда flatten, предложенная мне @mario, помогла мне лучше отладить ситуацию.

По сути, слияние in memory или in file делает то, что он должен делать: создать kubeconfig со всеми параметрами uniq каждого файла kubeconfig. Это работает отлично, если на или больше kubeconfig не имеет одинаковые метки, которые идентифицируют один и тот же компонент. В этом случае last в порядке выигрывает. Так что если у вас есть следующий пример:

grep -Rn 'name: kubernetes-admin$' infra/secrets/*/users/admin.conf
infra/secrets/cluster1/users/admin.conf:16:- name: kubernetes-admin
infra/secrets/cluster2/users/admin.conf:17:- name: kubernetes-admin
infra/secrets/cluster3/users/admin.conf:16:- name: kubernetes-admin

cluster1 и cluster2 не будут работать, в то время как cluster3 будет работать отлично, кстати, из-за заказа. Решение этой проблемы состоит в том, чтобы избежать неуникальных полей, переименовывая метку, которая идентифицирует пользователя (для примера выше). Как только будет сделано это изменение, все будет работать отлично.

0 голосов
/ 10 февраля 2020

Я согласен с @Bernard. Это не похоже ни на что, специфицирующее от c до kubectx, поскольку это просто bash скрипт, который под капотом использует kubectl бинарный . Вы можете увидеть его код здесь . Я полагаю, что он также потерпит неудачу в kubectl, если вы не предоставите

Но, если попытаетесь достичь того же кластера, передав его непосредственно команде kubectl с параметром --kubeconfig =, это работает .

В способе его тестирования есть некоторая несогласованность, поскольку вы не предоставляете указанный файл c kubeconfig для обеих команд. Когда вы используете kubectx, он использует несколько объединенных в память файлов kubeconfig и сравнивает его с рабочим примером kubectl, в котором вы непосредственно указываете файл kubeconfig, который следует использовать. Чтобы сделать это сравнение согласованным, вы также должны использовать kubectx с этим конкретным kubeconfig файлом. А что произойдет, если вы запустите команду kubectl без указания --kubeconfig=<path to the config>? Я полагаю, вы получаете ошибку, похожую на ту, что вы получаете при запуске kubectx. Пожалуйста, поправьте меня, если я ошибаюсь.

Есть действительно хорошая статья , написанная Ахметом Альпом Балканом - kubectx автором, которая хорошо объясняет, как вы можете работать с несколькими kubeconfig файлы. Как вы можете прочитать в статье :

Совет 2. Использование нескольких kubeconfig одновременно

Иногда у вас есть куча небольших файлов kubeconfig (например, один на кластера), но вы хотите использовать их все сразу, с такими инструментами, как kubectl или kubectx, которые работают с несколькими контекстами одновременно.

Для этого вам понадобится « объединенный »файл kubeconfig. Совет № 3 объясняет, как вы можете объединить kubeconfigs в один файл, но вы также можете объединить их в памяти.

Указав несколько файлов в переменной среды KUBECONFIG, вы можете временно сшить файлы kubeconfig вместе и используйте их все в kubectl.

export KUBECONFIG=file1:file2
kubectl get pods --context=cluster-1
kubectl get pods --context=cluster-2

Совет 3: Объединение файлов kubeconfig

Поскольку файлы kubeconfig являются структурированными YAML-файлами, вы не можете просто добавить их, чтобы получить один большой файл kubeconfig, но kubectl может помочь вам объединить эти файлы:

KUBECONFIG=file1:file2:file3 kubectl config view --merge --flatten > out.txt

Возможные решения:

  1. Попробуйте объединить несколько файлов kubeconfig в один, как в Приведенный выше пример показывает, возможно ли проблема только со слиянием в памяти:

    KUBECONFIG = file1: file2: представление конфигурации kubectl file3 --merge --flatten> out.txt

  2. Просмотрите все свои kubeconfigs и протестируйте их по отдельности, чтобы убедиться, что они работают правильно, если это указано отдельно в переменной KUBECONFIG env. В одном из них может быть ошибка, которая вызывает проблему.

...