0

我想达到什么目的?

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

我尝试了什么?

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

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

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

{{- 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

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

4

0 回答 0