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
中統一管理,就非常清楚。
業務服務
業務服務不同於配置,類似與自建基礎設施服務,通常需要提供的部署資源可能包括:
-
deployment 或 statefulset
-
service
-
ingress
-
configmap 僅針對自己的配置
-
secret 僅針對自己的密鑰
所以,業務服務的資源定義類型就會比較多。簡單列一下常規服務的配置:
- StatefulSet 資源配置
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"
- Service 配置
apiVersion: v1
kind: Service
metadata:
name: demo
labels:
app: demo
spec:
type: ClusterIP
ports:
- name: demo
port: 80
targetPort: http
selector:
app: demo
- Ingress 配置
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