T ie профиль скаффолда в пространстве имен - PullRequest
2 голосов
/ 04 февраля 2020

Есть ли способ сделать ie профиль скаффолда в пространстве имен? Я хотел бы убедиться, что развертывания dev, staging и prod всегда go в правильном пространстве имен. Я знаю, что могу добавить пространство имен к skaffold run как skaffold run -p dev -n dev, но это немного подвержено ошибкам. Я бы хотел сделать свои сборки еще безопаснее, привязав профили к пространствам имен.

Я попытался добавить следующее к своему skaffold.yaml, основываясь на том факте, что в skaffold.yaml есть путь build/cluster/namespace, но я подозреваю, что неправильно понимаю цель кластера spe c.

profiles:
- name: local
  patches:
  - op: replace
    path: /build/artifacts/0/cluster/namespace
    value: testing

но я получаю ошибку

 ❮❮❮ skaffold render -p local
FATA[0000] creating runner: applying profiles: applying profile local: invalid path: /build/artifacts/0/cluster/namespace

Я пробовал другие варианты изменения пространства имен кластера, но все они терпят неудачу.

1 Ответ

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

если TL / DR: пожалуйста, go непосредственно в "решение" (последний раздел)

Есть ли способ, чтобы t ie профиль скаффолда переместился в пространство имен? Я хотел бы убедиться, что развертывания dev, staging и prod всегда go в правильном пространстве имен. Я знаю, что могу добавить пространство имен к skaffold run как skaffold run -p dev -n dev, но это немного подвержено ошибкам. Я хотел бы сделать свои сборки еще более безопасными, привязав профили к пространствам имен.

Сначала нам нужно уточнить две вещи, а именно, говорим ли мы о namespaces в build или deploy этап газопровода. С одной стороны, вы пишете, что вы хотите, чтобы гарантировал, что dev, staging и prod развертывания всегда go в правильном пространстве имен , поэтому я предполагаю, что вы довольно заинтересованы установка соответствующего namespace в вашем кластере kubernetes , в котором встроенные образы будут в конечном итоге развернуты. Однако позже вы упомянули о том, что делает сборок еще более безопасным, привязывая профили к пространствам имен . Пожалуйста, поправьте меня, если я ошибаюсь, но я предполагаю, что вы скорее имеете в виду namespaces на этапе deploy.

Итак, отвечая на ваш вопрос: да, это возможно до t ie профиль skaffold для указанного c пространства имен .

Я попытался добавить следующее к своему skaffold.yaml, основываясь на том факте, что в skaffold.yaml есть путь, который build / cluster / namespace но я подозреваю, что неправильно понимаю назначение кластера spe c.

Вы правы, такой путь есть в skaffold.yaml, но тогда ваш пример должен выглядеть следующим образом:

profiles:
- name: local
  patches:
  - op: replace
    path: /build/cluster/namespace
    value: testing

Обратите внимание, что элемент cluster находится на том же уровне отступа, что и artifacts. Как вы можете прочитать в справочнике :

cluster:    #   beta describes how to do an on-cluster build.

и, как вы можете видеть, большинство его опций связаны с kaniko. Также это может быть patched таким же образом, как и другие элементы skaffold.yaml в спецификациях c profiles, но в любом случае я не думаю, что это элемент, который вас действительно беспокоит, поэтому давайте оставим его пока.

Кстати. Вы можете легко проверить ваш синтаксис skaffold.yaml, запустив runnig:

skaffold fix

Если каждый элемент используется должным образом, все уровни отступов правильны и т. д. c. он напечатает:

config is already latest version

в противном случае что-то вроде ошибки ниже:

FATA[0000] creating runner: applying profiles: applying profile prod: invalid path: /build/cluster/namespace

решение

Вы можете убедиться, что ваши развертывания go в правильное пространство имен, установив kubectl flags. Предполагается, что вы используете docker в качестве builder и kubectl в качестве развертывателя. Поскольку существует множество различных builders и deployers, поддерживаемых skaffold, например, при развертывании с helm подробное решение может выглядеть совсем иначе.

Одно очень важное предупреждение: путь должен уже присутствовать в вашей общей части конфигурации, иначе вы не сможете его пропатчить в разделе profiles, например:

, если у вас есть в разделе профилей следующий patch:

profiles:
- name: prod
  patches:
  - op: replace
    path: /build/artifacts/0/docker/dockerfile
    value: DifferentNameForDockerfile

следующий раздел должен уже присутствовать в вашем skaffold.yaml:

build:
  artifacts:
  - image: skaffold-example
    docker:
      dockerfile: Dockerfile # the pipeline will fail at build stage

Возвращаясь к нашему namaspaces, сначала нам нужно установить значения по умолчанию в разделе deploy:

deploy:
  kubectl:
    manifests:
    - k8s-pod.yaml
    flags:
      global: # additional flags passed on every command.
      - --namespace=default
#     apply: # additional flags passed on creations (kubectl apply).
#     - --namespace=default
#     delete: # additional flags passed on deletions (kubectl delete).
#     - --namespace=default

Я установил только global флаги, но это также можно установить для команд apply и delete отдельно.

На следующем шаге нам нужно переопределить наше значение по умолчанию ( они уже должны присутствовать, поэтому мы можем их переопределить) в нашем profiles:

profiles:
- name: dev
  patches:
  - op: replace
    path: /deploy/kubectl/flags/global/0
    value: --namespace=dev
- name: staging
  patches:
  - op: replace
    path: /deploy/kubectl/flags/global/0
    value: --namespace=staging
- name: prod
  patches:
  - op: replace
    path: /deploy/kubectl/flags/global/0
    value: --namespace=prod

Тогда мы можем выполнить:

skaffold run --render-only --profile=prod

Как мы видим, наше Pod будет развернут в prod namespace нашего кластера kubernetes :

Generating tags...
 - skaffold-example -> skaffold-example:v1.3.1-15-g11d005d-dirty
Checking cache...
 - skaffold-example: Found Locally
apiVersion: v1
kind: Pod
metadata:
  labels:
    app.kubernetes.io/managed-by: skaffold-v1.3.1
    skaffold.dev/builder: local
    skaffold.dev/cleanup: "true"
    skaffold.dev/deployer: kubectl
    skaffold.dev/docker-api-version: "1.39"
    skaffold.dev/profile.0: prod
    skaffold.dev/run-id: b83d48db-aec8-4570-8cb8-dbf9a7795c00
    skaffold.dev/tag-policy: git-commit
    skaffold.dev/tail: "true"
  name: getting-started
  namespace: prod
spec:
  containers:
  - image: skaffold-example:3e4840dfd2ad13c4d32785d73641dab66be7a89b43355eb815b85bc09f45c8b2
    name: getting-started
...