【问题标题】:Kubernetes write once, deploy anywhereKubernetes 一次编写,随处部署
【发布时间】:2021-05-28 13:45:07
【问题描述】:

假设我已经构建了一个复杂的 Kubernetes 部署/工作负载,其中包括部署、状态集、服务、操作符、具有特定配置的 CRD 等……工作负载/部署是由单独的命令创建的(kubectl create , helm install…)…

1-) 有没有办法动态(非手动) 生成描述部署的脚本或特殊文件,并可用于重新部署/重新安装我的部署,而无需进入每个命令一个接一个。

2-) 是否存在一种领域特定语言 (DSL) 或类似的东西,通过它可以独立于最终目标 kubernetes 集群目标来描述 Kubernetes 部署,无论是 GKE、AWS、Azure 还是内部部署……有点编写一次部署到任何地方……

谢谢。

【问题讨论】:

  • 当然,使用 yaml 文件。
  • 例如,您想提供一种特殊类型的磁盘/卷(例如本地 SSD...),您将如何使用 GKE、AWS、azk 的相同语法来表达此要求... . 另外,我的第一个问题是关于给定一个部署,我想从这个部署中动态/自动生成一个可用于重新部署的单个文件,而无需管理多个 yaml 文件或自己编写自定义舵图.请注意问题的要求。
  • 您想以特定方式实现它吗?您可以拥有一个 yaml 并仅更改内部值或使用 Helm 只能更改特定值?您能否将评论中的信息添加到主要问题?会更显眼。

标签: kubernetes google-kubernetes-engine kubernetes-helm azure-aks


【解决方案1】:

我认为 Kustomize 和 Helm 是你最好的选择。我们可以将 helm chart 编写为模板,并决定使用哪个模板与 Go-Templating 和条件一起使用。

例如,看看下面有几个条件的配置文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.appName }}
  namespace: {{ .Values.namespace }}
spec:
  selector:
    matchLabels:
      app: {{ .Values.appName }}
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      annotations:
      labels:
        app: {{ .Values.appName }}
    spec:
      containers:
      - name: {{ .Values.appName }}
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        {{- if .Values.hasSecretVolume }}
        volumeMounts:
        - name: {{ .Values.appName }}-volume-sec
          mountPath: {{ .Values.secretVolumeMountPath }}
        {{- end}}
        {{- if or .Values.env.configMap .Values.env.secrets }}
        envFrom:
        {{- if .Values.env.configMap }}
        - configMapRef:
            name: {{ .Values.appName }}-env-configmap
        {{- end }}
        {{- if .Values.env.secrets }}
        - secretRef:
            name: {{ .Values.appName }}-env-secret
        {{- end }}
        {{- end }}
        ports:
        - containerPort: {{ .Values.containerPort }}
          protocol: TCP
{{- if .Values.railsContainerHealthChecks}}
{{ toYaml .Values.railsContainerHealthChecks | indent 8 }}
{{- end}}
      {{- if .Values.hasSecretVolume }}
      volumes:
      - name: {{ .Values.appName }}-volume-sec
        secret:
          secretName: {{ .Values.appName }}-volume-sec
      {{- end}}
      {{- if .Values.imageCredentials}}
      imagePullSecrets:
      - name: {{.Values.imageCredentials.secretName}}
      {{- end}}

例如,此条件检查 Secret 卷并安装它。 {{- if .Values.hasSecretVolume }} 如果您对helm 和通用模板感兴趣,可以参考这篇中型博客:https://medium.com/srendevops/helm-generic-spring-boot-templates-c9d9800ddfee

【讨论】:

  • @Mazen Ezzeddine 你能接受这个答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多