應用鏡像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 }}