Для моих тестов e2e я запускаю отдельный кластер, в который я хотел бы импортировать свой производственный сертификат TLS. У меня проблемы с переключением контекста между двумя кластерами (экспорт / получение из одного и импорт / применение (в) к другому), потому что кластер, кажется, не виден.
Я извлек MVCE, используя Cit GitLab и следующие .gitlab-ci.yml
, где я создаю секрет для демонстрационных целей:
stages:
- main
- tear-down
main:
image: google/cloud-sdk
stage: main
script:
- echo "$GOOGLE_KEY" > key.json
- gcloud config set project secret-transfer
- gcloud auth activate-service-account --key-file key.json --project secret-transfer
- gcloud config set compute/zone us-central1-a
- gcloud container clusters create secret-transfer-1-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID --project secret-transfer --machine-type=f1-micro
- kubectl create secret generic secret-1 --from-literal=key=value
- gcloud container clusters create secret-transfer-2-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID --project secret-transfer --machine-type=f1-micro
- gcloud config set container/use_client_certificate True
- gcloud config set container/cluster secret-transfer-1-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID
- kubectl get secret letsencrypt-prod --cluster=secret-transfer-1-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID -o yaml > secret-1.yml
- gcloud config set container/cluster secret-transfer-2-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID
- kubectl apply --cluster=secret-transfer-2-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID -f secret-1.yml
tear-down:
image: google/cloud-sdk
stage: tear-down
when: always
script:
- echo "$GOOGLE_KEY" > key.json
- gcloud config set project secret-transfer
- gcloud auth activate-service-account --key-file key.json
- gcloud config set compute/zone us-central1-a
- gcloud container clusters delete --quiet secret-transfer-1-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID
- gcloud container clusters delete --quiet secret-transfer-2-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID
Я добавил secret-transfer-[1/2]-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID
перед kubectl
инструкциями, чтобы избежать error: no server found for cluster "secret-transfer-1-...-..."
, но это не меняет результат.
Я создал проект secret-transfer
, активировал API Kubernetes и получил ключ JSON для учетной записи службы Compute Engine, которую я предоставляю в переменной среды GOOGLE_KEY
. Выход после проверки
$ echo "$GOOGLE_KEY" > key.json
$ gcloud config set project secret-transfer
Updated property [core/project].
$ gcloud auth activate-service-account --key-file key.json --project secret-transfer
Activated service account credentials for: [131478687181-compute@developer.gserviceaccount.com]
$ gcloud config set compute/zone us-central1-a
Updated property [compute/zone].
$ gcloud container clusters create secret-transfer-1-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID --project secret-transfer --machine-type=f1-micro
WARNING: In June 2019, node auto-upgrade will be enabled by default for newly created clusters and node pools. To disable it, use the `--no-enable-autoupgrade` flag.
WARNING: Starting in 1.12, new clusters will have basic authentication disabled by default. Basic authentication can be enabled (or disabled) manually using the `--[no-]enable-basic-auth` flag.
WARNING: Starting in 1.12, new clusters will not have a client certificate issued. You can manually enable (or disable) the issuance of the client certificate using the `--[no-]issue-client-certificate` flag.
WARNING: Currently VPC-native is not the default mode during cluster creation. In the future, this will become the default mode and can be disabled using `--no-enable-ip-alias` flag. Use `--[no-]enable-ip-alias` flag to suppress this warning.
WARNING: Starting in 1.12, default node pools in new clusters will have their legacy Compute Engine instance metadata endpoints disabled by default. To create a cluster with legacy instance metadata endpoints disabled in the default node pool, run `clusters create` with the flag `--metadata disable-legacy-endpoints=true`.
WARNING: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s).
This will enable the autorepair feature for nodes. Please see https://cloud.google.com/kubernetes-engine/docs/node-auto-repair for more information on node autorepairs.
Creating cluster secret-transfer-1-9b219ea8-9 in us-central1-a...
...done.
Created [https://container.googleapis.com/v1/projects/secret-transfer/zones/us-central1-a/clusters/secret-transfer-1-9b219ea8-9].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-a/secret-transfer-1-9b219ea8-9?project=secret-transfer
kubeconfig entry generated for secret-transfer-1-9b219ea8-9.
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
secret-transfer-1-9b219ea8-9 us-central1-a 1.12.8-gke.10 34.68.118.165 f1-micro 1.12.8-gke.10 3 RUNNING
$ kubectl create secret generic secret-1 --from-literal=key=value
secret/secret-1 created
$ gcloud container clusters create secret-transfer-2-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID --project secret-transfer --machine-type=f1-micro
WARNING: In June 2019, node auto-upgrade will be enabled by default for newly created clusters and node pools. To disable it, use the `--no-enable-autoupgrade` flag.
WARNING: Starting in 1.12, new clusters will have basic authentication disabled by default. Basic authentication can be enabled (or disabled) manually using the `--[no-]enable-basic-auth` flag.
WARNING: Starting in 1.12, new clusters will not have a client certificate issued. You can manually enable (or disable) the issuance of the client certificate using the `--[no-]issue-client-certificate` flag.
WARNING: Currently VPC-native is not the default mode during cluster creation. In the future, this will become the default mode and can be disabled using `--no-enable-ip-alias` flag. Use `--[no-]enable-ip-alias` flag to suppress this warning.
WARNING: Starting in 1.12, default node pools in new clusters will have their legacy Compute Engine instance metadata endpoints disabled by default. To create a cluster with legacy instance metadata endpoints disabled in the default node pool, run `clusters create` with the flag `--metadata disable-legacy-endpoints=true`.
WARNING: Your Pod address range (`--cluster-ipv4-cidr`) can accommodate at most 1008 node(s).
This will enable the autorepair feature for nodes. Please see https://cloud.google.com/kubernetes-engine/docs/node-auto-repair for more information on node autorepairs.
Creating cluster secret-transfer-2-9b219ea8-9 in us-central1-a...
...done.
Created [https://container.googleapis.com/v1/projects/secret-transfer/zones/us-central1-a/clusters/secret-transfer-2-9b219ea8-9].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-a/secret-transfer-2-9b219ea8-9?project=secret-transfer
kubeconfig entry generated for secret-transfer-2-9b219ea8-9.
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
secret-transfer-2-9b219ea8-9 us-central1-a 1.12.8-gke.10 104.198.37.21 f1-micro 1.12.8-gke.10 3 RUNNING
$ gcloud config set container/use_client_certificate True
Updated property [container/use_client_certificate].
$ gcloud config set container/cluster secret-transfer-1-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID
Updated property [container/cluster].
$ kubectl get secret secret-1 --cluster=secret-transfer-1-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID -o yaml > secret-1.yml
error: no server found for cluster "secret-transfer-1-9b219ea8-9"
Я ожидаю, что kubectl get secret
будет работать, потому что оба кластера существуют, а аргумент --cluster
указывает на правый кластер.
2 ответа
Как правило, команды gcloud
используются для управления gcloud
ресурсами и управления тем, как вы проходите аутентификацию с помощью gcloud
, тогда как команды kubectl
влияют на то, как вы взаимодействуете с кластерами Kubernetes, независимо от того, происходят ли они с быть запущенным на GCP и / или созданным в GKE. Поэтому я бы не стал делать:
$ gcloud config set container/use_client_certificate True
Updated property [container/use_client_certificate].
$ gcloud config set container/cluster \
secret-transfer-1-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID
Updated property [container/cluster].
Он не делает то, о чем вы, вероятно, думаете (а именно, что-либо изменяет, как kubectl
нацеливается на кластеры), и может помешать работе будущих команд gcloud
.
Еще одно следствие того, что gcloud
и kubectl
отделены друг от друга, и, в частности, kubectl
не знает о ваших настройках gcloud
, заключается в том, что имя кластера с точки зрения gcloud
не так, как с точки зрения kubectl
. Когда вы делаете что-то вроде gcloud config set compute/zone
, kubectl
ничего об этом не знает, поэтому он должен иметь возможность однозначно идентифицировать кластеры, которые могут иметь одинаковые имена, но находиться в разных проектах и зонах, и, возможно, даже в GKE (например, в миникубе или другом облачном провайдере). Вот почему kubectl --cluster=<gke-cluster-name> <some_command>
не будет работать, и именно поэтому вы видите сообщение об ошибке:
error: no server found for cluster "secret-transfer-1-9b219ea8-9"
Как отметил @coderanger имя кластера, которое генерируется в вашем файле ~/.kube/config
после выполнения gcloud container clusters create ...
, имеет более сложное имя, которое в настоящее время имеет шаблон, похожий на gke_[project]_[region]_[name]
.
Таким образом, вы могли бы запускать команды с kubectl --cluster gke_[project]_[region]_[name] ...
(или kubectl --context [project]_[region]_[name] ...
, что было бы более идиоматично, хотя в этом случае сработает и то и другое, поскольку вы используете одну и ту же учетную запись службы для обоих кластеров), однако для этого требуется знание того, как gcloud
генерирует эти строки для имен контекста и кластера.
Альтернативой было бы сделать что-то вроде:
$ KUBECONFIG=~/.kube/config1 gcloud container clusters create \
secret-transfer-1-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID \
--project secret-transfer --machine-type=f1-micro
$ KUBECONFIG=~/.kube/config1 kubectl create secret secret-1 --from-literal=key=value
$ KUBECONFIG=~/.kube/config2 gcloud container clusters create \
secret-transfer-2-$CI_COMMIT_SHORT_SHA-$CI_PIPELINE_IID \
--project secret-transfer --machine-type=f1-micro
$ KUBECONFIG=~/.kube/config1 kubectl get secret secret-1 -o yaml > secret-1.yml
$ KUBECONFIG=~/.kube/config2 kubectl apply -f secret-1.yml
Имея отдельные KUBECONFIG
файлы, которыми вы управляете, вам не нужно угадывать строки. Установка переменной KUBECONFIG
при создании кластера приведет к созданию этого файла, а gcloud
поместит учетные данные для kubectl
для доступа к этому кластеру в этом файле. Установка переменной среды KUBECONFIG
при выполнении команды kubectl
обеспечит kubectl
использование контекста, заданного в этом конкретном файле.
Вы, вероятно, хотите использовать --context
, а не --cluster
. Контекст устанавливает использование кластера и пользователя. Кроме того, имена контекста и кластера (и пользователя), создаваемые GKE, - это не просто идентификатор кластера, это gke_[project]_[region]_[name]
.
Похожие вопросы
Новые вопросы
kubernetes
ВОПРОСЫ КУБЕРНЕТА ДОЛЖНЫ БЫТЬ ОТНОШЕНЫ К РАЗРАБОТКЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ. Настройка и развертывание здесь не по теме. Хорошее эмпирическое правило: если это происходит за пределами группы, это, вероятно, не по теме. Если речь идет о коде, работающем внутри модуля, то, вероятно, все в порядке.