helm3实战教程 | helm3常用命令和部署应用实战案例

视频来源:B站《k8s(Kubernetes)集群编排工具helm3实战教程》

一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:k8s集群编排工具helm3实战教程 | 汇总_热爱编程的通信人的博客-CSDN博客


1 helm3的常用命令

  1. helm的常用命令使用

version:查看helm客户端版本

repo:添加、列出、移除、更新和索引chart仓库, 可用子命令:add、index、list、remove、update

search:根据关键字搜索chart包

show:查看chart包的基本信息和详细信息, 可用子命令:all、chart、readme、values

pull:从远程仓库中下载拉取chart包并解压到本地, 如:# helm pull test-repo/tomcat --version 0.4.3 --untar, --untar是解压, 不加就是压缩包

create:创建一个chart包并指定chart包名字

install:通过chart包安装一个release实例

list:列出release实例名

扫描二维码关注公众号,回复: 15606115 查看本文章

upgrade:更新一个release实例

rollback:从之前版本回滚release实例, 也可指定要回滚的版本号

uninstall:卸载一个release实例

history:获取release历史, 用法:helm history release实例名

package:将chart目录打包成chart存档文件中, 例如:假如我们修改chart后, 需要将其进打包。# helm package /opt/helm/work/tomcat(chart的目录路径)

get:下载一个release, 可用子命令:all、hooks、manifest、notes、values

status:显示release实例名的状态, 显示已命名版本的状态

  1. helm添加chart仓库和查看仓库 类似yum仓库或docker仓库

添加仓库:

可以添加多个仓库, 添加仓库时候, 记得起个仓库名, 如:stable, aliyun, 或其他, 一般起个稳定版的stable会优先使用。

# helm repo add stable http://mirror.azure.cn/kubernetes/charts #添加微软的,强烈推荐
# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts #添加阿里云的
# helm repo add test-repo http://mirror.kaiyuanshe.cn/kubernetes/charts/ #添加开源社区的
# helm repo list #列出仓库
NAME       URL
test-repo  http://mirror.kaiyuanshe.cn/kubernetes/charts/
stable     http://mirror.azure.cn/kubernetes/charts 
aliyun     https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

更新仓库:

# helm repo update #更新仓库,能更新添加的所有仓库
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "aliyun" chart repository
...Successfully got an update from the "test-repo" chart repository 
...Successfully got an update from the "stable" chart repository

删除仓库:helm repo remove仓库名

# helm repo remove test-repo
  1. 创建chart包:
# helm create mychart #创建一个chart包, chart包名为:mychart
  1. 搜索远程仓库的chart包、查看chart包信息、拉取远程仓库chart包到本地 类似docker search搜索harbor仓库的镜像

(1)搜索chart包格式:helm search repo chart包名

示例:

# helm search repo tomcat
NAME          CHART VERSION   APP VERSION    DESCRIPTION 
stable/tomcat 0.4.3           7.0            DEPRECATED-Deploy a basic tomcat application ...

(2)查看chart包格式:helm show chart chart包名 或 helm show values chart包名 (查看详细信息)

示例:

# helm show charts table/tomcat #查看chart包基础信息
apiVersion: v1
appVersion: "7.0"
deprecated: true 
description: DEPRECATED - Deploy a basic tomcat application server with sidecar as web archive container
home: https://github.com/yahavb 
icon: http://tomcat.apache.org/res/images/tomcat.png 
name: tomcat 
version: 0.4.3
# helm show values stable/tomcat #查看chart包详细信息
replicaCount: 1
image:
  webarchive:
    repository: ananwaresystems/webarchive 
    tag: "1.0"
  tomcat:
    repository: tomcat 
    tag: "7.0"
  pullPolicy: IfNotPresent 
  pullSecrets: []
deploy:
  directory: /usr/local/tomcat/webapps
service:
  name: http
  type: LoadBalancer 
  externalPort: 80
  internalPort: 8080
hostPort: 8009
ingress:
  enabled: false 
  annotations: {}
...

(3)拉取chart包格式:

# helm pull 远程仓库chart包名 --version 0.4.3 --untar #从远程仓库拉取指定版本的chart包到本地并解压, --untar是解压, 不加就是压缩包
# helm pull 远程仓库chart包名 --untar #从远程仓库拉取最新版本的chart包到本地并解压, --untar是解压, 不加就是压缩包

示例:

# helm pulls table/tomcat:0.4.3 --untar 
# helm pull test-repo/tomcat --version 0.4.3 --untar #从远程仓库拉取指定版本的chart包到本地并解压
# ls tomcat/
Chart.yaml README.md templates values.yaml 
# helm pull test-repo/tomcat --untar #从远程仓库拉取最新版本的chart包到本地并解压
# ls tomcat/
Chart.yaml README.md templates values.yaml
  1. helm通过各种类型char包安装一个release实例名来部署k8s相关的资源(如:pod, deployment, svc, ingress等, 根据模板文件定义)

1)从加入到本地的chart官方仓库(从官方仓库在线安装)安装release实例

2)将从chart仓库拉下来的压缩包进行安装release实例(下载好的压缩包本地离线安装release)

3)将从chart仓库拉下来的压缩包解压后, 从解压目录安装release实例(解压下载好的压缩包, 从解压目录离线安装release实例)

4)从一个网络地址(如http服务器)仓库压缩包直接安装release实例

5)在本地创建一个chart包, 通过自定义编辑自己的yaml文件后, 通过本地chart包进行安装release实例

# helm search repo tomcat
# helm install tomcat1 stable/tomcat #从加入到本地的chart社区仓库(从官方仓库在线安装) 安装release实例, tomcat1为release实例名
# helm install tomcat2 tomcat-0.4.3.tgz #从chart仓库拉下来的压缩包进行安装release实例(从本地存档文件离线安装) 
# helm install tomcat3 tomcat #从chart仓库拉下来的压缩包解压后, 从解压目录安装release实例(从解压目录离线安装) 
# helm install db http://url.../mysql-1.6.9.tqz #从一个网络地址仓库压缩包直接安装release实例(从下载服务器安装), db为release实例名

卸载release实例:

# helm uninstall release实例名 后面详细介绍命令
  1. helm基本命令使用(主要三个命令)

install 安装release实例(实际就是k8s应用的安装)

upgrade 升级release实例(实际就是k8s应用的升级)

rollback 回滚release实例(实际就是k8s应用的回滚)

2 helm3部署应用的实战案例(发布、升级、回滚、卸载)

  1. 回顾一下常用的helm基本命令使用(主要三个命令)

install 安装release实例(实际就是k8s应用的安装)

upgrade 升级release实例(实际就是k8s应用的升级)

rollback 回滚release实例(实际就是k8s应用的回滚)

安装release实例:(上面已经介绍了从多种角度进行安装release实例, 下面我们以其中一种进行安装演示)

# helm create chart名  #指定chart名, 创建一个chart包, 通过对chart里template的yaml文件自定义编写成自己需要的后再进行安装
# helm install release实例名 chart目录路径 #指定release实例名和chart包里录路径进行安装release实例

示例:

# helm create mychart #创建一个chart包, chart包名为:mychart 
# helm install test-release ./mychart #指定release实例名和chart包目录路径进行安装release实例

升级release实例:

# helm upgrade release实例名 chart名 --set imageTag=1.19 #指定release名和chart名进行相关set设置的升级
# helm upgrade release实例名 chart名 -f /.../mychart/values.yaml #指定release示例名和chart名和values.yaml文件升级

示例:

# helm upgrade test-release-nginx mychart --set imageTag=1.19 #指定release实例名和chart名set升级
# helm upgrade test-release-nginx mychart -f /root/helm/mychart/values.yaml #指定release示例名和chart名和values.yaml文件升级

回滚release实例:

# helm rollback release实例名 #指定release实例名, 回滚到上一个版本
# helm rollback release实例名 版本号 #指定release实例名, 回滚到指定版本, 注意版本号是release的版本号, 不是镜像版本号

示例:

# helm rollback web-nginx
# helm rollback web-nginx 1.17.10

获取release实例历史:

# helm history release实例名

示例:

# helm history test #test为release实例名
REVISION UPDATED     STATUS                              CHART APP VERSION     DESCRIPTION 
1                    Sun Nov 27 12:34:52 2022 deployed   tomcat-0.4.37.0       Install complete

卸载release实例:

# helm uninstall release实例名

示例:

# helm uninstall test-release-nginx #uninstall直接跟release名, 卸载release实例
  1. helm3部署自定义的应用实战案例(发布、升级、回滚、卸载)以部署nginx服务为例, 其他应用都类似

1)准备环境k8s集群

# kubectl get node
NAME     STATUS    ROLES                   AGE   VERSION 
m1       Ready     control-plane,master    253d  v1.20.4
m2       Ready     control-plane,master    253d  v1.20.4
m3       Ready     control-plane,master    253d  v1.20.4
n1       Ready     <none>                  253d  v1.20.4

2)创建一个模板的chart包, 删除原来的内容, 自定义成我们自己需要的内容, 后面我们自定义部署的yaml文件

[root@m1 ~]# helm create nginx-chart
[root@m1 ~]# ls
nginx-chart
[root@m1 ~]# cd nginx-chart/
[root@m1 nginx-chart]# ls
charts Chart.yaml templates values.yaml
[root@m1 nginx-chart]# > values.yaml #清空所有默认定义的变量,后面我们根据需要自定义
[root@m1 nginx-chart]# rm -rf templates/* #删除原来所有默认的部署yaml文件, 后面我们根据需要自定义

自定义部署的模板yaml文件:

[root@m1 nginx-chart]# vim templates/nginx-deploy-service.yaml #自定义需要的yaml模板文件, deployment和svc, 通过nodeport暴露
apiVersion:apps/v1
kind: Deployment 
metadata:
  name: {
   
   { .Values.deployment_name }}
spec:
  replicas: {
   
   { .Values.replicas }}
  selector: 
    matchLabels:
      app: {
   
   { .Values.pod_label }}
  template:
    metadata:
      labels:
        app: {
   
   { .Values.pod_label }}
    spec:
      containers:
      - image: {
   
   { .Values.image }}:{
   
   { .Values.imageTag }}
        name: {
   
   { .Values.container_name }}
        ports:
        - containerPort: {
   
   { .Values.containerport }}
---
apiVersion: v1
kind: Service 
metadata:
  name: {
   
   { .Values.service_name }}
  namespace: {
   
   { .Values.namespace }}
spec:
  type: NodePort 
  ports:
  - port: {
   
   { .Values.port }}
    targetPort: {
   
   { .Values.targetport }}
    nodePort: {
   
   { .Values.nodeport }}
    protocol: TCP 
  selector:
    app: {
   
   { .Values.pod_label }}
[root@m1 nginx-chart]# vim values.yaml #自定义需要的变量文件
deployment_name: nginx-deployment 
replicas: 2
pod_label: nginx-pod-label 
image: nginx 
imageTag: 1.17
container_name: nginx-container 
service_name: nginx-service 
namespace: default 
port: 80
targetport: 80
containerport: 80
nodeport: 30001

3)通过chart包安装一个release实例(即部署个k8s的nginx应用, 版本为:1.17)

[root@m1 ~]# ls nginx-chart/
charts Chart.yaml templates values.yaml 
[root@m1 ~1]# helm install nginx-release ./nginx-chart/  #安装一个release实例, 实例名:nginx-release
NAME: nginx-release 
LAST DEPLOYED: Sun Nov 27 14:37:52 2022
NAMESPACE: default 
STATUS: deployed 
REVISION: 1
TEST SUITE: None 
[root@m1 ~]# helm list  #列出release实例
NAME           NAMESPACE  REVISION UPDATED  STATUS                                            CHART              APP VERSION 
nginx-release  default    1                 2022-11-27 14:37:52.390161033 +0800 CST deployed  nginx-chart-0.1.0  1.16.0
[root@m1 ~]# kubectl get pod,svc,ep  #查看部署的k8s应用(nginx服务)
NAME                                   READY   STATUS   RESTARTS  AGE 
pod/nginx-deployment-5c8469b67f-5pq8m  1/1     Running  0         59s 
pod/nginx-deployment-5c8469b67f-j8c7v  1/1     Running  0         59s 
NAME                  TYPE         CLUSTER-IP   EXTERNAL-IP   PORT(S)       AGE 
service/kubernetes    ClusterIP    10.1.0.1     <none>        443/TCP       253d 
service/nginx-service NodePort     10.1.28.254  <none>        80:30001/TCP  59s 
NAME                     ENDPOINTS                                                    AGE 
endpoints/kubernetes     192.168.27.128:6443,192.168.27.129:6443,192.168.27.130:6443  253d 
endpoints/nginx-service  10.244.3.16:80,10.244.3.17:80                                59s 
[root@m1 ~]# kubectl get podnginx-deployment-5c8469b67f-5pq8m -o yaml | grep image:  #查看部署pod的镜像版本
            f:image: {}
  - image: nginx:1.17
    image: nginx:1.17
[root@m1 ~]# curl -I 10.1.28.254
HTTP/1.1 200 OK
Server: nginx/1.17.10

可以通过nodeport方式访问:在浏览器输入:http://192.168.27.131:30001/ 也可访问到

4)升级release实例版本(将nginx版本1.17升级为1.20.0)

[root@m1 ~]# vim nginx-chart/values.yaml #修改变量文件,指定相应版本
deployment_name: nginx-deployment 
replicas: 2
pod_label: nginx-pod-label 
image: nginx
imageTag: 1.20.0
container_name: nginx-container 
service_name: nginx-service 
namespace: default 
port: 80
targetport: 80
containerport: 80
nodeport: 30001
# helm upgrade nginx-release nginx-chart -f /root/nginx-chart/values.yaml #指定release实例名和chart名和values.yaml文件升级
Release "nginx-release" has been upgraded. Happy Helming!
NAME: nginx-release 
LAST DEPLOYED: Sun Nov 27 14:41:12 2022
NAMESPACE: default 
STATUS: deployed 
REVISION: 2
TEST SUITE: None
#或使用:helm upgrade nginx-release nginx-chart --set imageTag=1.20 指定release实例名和chart名set升级
[root@m1 ~]# helm list #升级后查看
NAME            NAMESPACE   REVISION UPDATED   STATUS                                              CHART              APP VERSION 
nginx-release   default     2                  2022-11-27 14:41:12.755644465 +0800 CST deployed    nginx-chart-0.1.0  1.16.0
[root@m1 ~]# kubectl get pod,svc,ep #升级后查看
NAME                                    READY   STATUS   RESTARTS   AGE 
pod/nginx-deployment-7dd78bf775-lh558   1/1     Running  0          67s 
pod/nginx-deployment-7dd78bf775-t4v98   1/1     Running  0          68s 
NAME                  TYPE         CLUSTER-IP   EXTERNAL-IP   PORT(S)       AGE 
service/kubernetes    ClusterIP    10.1.0.1     <none>        443/TCP       253d 
service/nginx-service NodePort     10.1.28.254  <none>        80:30001/TCP  4m28s
NAME                     ENDPOINTS                                                    AGE 
endpoints/kubernetes     192.168.27.128:6443,192.168.27.129:6443,192.168.27.130:6443  253d 
endpoints/nginx-service  10.244.3.16:80,10.244.3.17:80                                4m28s
[root@m1 ~]# kubectl get podnginx-deployment-7dd78bf775-lh558 -o yaml | grep image:  #查看部署pod的镜像版本
            f:image: {}
  - image: nginx:1.20.0
    image: nginx:1.20.0

5)回滚release实例版本(将nginx版本1.20.0回滚为1.17)

# helm rollback release实例名  #指定release实例名, 回滚到上一个版本
# helm rollback release实例名 版本号  #指定release实例名, 回滚到指定版本, 注意版本号是release的版本号, 不是镜像版本号

a)回滚到上一个版本:

[root@m1 ~]# helm rollback nginx-release #回滚到上一个版本, 指的是release的版本, 不是镜像版本
Rollback was a success! Happy Helming!
[root@m1 ~]# helm list #回滚后查看
NAME           NAMESPACE   REVISION UPDATED   STATUS                                             CHART                APP VERSION 
nginx-release  default     3                  2022-11-27 14:44:14.618247802 +0800 CST deployed   nginx-chart-0.1.0    1.16.0
[root@m1 ~]# kubectl get pod,svc,ep #回滚后查看
NAME                                    READY   STATUS   RESTARTS   AGE 
pod/nginx-deployment-5c8469b67f-7tw8c   1/1     Running  0          2m29s
pod/nginx-deployment-5c8469b67f-h4mbv   1/1     Running  0          2m28s
NAME                  TYPE         CLUSTER-IP   EXTERNAL-IP   PORT(S)       AGE 
service/kubernetes    ClusterIP    10.1.0.1     <none>        443/TCP       253d 
service/nginx-service NodePort     10.1.28.254  <none>        80:30001/TCP  8m51s
NAME                     ENDPOINTS                                                    AGE 
endpoints/kubernetes     192.168.27.128:6443,192.168.27.129:6443,192.168.27.130:6443  253d 
endpoints/nginx-service  10.244.3.16:80,10.244.3.17:80                                8m51s
[root@m1 ~]# kubectl get podnginx-deployment-7dd78bf775-lh558 -o yaml | grep image:  #查看回滚后部署的版本
            f:image: {}
  - image: nginx:1.17
    image: nginx:1.17

b)回滚到指定版本

release版本1 镜像:1.17

release版本2 镜像:1.20.0

release版本3 镜像:1.17 (回滚到1.17后, release版本也会增加)

目前是release版本3, 对应镜像:1.17版本, 现在要将版本回滚到指定版本2, 对应镜像:1.20.0

[root@m1 ~]# helm list 
NAME           NAMESPACE   REVISION UPDATED   STATUS                                            CHART             APP VERSION 
nginx-release  default     3                  2022-11-27 14:44:14.618247802 +0800 CST deployed  nginx-chart-0.1.0 1.16.0
[root@m1 ~]# helm rollback nginx-release 2  #回滚到指定的版本, 指的是release的版本, 不是镜像版本
Rollback was a success! Happy Helming!
[root@m1 ~]# helm list 
NAME           NAMESPACE   REVISION UPDATED   STATUS                                            CHART             APP VERSION 
nginx-release  default     4                  2022-11-27 14:52:42.547226093 +0800 CST deployed  nginx-chart-0.1.0 1.16.0
[root@m1 ~]# kubectl get pod,svc,ep  #回滚后查看
NAME                                    READY   STATUS   RESTARTS   AGE 
pod/nginx-deployment-7dd78bf775-sklx6   1/1     Running  0          43s
pod/nginx-deployment-7dd78bf775-xmjp4   1/1     Running  0          42s 
NAME                  TYPE         CLUSTER-IP   EXTERNAL-IP   PORT(S)       AGE 
service/kubernetes    ClusterIP    10.1.0.1     <none>        443/TCP       253d 
service/nginx-service NodePort     10.1.28.254  <none>        80:30001/TCP  15m
NAME                     ENDPOINTS                                                    AGE 
endpoints/kubernetes     192.168.27.128:6443,192.168.27.129:6443,192.168.27.130:6443  253d 
endpoints/nginx-service  10.244.3.16:80,10.244.3.17:80                                15m
[root@m1 ~]# kubectl get podnginx-deployment-7dd78bf775-sklx6 -o yaml | grep image:  #查看回滚后部署的版本
            f:image: {}
  - image: nginx:1.20.0
    image: nginx:1.20.0

6)卸载删除release实例

[root@m1 ~]# helm list 
NAME           NAMESPACE  REVISION UPDATED  STATUS                                             CHART              APP VERSION 
nginx-release  default    5                 2022-11-27 14:54:53.057933249 +0800 CST deployed   nginx-chart-0.1.0  1.16.0
[root@m1 ~]# helm uninstall nginx-release #卸载删除release实例
[root@m1 ~]# helm list 
NAME           NAMESPACE  REVISION UPDATED  STATUS    
空

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/131636151