​Helm 簡明實用指南

通過 Helm 管理 K8S 的資源發佈工作,可以更加有效、清晰的管理 K8S 各類資源,是非常推薦的 K8S 集羣管理工具。以下總結一下在實際項目中 Helm 的應用。在開始使用 Helm 工具之前,提前安裝好工具與環境配置。

Helm 安裝非常簡單,如果本地的 kubectl 可以正常訪問 K8S 集羣,那麼 Helm 即裝即用。

需要注意的是,安裝 Helm 3.0 以上版本。因爲 3.0 版本以後,Helm 不再需要在集羣裏安裝 tiller 服務端,可以直接將安裝歷史記錄在 ConfigMap 資源中。

基礎設施

在開始部署 K8S 集羣之前,可能首先需要的是部署整個集羣的基礎設施。如,數據庫服務、緩存服務、隊列服務等。

自建基礎設施

如果需要自建基礎設施,即直接在集羣內搭建基礎服務,不使用外部服務。常規安裝過程如下:

$: helm search repo mysql

如果找不到相應的資源,可以直接 Google 相應的資源。所謂的 repo 其實就是一個簡單的 Helm Charts 的索引。

$: helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
$: helm repo list

找到需要的資源後,在部署之前,需要自行檢查資源的默認配置是否滿足要求,如果不滿足的話還需要進行自定義設置。完成自定義設置後,再部署上線。具體過程如下:

# 拉取 mysql helm charts 到本地目錄
$: helm pull bitnami/mysql --untar

# 修改定義配置即可
$: vim mysql/values.yaml

# 更新或安裝
$: helm upgrade --install --namespace=[YOUR NAMESPACE] --atomic --history-max 3 mysql-demo ./mysql/ --values ./mysql/values.yaml

外部基礎設施

如果不需要在集羣內自建基礎設施,而是直接使用外部資源時。則在集羣內配置外部基礎設施更加簡單,只需要定義相應的 Service 資源即可。

不過爲了更加易於管理,同樣可以通過 helm 管理外部基礎設施的安裝。基礎過程如下:

# 創建一個新的 Helm Charts, 負責管理所有外部資源
$: helm create external-services

默認創建的 Helm Chart,創建了很多功能模板,可以根據需要自行取捨。對於外部基礎設施而言,只需要定義相應的 Service 資源即可,其他沒有必要的資源模板均可以直接刪除。以阿里 RDS 資源爲例, 刪除 external-services/templates 下無關的資源模板。直接定義一個 mysql.yaml 模板即可

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  externalName: {{.Values.mysql.address}}
  sessionAffinity: None
  type: ExternalName

清空 external-services/values.yaml 無關配置,提供一個 mysql.address 設置即可。

集羣配置

完成集羣的基礎設施配置後,就可以開始完成整個集羣的配置資源了。配置資源,同樣通過一個專門的 Helm charts 進行管理。

# 創建一個新的 Helm Charts, 負責管理集羣配置
$: helm create settings

刪除無關的資源模板。開始添加集羣配置。通常而言,集羣配置也就以下幾種配置類型:

以上配置,在 K8S 集羣中,可以通過 Secret 資源和 ConfigMap 資源進行配置。

證書類配置

證書類配置,主要是將證書文件自動化配置到集羣中,可以通過 Helm 提供模板函數 .Files.Get 讀取文件內容. 以常見的域名證書爲例:

apiVersion: v1
data:
  tls.crt: "{{ .Files.Get "files/example.com.pem" | b64enc }}"
  tls.key: "{{ .Files.Get "files/example.com.key" | b64enc }}"
kind: Secret
metadata:
  name: www-example-com-tls
type: IngressTLS

將證書文件存放到 settings/files 子目錄下即可。

密碼類配置

密碼類配置同樣非常簡單,如:

apiVersion: v1
data:
  ACCESS: {{ .Values.demo.access | b64enc }}
  SECRET: {{ .Values.demo.secret | b64enc }}
kind: Secret
metadata:
  name: demo-secret
type: Opaque

通過將具體的密碼信息設置在 settings/values.yaml 即可。

容器鏡像訪問認證配置

爲了讓集羣在發佈服務時,可以取得相應的服務容器鏡像,還需要提供服務容器鏡像服務器的認證信息。通常,鏡像服務器的認證信息可以通過命令行創建。如果需要固化存儲,在將命令行創建的認證信息資源下載到本地保存即可。

# 可以通過命令幫助查詢如何創建一個鏡像服務的認證信息
$: kubectl create secret docker-registry -h

通用服務配置

通用服務配置,通常是一組業務服務可共用的配置,敏感度不高,則可以通過 ConfigMap 資源的形式進行配置。

apiVersion: v1
kind: ConfigMap
metadata:
  name: your-config
data:
  [yourKey1]{{.values.yourValue1}}
  [yourKey2]{{.values.yourValue2}}
  [yourKey3]{{.values.yourValue3}}

非常簡單。

完成以上各類配置後,直接在 settings 中統一管理,就非常清楚。

業務服務

業務服務不同於配置,類似與自建基礎設施服務,通常需要提供的部署資源可能包括:

所以,業務服務的資源定義類型就會比較多。簡單列一下常規服務的配置:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: demo
  labels:
    app: demo
spec:
  serviceName: demo
  replicas: {{ .Values.deployment.replicaCount }}
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      annotations:
        timstamp: "{{ date "20060102150405" .Release.Time }}"
      labels:
        app: demo
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
            {{- toYaml . | nindent 8 }}
      {{- end }}
      containers:
        - name: demo
          env:
            - name: DEMO_CONFIG
              valueFrom:
                configMapKeyRef:
                  key: CONFIG
                  name: demo-config
            - name: DEMO_SECRET
              valueFrom:
                secretKeyRef:
                  key: SECRET
                  name: demo-secret
          ports:
            - name: http
              containerPort: 8080
          image: "{{ .Values.deployment.image.name }}:{{ .Values.deployment.image.tag }}"
          imagePullPolicy: {{ .Values.deployment.image.imagePullPolicy }}
          command: ["demo""http"]

提供的 values.yaml 配置:

deployment:
  replicaCount: 1
  image:
    name: "your.image.registry/group/image.name"
    tag: latest
    imagePullPolicy: Always

imagePullSecrets:
  - name: "image-pull-secret-1"
  - name: "image-pull-secret-2"
apiVersion: v1
kind: Service
metadata:
  name: demo
  labels:
    app: demo
spec:
  type: ClusterIP
  ports:
    - name: demo
      port: 80
      targetPort: http
  selector:
    app: demo
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
spec:
  tls:
    - hosts:
        - {{.Values.ingress.host.name}}
      secretName: {{.Values.ingress.tls.secretName}}
  rules:
    - host: {{.Values.ingress.host.name}}
      http:
        paths:
          - pathType: Prefix
            path: /v1/api/demo
            backend:
              service:
                name: demo
                port:
                  number: 80

總結

以上就是通過 Helm 的方式來管理 K8S 常規資源的分類管理與部署。如果,還想進一步完成資源的規範化管理,還可以自建 Helm Charts 的資源索引服務。將所有業務服務的 Helm Chart 進行打包管理。具體命令參考 helm package

作者:liujianping

出處:https://goo.gs/9bds8


本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/bKnkaWMfyIC8-nIRzEGH6w