【问题标题】:How to kustomize resouce in k8s?如何在 k8s 中自定义资源?
【发布时间】:2021-07-07 04:04:54
【问题描述】:

假设我有cronjobservicedeployment,如下所示:

# Create a directory to hold the base
mkdir base
# Create a base/deployment.yaml
cat <<EOF > base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
EOF

# Create a base/service.yaml file
cat <<EOF > base/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx
EOF

# Create a base/cronjob.yaml file
cat <<EOF > base/cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
EOF

# Create a base/kustomization.yaml
cat <<EOF > base/kustomization.yaml
resources:
- deployment.yaml
- service.yaml
- cronjob.yaml
EOF

通常,一切正常,但有时我的项目不需要运行 cronjob,所以我想禁用 cronjob.yaml 导入。 那么,有没有办法做到这一点?例如像jinja2,

- deployment.yaml
- service.yaml
{{ IF set CRONJOB }}
- cronjob.yaml
{{ ENDIF }}

我了解@AniAggarwal 发布的内容,我可以在运行kubectl apply -f 之前使用过滤器,但这对我的项目来说不是很好。 欢迎提出任何建议。

【问题讨论】:

  • 您是否对 cronjob.yaml 进行了更改?如果是这样,它将被更改..如果您想有选择地应用资源,那么您可能也需要考虑使用一些 yml 模板,例如 ytt。你可以在那里传递一个标志,然后应用你想要的资源。
  • @AniAggarwal 哦,真的吗?怎么做?对我来说,有时我希望我的模板只支持服务和部署。
  • 查看以下项目:github.com/Agilicus/yaml_filtercarvel.dev。更具体地看看这个例子carvel.dev/ytt/#example:example-if
  • @AniAggarwal 我试过你的方法,但对我不好,有什么好主意吗?例如,我可以使用 patchStrategicMerge 吗?
  • 你能再解释一下用例吗?我想了解一下您要实现的目标是什么?

标签: kubernetes yaml kustomize


【解决方案1】:

假设以下是您在 kustomize 命令后生成的文件。并且该服务应该像您的 cronjob 一样是有条件的。

kind: Pod
apiVersion: v1
metadata:
  name: echo-app
  labels: 
    app: demo
spec:
  containers:
  - name: nginx
    image: nginx

#@ if/end data.values.service.enabled:
---
kind: Service
apiVersion: v1
metadata:
  name: echo-service
spec:
  selector:
    labels:
      app: name
  ports:
  - name: port
    port: 80

您可以将您的 kustomize 命令的输出通过管道传输到 ytt 以添加或删除服务。

kustomize build | ytt --data-value service.enabled=false -f - | kubectl apply -f - 

查看项目游乐场以获取另一个示例 https://carvel.dev/ytt/#playground https://github.com/vmware-tanzu/carvel-ytt/blob/develop/examples/data-values/run.sh

希望这是您正在寻找的解决方案。祝你好运!

【讨论】:

    猜你喜欢
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    相关资源
    最近更新 更多