一、helm是什么?

helm是一个kubernetes包管理工具,类似于centos中的yum,用于简化应用的安装部署。

在实际工作中,开发、测试、运维等职位是由不同的员工进行分工,所以通常开发同学开发完一款应用,如果需要在kubernetes进行发布,那么需要编写yaml文件,然后测试同学拿到这个配置文件在kubernetes测试环境进行测试,测试通过之后,运维同事在kubernetes生产环境进行发布,如果这个应用有多个组件,那么可能需要分解成多个步骤,编写一份部署手册,这降低了效率且增加了出错率,比如我们要在kubernetes发布nginx,需要编写下面的yaml配置文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: my-nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

但如果开发通过helm对应用进行打包,那么只需要一个tgz文件即可,比如my-nginx.tgz,无论是测试还是运维只需要在kubernetes环境上执行:helm install my-nginx my-nginx.tgz 即可完成应用发布。

可见helm可以屏蔽掉一些细节,对应用进行快速安装。

helm架构如下:
image
helm V3版本与V2版本的架构上发生比较大的变化,V3版本删除了部署在kubernetes上的Tiller组件,helm通过kube-config与kube-apiserver进行交互,在helm有三个比较重要的概念,分别如下:
(1)helm:Helm的命令行客户端工具
(2)Chart:可以理解成一系列的yaml文件打包
(3)Release:基于Chart进行部署实体,应用级别的版本管理

二、helm安装

helm的安装可以查看官方文档:https://helm.sh/zh/docs/intro/install/

1、根据kubernetes版本查看helm对应的版本:https://helm.sh/zh/docs/topics/version_skew/
image-1676203676245

由于我本地kubernetes使用的是1.21版本,因此我这边选择了helm 3.9.3版本

[root@test-99 linux-amd64]# kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:25:06Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}

2、安装
(1)在helm的github仓库上找到合适的版本https://github.com/helm/helm/releases
(2)上传到服务器并解压:tar -zxvf helm-v3.9.3-linux-amd64.tar.gz

[root@test-99 linux-amd64]# tree
.
├── helm
├── LICENSE
├── my-nginx-deploy.yml
└── README.md

0 directories, 4 files

(3)拷贝helm文件到/usr/bin下: cp help /usr/bin
(4)测试:helm version

[root@test-99 helm]# helm version
version.BuildInfo{Version:"v3.9.3", GitCommit:"414ff28d4029ae8c8b05d62aa06c7fe3dee2bc58", GitTreeState:"clean", GoVersion:"go1.17.13"}

三、helm简单使用

1、 添加helm仓库
由于环境的原因,官方的仓库在国内并不能访问,因此需要添加其他仓库,比如阿里云的,其中
(1)阿里云仓库:https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
(2)bitnami仓库:https://charts.bitnami.com/bitnami

具体操作如下:
(1)添加阿里云仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
(2)添加bitnami仓库
helm repo add bitnami https://charts.bitnami.com/bitnam
(3)更新仓库
helm repo update
(4)查看仓库列表
helm repo list
(5)删除仓库
helm repo remove 仓库名
(6)查看Chart应用
helm search repo 应用名

[root@test-99 helm]# helm search repo nginx
NAME                            	CHART VERSION	APP VERSION	DESCRIPTION                                       
aliyun/nginx-ingress            	0.9.5        	0.10.2     	An nginx Ingress controller that uses ConfigMap...
aliyun/nginx-lego               	0.3.1        	           	Chart for nginx-ingress-controller and kube-lego  
bitnami/nginx                   	13.2.23      	1.23.3     	NGINX Open Source is a web server that can be a...
bitnami/nginx-ingress-controller	9.3.28       	1.6.2      	NGINX Ingress Controller is an Ingress controll...
bitnami/nginx-intel             	2.1.15       	0.4.9      	DEPRECATED NGINX Open Source for Intel is a lig...
aliyun/gcloud-endpoints         	0.1.0        	           	Develop, deploy, protect and monitor your APIs ...

2、安装Chart应用
这里以安装nginx为例子
(1)从helm仓库中查询可以按照的nginx应用
helm search repo nginx
(2)选择合适版本进行安装
helm install my-nginx --version 13.2.23 bitnami/nginx

my-nginx:应用名
–version:指定版本,默认为最新版本

[root@test-99 helm]# helm install my-nginx --version 13.2.23 bitnami/nginx
NAME: my-nginx
LAST DEPLOYED: Sun Feb 12 19:40:42 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 13.2.23
APP VERSION: 1.23.3

** Please be patient while the chart is being deployed **
NGINX can be accessed through the following DNS name from within your cluster:

    my-nginx.default.svc.cluster.local (port 80)

To access NGINX from outside the cluster, follow the steps below:

1. Get the NGINX URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace default -w my-nginx'

    export SERVICE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].port}" services my-nginx)
    export SERVICE_IP=$(kubectl get svc --namespace default my-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://${SERVICE_IP}:${SERVICE_PORT}"

(3)查看安装情况

[root@test-99 helm]# kubectl get service
NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP      10.96.0.1       <none>        443/TCP        48d
my-nginx           LoadBalancer   10.100.87.23    <pending>     80:31535/TCP   3m27s
[root@test-99 helm]# kubectl get deployment
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
my-nginx              1/1     1            1           3m48s
[root@test-99 helm]# kubectl get pods
NAME                                  READY   STATUS      RESTARTS   AGE
my-nginx-66d69fd876-l9zwh             1/1     Running     0          3m57s

(4)测试
通过浏览器访问:http://172.16.1.17:31535/
image-1676203839765

(3)卸载Chart应用
helm uninstall my-nginx

四、自定义Chart

对于我们自己开发的应用,如果需要通过helm进行安装的话,则需要通过helm把应用打包成功tgz文件。

1、自定义一个Chart
helm create mynginx

[root@test-99 helm]# helm create mynginx
Creating mynginx
[root@test-99 helm]# 
[root@test-99 helm]# ls
helm-v3.9.3-linux-amd64.tar.gz  linux-amd64  mynginx
[root@test-99 helm]# 
[root@test-99 helm]# tree mynginx/
mynginx/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

3 directories, 10 files
[root@test-99 helm]# 

通过helm create命令创建的Chart应用,其目录结构如下

├── charts
├── Chart.yaml            # 用于描述应用相关信息
├── templates             # 创建应用的模板文件
│   ├── deployment.yaml   # deployment资源模板
│   ├── _helpers.tpl      # 模板助手文件,其配置的值可以用于模板文件
│   ├── hpa.yaml          # 水平扩缩容配置
│   ├── ingress.yaml      # ingress配置
│   ├── NOTES.txt
│   ├── serviceaccount.yaml      # ServiceAccount配置
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml         # templates下模板文件用到的值配置

2、Chart.yml文件

[root@test-99 mynginx]# cat Chart.yaml | grep -v "^$" | grep -v "^#"
apiVersion: v2
name: mynginx
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"

可以根据应用实际情况修改上面的配置信息。

3、 values.yml文件

[root@test-99 mynginx]# cat values.yaml 
# Default values for mynginx.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: ""

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
  # Specifies whether a service account should be created
  create: true
  # Annotations to add to the service account
  annotations: {}
  # The name of the service account to use.
  # If not set and create is true, a name is generated using the fullname template
  name: ""

podAnnotations: {}

podSecurityContext: {}
  # fsGroup: 2000

securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: ImplementationSpecific
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: {}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #   cpu: 100m
  #   memory: 128Mi
  # requests:
  #   cpu: 100m
  #   memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}

根据实际情况修改values.yml文件中的配置值,例如可以把镜像配置项tag改为实际配置latest,service.type改为NodePort。

4、执行安装
helm install mynginx ./mynginx

[root@test-99 helm]# helm install mynginx ./mynginx
NAME: mynginx
LAST DEPLOYED: Sun Feb 12 20:00:02 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services mynginx)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

5、查看安装情况

[root@test-99 helm]# kubectl get deployment
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
mynginx               1/1     1            1           29s
[root@test-99 helm]# kubectl get service
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP        48d
mynginx            NodePort    10.98.18.60     <none>        80:30596/TCP   35s
[root@test-99 helm]# kubectl get pod
NAME                                  READY   STATUS      RESTARTS   AGE
mynginx-764dc4ccc7-m2hpz              1/1     Running     0          40s

6、测试
image-1676203983232

7、 打包
执行Chart应用完成之后,可以使用命令helm package 打包成tgz文件,用于测试和部署。

[root@test-99 helm]# helm package mynginx/
Successfully packaged chart and saved it to: /home/k8s/helm/mynginx-0.1.0.tgz
[root@test-99 helm]# ll
total 13704
-rw-r--r-- 1 root root 14025325 Feb 12 14:54 helm-v3.9.3-linux-amd64.tar.gz
drwxr-xr-x 2 3434 3434       77 Feb 12 16:04 linux-amd64
drwxr-xr-x 4 root root       93 Feb 12 19:59 mynginx
-rw-r--r-- 1 root root     3761 Feb 12 20:02 mynginx-0.1.0.tgz

如上,打包成mynginx-0.1.0.tgz文件,测试/运维同学拿到这个文件后,可以通过如下命令进行安装:helm install mynginx mynginx-0.1.0.tgz

打赏
支付宝 微信
上一篇 下一篇