Ошибка разрешения при использовании kubectl после миграции кластера GKE Kubernetes из одной организации в другую

# #kubernetes #google-cloud-platform #google-kubernetes-engine #gcloud #kubectl

Вопрос:

У меня был кластер GKE my-кластер, созданный в проекте, который принадлежал организации org1.

Когда кластер был создан, я вошел в систему с user@org1.com использование gcloud auth login и настройка локальной конфигурации kubeconfig с помощью gcloud container clusters get-credentials my-cluster --region europe-west4 --project project .

Недавно нам пришлось перенести этот проект (с кластером GKE) в другую организацию, org2. Мы сделали это успешно, следуя документации.

Владельцем IAM в org2 является user@org2.com. Чтобы перенастроить конфигурацию kube, я выполнил предыдущие шаги, войдя в систему в этом случае с помощью user@org2.com:

gcloud auth login

gcloud container clusters get-credentials my-cluster --region europe-west4 --project project .

При выполнении kubectl get pods я получаю сообщение об ошибке, ссылающееся на старого пользователя org1:

 Error from server (Forbidden): pods is forbidden: User "user@org1.com" cannot list resource "pods" in API group "" in the namespace "default": requires one of ["container.pods.list"] permission(s).
 

В чем здесь проблема?

Ответ №1:

Я принял ответ Дазвилкинга, так как в некотором смысле он был прав, файл конфигурации был «непоследовательным».

Проблемный бит был в разделе пользователя:

   user:
    auth-provider:
      config:
        access-token: xxxxxx      
        expiry: "2021-07-11T18:36:42Z"
 

По какой-то причине при использовании gcloud container clusters get-credential команды он создал все элементы (кластер, контекст и пользователь) с недопустимым разделом пользователя.

Чтобы исправить это, я подключился к облачной оболочке непосредственно с веб-консоли Google Cloud и проверил ./kube/config файл там. В моей локальной конфигурации отсутствовали записи cmd-путь, cmd-аргументы, ключ истечения срока действия и ключ токена:

   user:
    auth-provider:
      config:
        access-token: xxx
        cmd-args: config config-helper --format=json
        cmd-path: /Users/xxx/applications/google-cloud-sdk/bin/gcloud
        expiry: "2021-07-11T18:36:42Z"
        expiry-key: '{.credential.token_expiry}'
        token-key: '{.credential.access_token}'
 

Ответ №2:

Возможно, это не ответ, но, надеюсь, это часть ответа.

gcloud container clusters get-credentials это удобная функция , которая изменяет локальную ${KUBECONFIG} (часто ~/.kube/config ) и заполняет ее cluster context свойствами и user свойствами.

Я подозреваю (!?), что вы KUBECONFIG стали непоследовательными.

Вы должны иметь возможность редактировать его напрямую, чтобы лучше понимать, что происходит.

Существует 3 основных блока clusters , contexts и users . Вы хотите найти записи (по одной cluster , context , user ) для вашего старого кластера GKE и для вашего нового кластера GKE.

Ничего не удаляйте

Либо сначала создайте резервную копию файла, либо повторите name записи.

Каждый раздел будет иметь name свойство, отражающее имя кластера GKE gke_${PROJECT}_${LOCATION}_${CLUSTER}

Возможно, это просто current-context неверно.

ПРИМЕЧАНИЕ. Несмотря gcloud на то, что создаются user записи для каждого кластера, они обычно идентичны (для каждого пользователя), поэтому вы можете упростить этот раздел.

ПРИМЕЧАНИЕ. Если вы всегда используете gcloud , он также выполняет достойную работу по наведению порядка (удалению записей).