【问题标题】:How to add a PersistentVolumeClaim to a deployment running GitLab AutoDevops?如何将 PersistentVolumeClaim 添加到运行 GitLab AutoDevops 的部署中?
【发布时间】:2021-09-24 07:00:45
【问题描述】:

我想达到什么目的?

我们正在使用自托管的 GitLab 实例,并使用 GitLab AutoDevops 将我们的项目部署到 Kubernetes 集群。在撰写本文时,我们只使用集群中的一个节点。对于我们的一个项目,重要的是构建的应用程序(即 Pod)能够访问(只读)存储在 Kubernetes 集群节点本身上的文件。

我尝试了什么?

  • 在我们的集群上创建了一个 (hostPath) PersistentVolume (PV)
  • 在我们的集群上创建了一个 PersistentVolumeClaim (PVC)(名为“test-api-claim”)

现在 GitLab AutoDevops 使用默认的 helm 图表来部署应用程序。为了修改它的行为,我已将 this chart 添加到项目的存储库中(如果找到,GitLab AutoDevops 会自动使用项目的 ./chart 目录中的图表)。所以我的思路是修改图表,让部署的 Pod 使用我在集群上手动创建的 PV 和 PVC。

因此我修改了可以找到here的deployment.yaml文件。正如您在以下代码-sn-p 中看到的,我添加了volumeMounts 和volumes 键(默认/原始文件中不存在)。滚动到 sn-p 的末尾以查看添加的键。

{{- if not .Values.application.initializeCommand -}}
apiVersion: {{ default "extensions/v1beta1" .Values.deploymentApiVersion }}
kind: Deployment
metadata:
  name: {{ template "trackableappname" . }}
  annotations:
    {{ if .Values.gitlab.app }}app.gitlab.com/app: {{ .Values.gitlab.app | quote }}{{ end }}
    {{ if .Values.gitlab.env }}app.gitlab.com/env: {{ .Values.gitlab.env | quote }}{{ end }}
  labels:
    app: {{ template "appname" . }}
    track: "{{ .Values.application.track }}"
    tier: "{{ .Values.application.tier }}"
    chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}"
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
{{- if or .Values.enableSelector (eq (default "extensions/v1beta1" .Values.deploymentApiVersion) "apps/v1") }}
  selector:
    matchLabels:
      app: {{ template "appname" . }}
      track: "{{ .Values.application.track }}"
      tier: "{{ .Values.application.tier }}"
      release: {{ .Release.Name }}
{{- end }}
  replicas: {{ .Values.replicaCount }}
{{- if .Values.strategyType }}
  strategy:
    type: {{ .Values.strategyType | quote }}
{{- end }}
  template:
    metadata:
      annotations:
        checksum/application-secrets: "{{ .Values.application.secretChecksum }}"
        {{ if .Values.gitlab.app }}app.gitlab.com/app: {{ .Values.gitlab.app | quote }}{{ end }}
        {{ if .Values.gitlab.env }}app.gitlab.com/env: {{ .Values.gitlab.env | quote }}{{ end }}
{{- if .Values.podAnnotations }}
{{ toYaml .Values.podAnnotations | indent 8 }}
{{- end }}
      labels:
        app: {{ template "appname" . }}
        track: "{{ .Values.application.track }}"
        tier: "{{ .Values.application.tier }}"
        release: {{ .Release.Name }}
    spec:
      imagePullSecrets:
{{ toYaml .Values.image.secrets | indent 10 }}
      containers:
      - name: {{ .Chart.Name }}
        image: {{ template "imagename" . }}
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        {{- if .Values.application.secretName }}
        envFrom:
        - secretRef:
            name: {{ .Values.application.secretName }}
        {{- end }}
        env:
{{- if .Values.postgresql.managed }}
        - name: POSTGRES_USER
          valueFrom:
            secretKeyRef:
              name: app-postgres
              key: username
        - name: POSTGRES_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-postgres
              key: password
        - name: POSTGRES_HOST
          valueFrom:
            secretKeyRef:
              name: app-postgres
              key: privateIP
{{- end }}
        - name: DATABASE_URL
          value: {{ .Values.application.database_url | quote }}
        - name: GITLAB_ENVIRONMENT_NAME
          value: {{ .Values.gitlab.envName | quote }}
        - name: GITLAB_ENVIRONMENT_URL
          value: {{ .Values.gitlab.envURL | quote }}
        ports:
        - name: "{{ .Values.service.name }}"
          containerPort: {{ .Values.service.internalPort }}
        livenessProbe:
{{- if eq .Values.livenessProbe.probeType "httpGet" }}
          httpGet:
            path: {{ .Values.livenessProbe.path }}
            scheme: {{ .Values.livenessProbe.scheme }}
            port: {{ .Values.service.internalPort }}
{{- else if eq .Values.livenessProbe.probeType "tcpSocket" }}
          tcpSocket:
            port: {{ .Values.service.internalPort }}
{{- else if eq .Values.livenessProbe.probeType "exec" }}
          exec:
            command:
{{ toYaml .Values.livenessProbe.command | indent 14 }}
{{- end }}
          initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
          timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
        readinessProbe:
{{- if eq .Values.readinessProbe.probeType "httpGet" }}
          httpGet:
            path: {{ .Values.readinessProbe.path }}
            scheme: {{ .Values.readinessProbe.scheme }}
            port: {{ .Values.service.internalPort }}
{{- else if eq .Values.readinessProbe.probeType "tcpSocket" }}
          tcpSocket:
            port: {{ .Values.service.internalPort }}
{{- else if eq .Values.readinessProbe.probeType "exec" }}
          exec:
            command:
{{ toYaml .Values.readinessProbe.command | indent 14 }}
{{- end }}
          initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
          timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
        resources:
{{ toYaml .Values.resources | indent 12 }}
{{- end -}}
        volumeMounts:
        - mountPath: /data
          name: test-pvc
      volumes:
      - name: test-pvc
        persistentVolumeClaim:
          claimName: test-api-claim
      

有什么问题?

现在,当我触发管道部署应用程序(使用 AutoDevops 和修改后的 helm 图表)时,我收到此错误:

Error: YAML parse error on auto-deploy-app/templates/deployment.yaml: error converting YAML to JSON: yaml: line 71: did not find expected key

脚本中的第 71 行引用了 yaml 中的 valueFrom.secretKeyRef.name:

    - name: POSTGRES_HOST
      valueFrom:
        secretKeyRef:
          name: app-postgres
          key: privateIP

奇怪的是,当我删除 volumes 和 volumeMounts 键时,它按预期工作(并且 valueFrom.secretKeyRef.name 仍然存在并且不会引起任何问题..)。 我没有在 yaml 文件中使用制表符,我仔细检查了缩进。

两个问题

  • 会不会是我的 yaml 有问题?
  • 有没有人知道另一种解决方案来实现我想要的行为? (将 PVC 添加到部署中以便 pod 实际使用它?)

一般信息

  • 我们使用 GitLab EE 13.12.11

  • 对于auto-deploy-image(提供我所指的舵图),我们使用版本 1.0.7

提前致谢,祝您有美好的一天!

【问题讨论】:

  • 我的 yaml 有问题吗?极有可能。尝试运行 helm template,以生成清单并查看最终结果。第 71 行的错误是引用已经模板化的资源,而不是文件预模板中的行。

标签: kubernetes gitlab-ci persistent-volumes persistent-volume-claims gitlab-autodevops


【解决方案1】:

现在默认 helm 图表似乎支持添加持久性。

检查pvc.yamldeployment.yaml
鉴于此,编辑 .gitlab/auto-deploy-values.yaml 中的值应该足以满足您的需求。检查values.yaml 中的默认值以获取更多上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2022-06-17
    • 2020-07-21
    • 2015-10-25
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多