动态

详情 返回 返回

【趙渝強老師】使用Helm簡化Kubernetes(K8s)應用的部署和管理 - 动态 详情

在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的體系架構。
image.png

從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

image.png

三、 使用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

image.png

(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”的狀態。

image.png

(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

image.png

(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

image.png

Add a new 评论

Some HTML is okay.