# #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
, он также выполняет достойную работу по наведению порядка (удалению записей).