是否可以将skaffold配置文件绑定到名称空间?我想确保开发,登台和产品部署始终使用正确的名称空间。我知道我可以像skaffold run
一样向skaffold run -p dev -n dev
添加一个命名空间,但这容易出错。我想通过将配置文件绑定到名称空间来使构建更加安全。
我尝试根据以下事实将以下内容添加到我的skaffold.yaml
中:skaffold.yaml
中有一个路径为build/cluster/namespace
,但我怀疑我误解了集群的目的规格。
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
我尝试了其他更改集群名称空间的方法,但是它们都失败了。
答案 0 :(得分:1)
是否可以将skaffold配置文件绑定到名称空间?我想 确保开发,阶段和产品部署始终进行 正确的名称空间。我知道我可以向
skaffold run
添加名称空间 像skaffold run -p dev -n dev
一样,但是容易出错。 ID 希望通过将配置文件绑定到名称空间来使我的构建更加安全。
在开始时,我们需要澄清两件事,即我们是在管道的namespaces
还是build
阶段谈论deploy
。一方面,您写的是希望确保开发,调试和生产部署始终使用正确的名称空间,所以我假设您对在您的 kubernetes集群上设置适当的namespace
,最终将在其中构建内置映像。后来,您还提到了通过将配置文件绑定到名称空间来使构建更加安全。如果我错了,请纠正我,但我的猜测是您在namespaces
阶段的意思是deploy
。
所以回答您的问题:是的,可以将skaffold配置文件绑定到特定的名称空间。
我尝试根据以下内容将以下内容添加到我的
skaffold.yaml
中:skaffold.yaml
中有一条路径是 build/cluster/namespace,但我怀疑我误会了 集群规范的目的。
您是对的,skaffold.yaml
中有这样的路径,但是您的示例应如下所示:
profiles:
- name: local
patches:
- op: replace
path: /build/cluster/namespace
value: testing
请注意,cluster
元素与artifacts
处于相同的缩进级别。如您在reference中所读:
cluster: # beta describes how to do an on-cluster build.
,如您所见,它的大多数选项与kaniko
相关。也可以与特定patched
中其他skaffold.yaml
元素相同的方式使用profiles
,但是无论如何我都不认为这是您真正关心的元素,因此让我们将其保留现在。
顺便说一句。您可以通过runnig轻松验证skaffold.yaml
语法:
skaffold fix
如果每个元素都正确使用,则所有缩进级别都正确,等等。它将打印:
config is already latest version
否则类似以下错误:
FATA[0000] creating runner: applying profiles: applying profile prod: invalid path: /build/cluster/namespace
您可以通过设置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
将部署在 kubernetes集群的prod
namespace
中:
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