Helm模板經常使用組件

應用鏡像node

應用鏡像是chart包的核心,必須包含:鏡像倉庫地址、鏡像名稱、鏡像版本,values.yaml字段規範以下:git

repository:
  hub: docker.io
  image: gitlab/gitlab-ce
  tag: 11.1.4-ce.0
deployment中引用:
image: {{ .Values.repository.hub }}/{{ .Values.repository.image }}:{{ .Values.repository.tag }}

探針web

應用的探針用於檢測該應用是否健康,是否準備好對外提供服務。健康情況是很是關鍵的屬性,所以每一個應用必須都明確表示如何進行健康檢測。docker

values.yaml文件必須包含如下探針屬性:api

livenessProbe: # 存活探針
   enabled: true
   path: /  # 心跳檢測的接口,默認都是httpGet請求
   initialDelaySeconds: 30 # 容器啓動後第一次執行探測是須要等待多少秒。
   periodSeconds: 60 # 執行探測的頻率。默認是10秒,最小1秒。
   timeoutSeconds: 5 # 探測超時時間。默認1秒,最小1秒。
   successThreshold: 1 # 探測失敗後,最少連續探測成功多少次才被認定爲成功。默認是1
   failureThreshold: 5 # 探測成功後,最少連續探測失敗多少次才被認定爲失敗。默認是3
 readinessProbe: # 就緒探針
   enabled: true
   path: /  # 心跳檢測的接口,默認都是httpGet請求
   initialDelaySeconds: 10
   periodSeconds: 10
   timeoutSeconds: 5
   successThreshold: 1
   failureThreshold: 5

deployment.yaml文件引用探針以下:安全

{{- if .Values.livenessProbe.enabled }}
livenessProbe:
  initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
  periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
  timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
  successThreshold: {{ .Values.livenessProbe.successThreshold }}
  failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
  httpGet:
      path: {{ .Values.livenessProbe.path }}
      port: http
{{- end }}
{{- if .Values.readinessProbe.enabled }}
readinessProbe:
  initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
  periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
  timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
  successThreshold: {{ .Values.readinessProbe.successThreshold }}
  failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
  httpGet:
      path: {{.Values.readinessProbe.path }}
      port: http
{{- end }}

資源限制app

每一個應用都須要使用到CPU和內存資源,若是不加以明確說明,則會致使資源的無畏浪費,而且在資源不足時第一時間就被回收。ide

所以應用都應當明確申明本身所需的資源大小。gitlab

values.yaml文件包含如下屬性:spa

resources:
  requests:  # 聲明最少使用的資源,不夠的話則應用沒法啓動成功
    memory: 256Mi
    cpu: 100m
  limits:    # 聲明最大使用的資源,超過即重啓應用pod
    memory: 256Mi
    cpu: 100m

持久化存儲

應用若是不使用持久化存儲,那麼當應用重啓的時候,以前保存的數據將會都清空。在web無狀態應用中,這是保持環境乾淨很好的一種方式。

可是若是咱們應用有數據須要持久保留的話,就須要使用到持久化存儲了。如下是持久化存儲規範:

values.yaml文件需包含如下屬性:

persistence:
  enabled: true
  local:
    enabled: false # 是否啓用本地存儲
    name: gitlab-pg  # 對應本地存儲名稱
  storageClass: "nfs-dynamic-class"    # 集羣共享存儲
  accessMode: ReadWriteOnce # 存儲訪問模式
  size: 30Mi   # 聲明所需存儲的大小
  annotations: {}

templates目錄下新建auto-pvc.yaml文件,這裏之因此要加一個auto前綴就是爲了保證安裝時首先執行安裝pvc,默認helm是安裝文件名順序來執行安裝的。

內容以下:

{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: {{ .Release.Name }}-pvc
{{- with .Values.persistence.annotations  }}
  annotations:
{{ toYaml . | indent 4 }}
{{- end }}
  labels:
    app: {{ .Release.Name }}
spec:
{{- if .Values.persistence.local.enabled }}
  volumeName: "{{ .Values.persistence.local.name }}"
{{- end }}
  accessModes:
    - {{ .Values.persistence.accessMode | quote }}
  resources:
    requests:
      storage: {{ .Values.persistence.size | quote }}
{{- if .Values.persistence.storageClass }}
{{- if (eq "-" .Values.persistence.storageClass) }}
  storageClassName: ""
{{- else }}
  storageClassName: "{{ .Values.persistence.storageClass }}"
{{- end }}
{{- end }}
{{- end }}

最後根據應用須要讀寫的路徑,掛載到容器內,修改deployment.yaml文件,添加如下內容:

volumes:
- name: data
  {{- if .Values.persistence.enabled }}
  persistentVolumeClaim:
    claimName: {{ .Release.Name }}-pvc
  {{- else }}
  emptyDir: {}
  {{- end }}

# containers子標籤中添加

volumeMounts:
- name: data
  mountPath: /mnt # 應用容器內須要讀寫的路徑

本地存儲

咱們之後有不少應用都須要支持本地存儲,本地存儲修改內容以下:

values.yaml
persistence:
  enabled: true
  local:
    enabled: true    # 啓用本地存儲
    name: gitlab-pg  # 對應本地存儲名稱
  accessMode: ReadWriteOnce
  size: 20Gi
  storageClass: "-"  # 取消共享存儲
  annotations: {}
nodeSelector:
  kubernetes.io/hostname: 10.160.144.72  # 對應本地運行主機

安全

設置Pod運行的用戶,通常狀況爲了安全起見,容器內不建議使用root用戶進行運行。可是若是須要使用本地存儲,那麼就必需要使用root用戶運行了。

另外在使用共享存儲時,能夠將usePodSecurityContext設置爲false。

設置以root運行,在values.yaml文件添加:

security:
  usePodSecurityContext: true
  runAsUser: 0
  fsGroup: 0

在deployment.yaml文件中添加:

{{- if .Values.security.usePodSecurityContext }}
      securityContext:
        runAsUser: {{ default 0 .Values.security.runAsUser }}
{{- if and (.Values.security.runAsUser) (.Values.security.fsGroup) }}
        fsGroup: {{ .Values.security.fsGroup }}
{{- end }}
{{- end }}
相關文章
相關標籤/搜索