если 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