首页 > 解决方案 > 如何在 k8s 中自定义资源?

问题描述

假设我有cronjob、<code>service ,deployment如下所示:

# 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 但这对我的项目来说不是很好。欢迎任何建议。

标签: kubernetesyamlkustomize

解决方案


假设以下是您在 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

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


推荐阅读