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

简介: 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
相关文章
|
1月前
|
运维 监控 数据可视化
别让运维跪着查日志了!给老板看的“业务观测”大盘才是真香
深夜告警、业务暴跌、全员背锅?一次支付故障暴露传统监控盲区。我们通过业务观测,将技术指标转化为老板听得懂的“人话”,实现从被动救火到主动洞察的跨越。让技术团队不再跪着查日志,而是站着驱动业务增长。
别让运维跪着查日志了!给老板看的“业务观测”大盘才是真香
|
1月前
|
缓存 Java Maven
六、Docker 核心技术:Dockerfile 指令详解
想亲手给你的应用程序打造一个专属的“集装箱”吗?Dockerfile就是你的说明书!它其实就是一个简单的文本文件,你可以在里面像搭积木一样,用FROM、COPY、RUN这些指令,一步步告诉Docker如何打包你的应用。最后,通过多阶段构建的小技巧,还能给镜像“减肥”,让它变得轻巧又高效。快来学习用Dockerfile变身打包达人吧!
|
1月前
|
SQL 数据采集 人工智能
评估工程正成为下一轮 Agent 演进的重点
面向 RL 和在数据层(SQL 或 SPL 环境)中直接调用大模型的自动化评估实践。
956 219
|
2月前
|
监控 Linux 调度
【赵渝强老师】Docker容器的资源管理机制
本文介绍了Linux CGroup技术及其在Docker资源管理中的应用。通过实例演示了如何利用CGroup限制应用程序的CPU、内存和I/O带宽使用,实现系统资源的精细化控制,帮助理解Docker底层资源限制机制。
227 6
|
2月前
|
负载均衡 算法 Java
【SpringCloud(5)】Hystrix断路器:服务雪崩概念;服务降级、服务熔断和服务限流概念;使用Hystrix完成服务降级与服务熔断
多个微服务之间的调用,结社微服务A调用微服务B和微服务C,微服务B和微服务C有调用其他的微服务,这就是所谓的“扇出”如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所以的 “雪崩效应”
532 138
|
1月前
|
应用服务中间件 Shell nginx
七、Docker核心技术:深入理解网络模式 (Bridge, Host, None, Container)
容器不仅仅是孤立的运行环境,它们需要相互通信,也需要与外部世界进行交互。理解 Docker 的不同网络模式,是构建和部署复杂多容器应用的关键。本节将深入探讨 Docker 原生提供的四种网络模式以及强烈推荐使用的自定义网络。要让它们通信,需要将其中一个容器也连接到另一个网络上。默认 bridge 网络不支持容器名DNS解析,只能通过IP地址通信。容器没有自己的独立IP地址,它共享宿主机的IP。网络模式启动一个容器后,如何查看该容器的IP地址?时,该容器默认会连接到哪个网络?模式运行,并且其内部的应用监听。
|
1月前
|
存储 监控 Shell
四、Portainer图形化管理实战与Docker镜像原理
如果觉得命令行繁琐,可以试试Portainer这个图形化管理工具,让你在网页上点点鼠标就能轻松管理容器和镜像。安装它只需要一条docker run命令,非常方便。 同时,要理解Docker为何如此高效,关键在于它的镜像原理:镜像像洋-葱一样分层,启动容器时只在外面加一层可写的“外皮”。所有改动都发生在这层“外皮”上,这就是容器启动快、占用空间小的秘诀。
|
2月前
|
负载均衡 算法 Java
【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
1. 什么是服务治理? SpringCloud封装了Netfix开发的Eureka模块来实现服务治理 在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
274 0
|
17天前
|
缓存 运维 监控
一次内存诊断,让资源利用率提升 40%:揭秘隐式内存治理
阿里云云监控 2.0 推出 SysOM 底层操作系统诊断能力,基于 eBPF + BTF 协同分析,无需侵入业务,即可一键完成从物理页到文件路径、再到容器进程的全栈内存归因,让“黑盒内存”无所遁形。
422 67
|
1月前
|
分布式计算 监控 API
DMS Airflow:企业级数据工作流编排平台的专业实践
DMS Airflow 是基于 Apache Airflow 构建的企业级数据工作流编排平台,通过深度集成阿里云 DMS(Data Management Service)系统的各项能力,为数据团队提供了强大的工作流调度、监控和管理能力。本文将从 Airflow 的高级编排能力、DMS 集成的特殊能力,以及 DMS Airflow 的使用示例三个方面,全面介绍 DMS Airflow 的技术架构与实践应用。