【赵渝强老师】使用Helm简化Kubernetes(K8s)应用的部署和管理

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Helm是Kubernetes的应用包管理工具,可简化应用部署与管理。通过Chart模板定义应用配置,支持快速安装、升级和卸载。本文介绍Helm核心概念、部署方法,并实战演示部署MySQL和创建自定义Nginx Chart。

b404.png

在Kubernetes中部署应用程序,需要创建Pod、Deployment和Service等资源,并且创建的步骤也是比较繁琐的。当遇到复杂系统时,Kubernetes的应用部署和管理就变得相当的复杂。好在可以使用Helm来管理Kubernetes,它可以很大程度上简化Kubernetes应用的部署和管理。视频讲解如下:


一、 什么是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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
18天前
|
运维 监控 数据可视化
别让运维跪着查日志了!给老板看的“业务观测”大盘才是真香
深夜告警、业务暴跌、全员背锅?一次支付故障暴露传统监控盲区。我们通过业务观测,将技术指标转化为老板听得懂的“人话”,实现从被动救火到主动洞察的跨越。让技术团队不再跪着查日志,而是站着驱动业务增长。
别让运维跪着查日志了!给老板看的“业务观测”大盘才是真香
|
22天前
|
SQL 数据采集 人工智能
评估工程正成为下一轮 Agent 演进的重点
面向 RL 和在数据层(SQL 或 SPL 环境)中直接调用大模型的自动化评估实践。
854 213
|
21天前
|
缓存 Java Maven
六、Docker 核心技术:Dockerfile 指令详解
想亲手给你的应用程序打造一个专属的“集装箱”吗?Dockerfile就是你的说明书!它其实就是一个简单的文本文件,你可以在里面像搭积木一样,用FROM、COPY、RUN这些指令,一步步告诉Docker如何打包你的应用。最后,通过多阶段构建的小技巧,还能给镜像“减肥”,让它变得轻巧又高效。快来学习用Dockerfile变身打包达人吧!
249 4
|
人工智能 Cloud Native 安全
【AI原生研讨会】阿里云邀您共探企业 AI 原生应用架构升级实践
阿里云邀您参加于11月28日在北京阿里中心举办的“企业AI原生应用架构升级”研讨会,期待与您一起探索如何为企业构建真正可信赖、可扩展、可进化的下一代 AI 应用体系。现场席位有限,立即报名!
【AI原生研讨会】阿里云邀您共探企业 AI 原生应用架构升级实践
|
1月前
|
运维 开发者 Docker
一、Docker:一场颠覆应用部署与运维的容器革命
Docker的出现,就是为了解决“在我电脑上能跑”这个老大难问题。它像个魔法集装箱,把你的程序和它需要的所有东西(比如库、配置)都打包好,这样无论在哪运行,环境都一模一样。理解它很简单,就三个核心玩意儿:镜像是程序的“安装包”,容器是跑起来的程序,而仓库就是存放和分享这些“安装包”的地方。
338 6
|
22天前
|
分布式计算 监控 API
DMS Airflow:企业级数据工作流编排平台的专业实践
DMS Airflow 是基于 Apache Airflow 构建的企业级数据工作流编排平台,通过深度集成阿里云 DMS(Data Management Service)系统的各项能力,为数据团队提供了强大的工作流调度、监控和管理能力。本文将从 Airflow 的高级编排能力、DMS 集成的特殊能力,以及 DMS Airflow 的使用示例三个方面,全面介绍 DMS Airflow 的技术架构与实践应用。
|
27天前
|
移动开发 小程序 前端开发
小程序商城哪个平台好?小程序商城哪家做的比较好
小程序商城开发方式丰富多样,开发团队可依据自身的技术实力、项目具体需求以及资源配备情况,灵活挑选最契合的开发途径。以下将详细介绍几种主流的小程序商城开发方式。
190 5
|
18天前
|
人工智能 算法 安全
所谓“十大GEO公司第一名”靠不靠谱?
AI搜索时代,GEO成流量新战场。各类“TOP1”宣传泛滥,实则多为算法漏洞投机者。企业应警惕虚假头衔,关注技术实力、方法论与案例真实性,选择真正具备研发能力的GEO服务商,构建长期数字竞争力。
|
16天前
|
存储 调度 KVM
深入浅出KVM虚拟化技术原理——Ansible安全基线配置(一)
本文深入解析KVM虚拟化核心机制,涵盖内核如何调度QEMU进程与KVM模块协同工作、CPU虚拟化扩展(VT-x/AMD-V)的硬件加速原理,以及存储池的管理与优势,助你全面掌握KVM底层运行逻辑。
208 11