在Kubernetes中部署應用程序,需要創建Pod、Deployment和Service等資源,並且創建的步驟也是比較繁瑣的。當遇到複雜系統時,Kubernetes的應用部署和管理就變得相當的複雜。好在可以使用Helm來管理Kubernetes,它可以很大程度上簡化Kubernetes應用的部署和管理。視頻講解如下:
https://www.bilibili.com/video/BV1rP1XB8E9V/?aid=115513564926...
一、 什麼是Helm?
Helm通過打包的方式動態創建Kubernetes應用的配置信息,然後生成應用程序的YAML清單文件,並最終由kubectl進行調用完成應用的部署。因此從使用方式上看,Helm類似於Linux YUM的包管理。下面展示了Helm的體系架構。
從Helm 3開始,Helm將所有的配置信息存儲在Kubernetes集羣的配置中。Helm中有三個非常重要的概念,它們分別是:Chart、Repository和Release。
- Chart:應用程序信息的集合,包括了應用程序中對Kubernetes資源的定義和依賴關係的説明等。
- Repository:存放Chart的倉庫。
- Release:Chart的運行的實例,代表一個正在運行的應用。當Chart在Kubernetes集羣中部署成功後,就會生成一個Release。
二、 部署Helm
在GitHub上提供了Helm多種操作系統的二進制版本,下面的步驟將在master節點上安裝和部署Helm。這裏使用的是helm-v3.5.4-linux-amd64.tar.gz。
(1)解壓Helm安裝包,並將helm的可執行命令複製到目錄”/usr/bin/“目錄下。
tar -zxvf helm-v3.5.4-linux-amd64.tar.gz
cd linux-amd64/
mv helm /usr/bin/
(2)添加Helm的Repository倉庫。
#添加Helm官方的Repository倉庫
helm repo add stable https://charts.helm.sh/stable
# 提示:這裏可以添加多個Repository倉庫地址,例如:
helm repo add azure http://mirror.azure.cn/kubernetes/charts/
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
(3)查看Repository倉庫信息
helm repo list
# 輸出的信息如下:
NAME URL
stable https://charts.helm.sh/stable
azure http://mirror.azure.cn/kubernetes/charts/
aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
(4)Helm倉庫的其他操作。
#更新倉庫
helm repo update
#刪除倉庫
helm repo remove aliyun
(5)查看Helm的配置信息。
helm env
# 輸出的信息如下:
HELM_BIN="helm"
HELM_CACHE_HOME="/root/.cache/helm"
HELM_CONFIG_HOME="/root/.config/helm"
HELM_DATA_HOME="/root/.local/share/helm"
HELM_DEBUG="false"
HELM_KUBEAPISERVER=""
HELM_KUBEASGROUPS=""
HELM_KUBEASUSER=""
HELM_KUBECAFILE=""
HELM_KUBECONTEXT=""
HELM_KUBETOKEN=""
HELM_MAX_HISTORY="10"
HELM_NAMESPACE="kubernetes-plugin"
HELM_PLUGINS="/root/.local/share/helm/plugins"
HELM_REGISTRY_CONFIG="/root/.config/helm/registry.json"
HELM_REPOSITORY_CACHE="/root/.cache/helm/repository"
HELM_REPOSITORY_CONFIG="/root/.config/helm/repositories.yaml"
(6)在Repository倉庫中搜索可用的Charts,搜索的結果如下圖所示。
helm search repo
# 提示:默認情況下會搜索所有添加的Helm Repository倉庫,也可以指定搜索某一個Repository倉庫。
# 例如:下面的搜索命令只會搜索aliyun的Repository倉庫。
helm search repo aliyun
三、 使用Helm管理Kubernetes
要通過使用Helm管理Kubernetes,很重要的一步就是就是設置Helm管理的Kubernetes的環境變量。執行下面的命令:
export KUBECONFIG=/root/.kube/config
# 提示:這一步非常重要,在文件“/root/.kube/config”文件中保存了Kubernetes集羣的信息,
# 該信息可以保證Helm與Kubernetes進行通信。為了方便可以將這一步寫到"/etc/profile”裏。
3.1 【實戰】使用Helm部署應用
這裏將使用Helm在Kubernetes中部署一個MySQL數據庫的服務。下面是具體的演示步驟。
(1)在Repository倉庫中搜索可用的MySQL Charts,搜索的結果如下圖所示。
helm search repo mysql
(2)部署一個MySQL數據庫的應用,執行命令:
helm install mysql-demo stable/mysql
# 輸出的信息如下:
NAME: mysql-demo
LAST DEPLOYED: Thu Feb 10 06:33:49 2022
NAMESPACE: kubernetes-plugin
STATUS: deployed
REVISION: 1
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
mysql-demo.kubernetes-plugin.svc.cluster.local
... ...
... ...
# 提示:使用helm install命令至少需要兩個參數:Release的名稱和Charts名稱。
# 以這裏的命令為例:“mysql-demo”是Release的名稱,而“stable/mysql”是Charts的名稱。
# 另外可以使用“helm list”和“helm status mysql-demo”命令查詢Release的狀態信息。
(3)查看部署的Pod、Deployment和Service信息,如下圖所示。
kubectl get all
# 提示:這時候會發現Pod的狀態一直是“Pending”的狀態。
(4)查看Pod的詳細信息。
kubectl describe pod/mysql-demo-5d85fc7bd7-cwpk4
# 輸出的信息如下:
Events:
... ... Message
... ... -------
... ... pod has unbound immediate PersistentVolumeClaims
# 提示:從Message信息中可以看到Pod缺少PVC資源。
(5)查看PVC的資源。
kubectl get pvc
# 輸出的信息如下:
NAME STATUS VOLUME CAPACITY
mysql-demo Pending
(6)查看Charts的詳細信息。
helm show all stable/mysql
# 通過查看輸出的信息,可以確定這裏需要一個8G的PV資源。
... ...
## Persist data to a persistent volume
persistence:
enabled: true
## database data Persistent Volume Storage Class
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, standard on
## GKE, AWS & OpenStack)
##
# storageClass: "-"
accessMode: ReadWriteOnce
size: 8Gi
annotations: {}
... ...
(7)創建MySQL的數據存儲目錄。
mkdir -p /mnt/mysql/data
(8)創建文件“mysql-pv-volume.yaml”並輸入下面的內容:
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-volume-mysql
namespace: kubernetes-plugin
labels:
type: local
spec:
capacity:
storage: 8Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/mysql/data"
(9)創建PV資源。
kubectl apply -f mysql-pv-volume.yaml
(10)查看PV和PVC的資源。
kubectl get pv,pvc
# 輸出的信息如下:
NAME CAPACITY ACCESS MODES
persistentvolume/pv-volume-mysql 8Gi RWO
NAME STATUS VOLUME
persistentvolumeclaim/mysql-demo Bound pv-volume-mysql
# 提示:這時候PVC已經與PV成功綁定。
(11)再次查看部署的Pod、Deployment和Service信息,如下圖所示。
kubectl get all
(12)卸載部署的MySQL應用。
helm uninstall mysql-demo
3.2 【實戰】使用Helm創建自己的Charts
用户可以使用Helm提供的Charts模板創建自己應用程序的Charts。這裏將使用Helm創建一個自己的Nginx Charts,並部署到Kubernetes集羣中。下面是具體的步驟:
(1)生成Nginx Charts的模板。
helm create my-nginx
(2)查看生成的Charts模板。
tree my-nginx/
# 輸出的信息如下:
my-nginx/ Charts包目錄的名稱
├── charts 依賴的子包目錄,裏面可以包含多個依賴的chart包
├── Chart.yaml Charts的描述信息,如:Charts的名稱、版本信息等。
├── templates Kubernetes應用程序的配置模版目錄
│ ├── deployment.yaml Deployment的部署描述文件
│ ├── _helpers.tpl 公有庫定義文件
│ ├── hpa.yaml
│ ├── ingress.yaml Ingress的部署描述文件
│ ├── NOTES.txt
│ ├── serviceaccount.yaml ServiceAccount的部署描述文件
│ ├── service.yaml Service的部署描述文件
│ └── tests
│ └── test-connection.yaml
└── values.yaml
# 提示:用户可以基於這裏生成的模板編輯其中的YAML文件完成相應配置即可,
# 重點是編輯Deployment、Service和Ingress的描述文件。
(3)下面是一個最簡單的Charts模板,這裏只保留的必要的文件。
my-nginx/
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ └── service.yaml
└── values.yaml
(3)編輯文件“values.yaml”,輸入下面的內容:
deployname: my-nginx
replicaCount: 2
image:
repository: nginx
pullPolicy: IfNotPresent
# 提示:這裏定義了Deployment的名稱,副本數以及鏡像的相關信息。
(4)編輯文件“deployment.yaml”,輸入下面的內容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.deployname }}
labels:
app: my-nginx
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: my-nginx
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: {{ .Values.images.repository }}
imagePullPolicy: {{ .Values.images.pullPolicy }}
ports:
- containerPort: 80
# 提示:在文件“deployment.yaml”中引用了文件“values.yaml”中定義的變量值。
(5)編輯文件“service.yaml”,輸入下面的內容:
apiVersion: v1
kind: Service
metadata:
name: my-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: my-nginx
# 提示:文件“service.yaml”也可以使用文件“values.yaml”中定義的變量值。
(6)驗證Charts中的各個文件格式是否正確,執行命令:
helm lint my-nginx/
# 輸出的信息如下:
==> Linting my-nginx/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
(7)打包應用程序。
helm package my-nginx/
# 輸出的信息如下:
Successfully packaged chart and saved it to: /root/my-nginx-0.1.0.tgz
(8)試運行應用程序。
helm install --dry-run my-nginx my-nginx-0.1.0.tgz
# 輸出的信息如下:
NAME: my-nginx
LAST DEPLOYED: Thu Feb 10 08:10:16 2022
NAMESPACE: kubernetes-plugin
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: my-nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: my-nginx
---
# Source: my-nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
labels:
app: my-nginx
spec:
replicas: 2
selector:
matchLabels:
app: my-nginx
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
(9)在Kubernetes集羣中部署應用程序。
helm install my-nginx my-nginx-0.1.0.tgz
(10)查看創建的資源信息,如下圖所示。
kubectl get all