Cloud Build Bazel Ошибка: «kubectl toolchain не был правильно настроен, поэтому применение не может быть выполнено» - PullRequest
2 голосов
/ 02 февраля 2020

Я пытаюсь использовать rules_k8s для развертывания Bazel в моем кластере Kubernetes.

Таким образом, у меня есть файл cloudbuild.yaml, который выполняется Google Cloud Build:

steps:
  - name: gcr.io/cloud-builders/bazel
    args: ['run', '//:kubernetes.apply']

(//:kubernetes - это всего лишь k8s_objects)


На моей локальной машине работает bazel run //:kubernetes.apply, но работает успешно, но Google Cloud Build работает успешно , он регистрирует эти ошибки. Таким образом, конфигурация не применяется к моему кластеру Kubernetes:

Target //:kubernetes.apply up-to-date:
  bazel-bin/kubernetes.apply
INFO: Elapsed time: 29.863s, Critical Path: 0.14s
INFO: 0 processes.
INFO: Build completed successfully, 1 total action
INFO: Running command line: bazel-bin/kubernetes.apply
INFO: Build Event Protocol files produced successfully.
INFO: Build completed successfully, 1 total action
kubectl toolchain was not properly configured so k8s_deployment.apply cannot be executed.
kubectl toolchain was not properly configured so k8s_service.apply cannot be executed.
kubectl toolchain was not properly configured so projection_database_k8s_deployment.apply cannot be executed.
kubectl toolchain was not properly configured so projection_database_k8s_service.apply cannot be executed.
kubectl toolchain was not properly configured so k8s_deployment.apply cannot be executed.
kubectl toolchain was not properly configured so k8s_service.apply cannot be executed.
kubectl toolchain was not properly configured so k8s_deployment.apply cannot be executed.
kubectl toolchain was not properly configured so k8s_service.apply cannot be executed.
kubectl toolchain was not properly configured so event_store_k8s_deployment.apply cannot be executed.
kubectl toolchain was not properly configured so event_store_k8s_service.apply cannot be executed.
kubectl toolchain was not properly configured so k8s_deployment.apply cannot be executed.
kubectl toolchain was not properly configured so k8s_service.apply cannot be executed.
kubectl toolchain was not properly configured so event_store_k8s_deployment.apply cannot be executed.
kubectl toolchain was not properly configured so event_store_k8s_service.apply cannot be executed.
kubectl toolchain was not properly configured so k8s_deployment.apply cannot be executed.
kubectl toolchain was not properly configured so k8s_service.apply cannot be executed.
kubectl toolchain was not properly configured so event_store_k8s_deployment.apply cannot be executed.
kubectl toolchain was not properly configured so event_store_k8s_service.apply cannot be executed.

Я также получаю предупреждение из кэша Bazel:

DEBUG: /builder/home/.cache/bazel/_bazel_root/eab0d61a99b6696edb3d2aff87b585e8/external/io_bazel_rules_k8s/toolchains/kubectl/kubectl_toolchain.bzl:28:9: No kubectl tool was found or built, executing run for rules_k8s targets might not work.

PS: я получаю те же ошибки при использовании //:kubernetes.create

Мои настройки

Развертывания

load("@io_bazel_rules_k8s//k8s:object.bzl", "k8s_object")
k8s_object(
  name = "k8s_deployment",
  kind = "deployment",
  cluster = "gke_cents-ideas_europe-west3-a_cents-ideas",
  template = ":ideas.deployment.yaml",
  images = {
    "gcr.io/cents-ideas/ideas:latest": ":image"
  },
)

Услуги

k8s_object(
  name = "k8s_service",
  kind = "service",
  cluster = "gke_cents-ideas_europe-west3-a_cents-ideas",
  template = ":ideas.service.yaml",
)

Совокупности

load("@io_bazel_rules_k8s//k8s:objects.bzl", "k8s_objects")
k8s_objects(
    name = "k8s",
    objects = [
      ":k8s_deployment",
      ":k8s_service",
    ]
)

Окончательная композиция

k8s_objects(
    name = "kubernetes",
    objects = [
        "//services/ideas:k8s",
        # ...
    ]
)

Обновление

Я уже пытался создать собственное docker изображение с помощью Bazel и kubectl:

FROM gcr.io/cloud-builders/bazel

RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin/kubectl

Я перенес его в GCR и изменил свой cloudbuild.yaml на:

steps:
  - name: eu.gcr.io/cents-ideas/bazel-kubectl
    args: ["run", "//:kubernetes.apply"]

Сначала я заметил, что шаг занял больше времени, чем раньше. Однако в конце выдается ошибка:

$ /usr/local/bin/kubectl --kubeconfig= --cluster=gke_cents-ideas_europe-west3-a_cents-ideas --context= --user= apply -f -
error: cluster "gke_cents-ideas_europe-west3-a_cents-ideas" does not exist

Здесь - полный журнал.

Ответы [ 3 ]

3 голосов
/ 04 февраля 2020

Что касается обновленного вопроса, теперь вам нужно как-то аутентифицироваться в GKE внутри контейнера.

Прежде всего, я рекомендую установить инструмент gcloud в ваш контейнер. Кстати, что касается огромного контейнера размером 1,2 ГБ, это потому, что cloud-builders/bazel огромен:)

Посмотрите на наш пример для тонкой версии контейнера Bazel: https://github.com/aspect-development/bazel-k8s-example/blob/master/tools/Dockerfile.dazel

А вот Dockerfile для установки gcloud и kubectl, так что вы можете получить необходимые детали из обоих файлов: https://github.com/GoogleCloudPlatform/cloud-builders/blob/master/gcloud/Dockerfile

Во-вторых, аутентификация, после установки gcloud она должна расслабьтесь. Общий шаг облачной сборки должен выглядеть примерно так:

- name: <link to your container>
  entrypoint: /bin/sh
  args:
  - -c
  - |
    gcloud container clusters get-credentials cents-ideas --zone europe-west3-a --project cents-ideas
    bazel run //:kubernetes.apply
2 голосов
/ 03 февраля 2020

Он жалуется, что не может найти kubectl на вашем компьютере. Если используется GKE, необходимо также установить gcloud sdk.

И также проверить, настроена ли аутентификация для этих инструментов: kubectl auth , GKE auth .

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

Основная проблема в том, что kubectl не поставляется с gcr.io/cloud-builders/bazel docker изображением. Вот почему он не может быть найден.

Однако предпринимаются попытки внедрить инструментальную цепочку kubectl в Bazel вручную: https://github.com/bazelbuild/rules_k8s/tree/master/toolchains/kubectl#kubectl -toolchain . Но поскольку эти функции в настоящее время находятся в экспериментальном состоянии, они часто не работают.

В этом выпуске можно найти дополнительную информацию: https://github.com/bazelbuild/rules_k8s/issues/512

Пока что вам лучше всего установить kubectl в контейнере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...