使用Helm管理Kubernetes应用

Helm是Kubernetes中安装应用的工具。这里介绍如何使用自己创建的Helm chart实现Kubernetes应用的安装。

一 安装Helm

通过下面的安装脚本安装:

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

安装好后,查看版本,这里安装的是3.4的版本:

$ helm version --short
v3.4.2+g23dd3af

二 通过Helm Chart安装应用

1 创建Chart和template文件

创建相应的目录和文件,如下:

$ tree
.
`-- my-app
    |-- Chart.yaml
    `-- templates
        `-- deployment.yaml

2 directories, 2 files

Chart.yaml是应用安装的入口文件,具体内容如下:

apiVersion: v1
name: my-app
version: 0.1.0
appVersion: 1.0.0
description: My app with flask chart

deployment.yam 可以通过kubectl命令生成:

kubectl create deploy my-app 
    --image gcr.io/wh-host/hello:1.0.0 
    --dry-run=client -o yaml > templates/deployment.yaml

修改配置如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-app
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - image: gcr.io/wh-host/hello:1.0.0
        name: app

2 通过helm安装应用

安装

helm install  my-app .

通过下面的命令查看安装情况:

$ helm list
NAME   NAMESPACE    REVISION    UPDATED       STATUS      CHART         APP VERSION  
my-app default      1           2020-12-30    deployed    my-app-0.1.0  1.0.0

三 通过helm管理应用

1 通过helm更新应用

A 添加svc配置文件

创建Service:

kubectl expose deploy my-app --port 80  
    --dry-run=client -o yaml > templates/service.yaml

具体内容如下:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: my-app
    app.kubernetes.io/managed-by: Helm
  name: my-app
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: my-app

B 更新Chart文件

更新Chart.yaml

 
apiVersion: v1
name: my-app
version: 0.2.0
appVersion: 1.0.0
description: My app with flask chart

此时目录结构如下:

$ tree
.
`-- my-app
    |-- Chart.yaml
    `-- templates
        |-- deployment.yaml
        `-- service.yaml

C 采用helm更新应用

更新应用:

helm upgrade my-app .

查看:

$ helm list
NAME     NAMESPACE  REVISION  UPDATED     STATUS     CHART           APP VERSION
my-app   default    2         2020-12-30  deployed   my-app-0.2.0    1.0.0

2 采用helm rollback应用

Rollback:

helm rollback my-app 1
Rollback was a success! Happy Helming!

helm rollback my-app 2
Rollback was a success! Happy Helming!

3 通过helm删除应用

删除:

helm delete my-app
release "my-app" uninstalled

四 Helm中参数设置

在应用管理中,参数需要通过配置文件进行管理。在Helm中可以通过配置文件进行参数管理,也可以简单的通过命令行进行参数的设置。

1 通过values.yaml设置参数

A 参数文件

增加values.yaml文件:

 
replicaCount: 1
image: gcr.io/wh-host/hello
imageVersion: 1.0.0

B 部署文件中引用参数

更改deployment文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-app
  name: my-app
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - image: {{ .Values.image  }}:{{ .Values.imageVersion  }}
        name: app
 

注意,这里参数中Values的V是大写的。

C 目录结构

此时目录结构如下:

$ tree
.
|-- Chart.yaml
|-- templates
|   |-- deployment.yaml
|   `-- service.yaml
`-- values.yaml

1 directory, 4 files

2 通过命令行设置参数

helm管理应用中,可以用指定参数的方式,设置参数:

helm install my-app . --set replicaCount=3

此时查看pod情况,为手工设置的3个:

 
$ kubectl get pod
NAME                      READY   STATUS    RESTARTS   AGE
my-app-858dc86f8c-bs7lf   1/1     Running   0          10s
my-app-858dc86f8c-cpl6q   1/1     Running   0          10s
my-app-858dc86f8c-s2q2t   1/1     Running   0          10s

3 指定参数文件

采用指定参数文件的模式:

 
$ helm inspect values .
replicaCount: 1
image: gcr.io/wh-host/hello
imageVersion: 1.0.0

$ helm inspect values . > /tmp/values.yaml


$ helm delete my-app
release "my-app" uninstalled


$ helm install my-app . --values /tmp/values.yaml

更新采用参数的方式:

helm upgrade my-app . --set replicaCount=2

4 参数文件的多级管理

参数文件为方便管理,可以采用多级参数的管理模式。具体方法如下。

更改values.yaml文件:

 
replicaCount: 1
image: gcr.io/wh-host/hello
imageVersion: 1.0.0
service:
        type: LoadBalancer

更改deployment.yaml文件:

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: my-app
    app.kubernetes.io/managed-by: Helm
  name: my-app
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: my-app
  type: {{ .Values.service.type  }}
status:
  loadBalancer: {}

更新配置:

$ helm upgrade my-app .

可以看到,Service开始创建LB,并生成External-IP:

$ kubectl get svc
NAME         TYPE          CLUSTER-IP  EXTERNAL-IP    PORT(S)        AGE
kubernetes   ClusterIP     10.48.0.1   <none>         443/TCP        28h
my-app       LoadBalancer  10.48.9.34  35.223.27.242  80:32353/TCP   4m45s

五 总结

通过helm可以非常方便的管理Kubernetes的应用。

原文地址:https://www.cnblogs.com/hengwei/p/14212049.html