helm 入门与创建应用

helm是什么?

用过linux的都知道yum,apt这几个包管理工具,可以一键安装你想要的应用。
helm就是k8s的包管理工具,它的包文件是 chart 文件。 类似就 rpm,deb 包。

helm创建应用

helm创建一个chart 名字叫nginx
一般会在创建一个nginx的目录,并在该目录下面生成默认的文件。

[root@k8s-m1 linux-amd64]# helm create web
Creating web  #chart 的包名
[root@k8s-m1 nginx]# tree
.
├── 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

这里我们为了演示学习,切换到templates,将目录templates下面的文件都删除

创建一个deployment的名字为web

# 创建一个应用deployment文件
[root@k8s-m1 templates]# kubectl create deployment web --image=nginx --dry-run -o yaml>deployment.yaml

# 安装该应用
[root@k8s-m1 templates]# helm install web ~/web/
NAME: web
LAST DEPLOYED: Thu Oct 22 21:50:17 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

# 查看安装的应用
[root@k8s-m1 templates]# helm ls
NAME     	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART      	APP VERSION
web      	default  	1       	2020-10-22 21:50:17.053040477 +0800 CST	deployed	web-0.1.0  	1.16.0

# 再创建一个service暴露应用
[root@k8s-m1 templates]# kubectl expose deployment web --port=80 --target-port=80 --dry-run=client -o yaml >service.yaml
[root@k8s-m1 templates]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: web
    app.kubernetes.io/managed-by: Helm
  name: web
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
status:
  loadBalancer: {}

# 升级应用
[root@k8s-m1 templates]# helm upgrade web ~/web/
Release "web" has been upgraded. Happy Helming!
NAME: web
LAST DEPLOYED: Thu Oct 22 21:53:42 2020
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None

此时我们已经完成了创建一个应用,并暴露端口

[root@k8s-m1 templates]# kubectl get svc,ep
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/web          ClusterIP   10.105.45.137   <none>        80/TCP    2m18s
NAME                       ENDPOINTS                                               AGE
endpoints/web              10.244.111.226:80,10.244.111.227:80,10.244.111.255:80   2m18s

有没有发现这和我们直接  kubectl apply -f . 并没有多简单啊。
其实这只是基本的功能。强大的还在后面。当你发现新的image版本的时候,传统的方法,是不是在创建更改配置文件,可当迭代变动的变量增加时,你挨个一个个去修改yaml文件,不累死你。

这时候有没有一种简单的方法,通过修改配置文件的参数值,就能够达到升级应用的途径了。当然有了。

我们把deployment.yaml里面的变量都抽象出来成为一个模板。用{{ }} 表示变量。然后在chart包目录下面的values里面去定义变量的值。helm就会帮我们渲染到模板里面。学过Django的模板语言的同学,应该对这个方法应该都不陌生哈。

动态利用模板,对字段进行替换。

helm 模板

下面演示:

将deployment和service的yaml文件都做为模板。将需要变动的部分进行替换。

[root@k8s-m1 templates]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    chart: {{ .Chart.Name }}
    app: {{ .Release.Name }}
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: {{ .Values.label }}
  template:
    metadata:
      labels:
        app: {{ .Values.label }}
    spec:
      containers:
      - image: {{ .Values.image }}:{{ .Values.imageTag }}
        name: {{ .Release.Name }}
[root@k8s-m1 templates]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: {{ .Chart.Name }}
    chart: {{ .Release.Name }}
  name: {{ .Release.Name }}
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: {{ .Values.label }}

在values文件中定义变量

[root@k8s-m1 templates]# cat ../values.yaml
replicas: 3
image: nginx
imageTag: 1.17
label: nginx-test

这里我们测试一下模板,变量有没有写错
没有错误的话,就会显示渲染成功的信息。这里命名为web2

[root@k8s-m1 templates]# helm install web2 --dry-run ~/web/
NAME: web2
LAST DEPLOYED: Thu Oct 22 21:13:54 2020
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
    chart: web2
  name: web2
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-test
---
# Source: nginx/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    chart: nginx
    app: web2
  name: web2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx:1.18
        name: web2
        resources: {}
status: {}

执行安装

helm install web2  ~/web/

[root@k8s-m1 templates]# helm ls
NAME    NAMESPACE    REVISION    UPDATED                                    STATUS      CHART          APP VERSION
 web2    default      1           2020-10-22 21:20:42.609485178 +0800 CST    deployed    web-0.1.0    1.16.0

[root@k8s-m1 templates]# kubectl get ep
NAME             ENDPOINTS                                               AGE
web2             10.244.111.200:80,10.244.111.203:80,10.244.111.206:80   14m

 

这样,当我们需要修改配置时,就只需要修改values文件中的变量,然后再升级helm upgrade 包名 。就能进行更新迭代了。
是不是方便了很多。

[root@k8s-m1 templates]# cat ../values.yaml
replicas: 3
image: nginx
imageTag: 1.16
label: nginx-test

[root@k8s-m1 templates]# helm upgrade web2 ~/linux-amd64/nginx/
Release "web2" has been upgraded. Happy Helming!
NAME: web2
LAST DEPLOYED: Thu Oct 22 21:29:08 2020
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None

[root@k8s-m1 templates]# helm ls
NAME	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART      	APP VERSION
web2	default  	2       	2020-10-22 21:29:08.230547308 +0800 CST	deployed	web-0.1.0	1.16.0

 

同时你也可以利用这个模板进行部署其他的应用镜像,达到重复

chart 模板复用

# 利用刚才的模板,修改变量
[root@k8s-m1 templates]# cat ../values.yaml
replicas: 3
image: lizhenliang/java-demo
imageTag: latest
label: java-demo
# 然后创建一个新的应用
[root@k8s-m1 templates]# helm install java-demo ~/linux-amd64/nginx/
NAME: java-demo
LAST DEPLOYED: Thu Oct 22 21:37:45 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@k8s-m1 templates]# helm ls
NAME         NAMESPACE    REVISION    UPDATED                                    STATUS      CHART          APP VERSION
java-demo    default      1           2020-10-22 21:37:45.473580193 +0800 CST    deployed    nginx-0.1.0    1.16.0
web2         default      3           2020-10-22 21:31:05.80439249 +0800 CST     deployed    nginx-0.1.0    1.16.0
[root@k8s-m1 templates]# kubectl get pods
NAME                         READY   STATUS              RESTARTS   AGE
java-demo-7f4bdcd5c6-ccgmx   1/1     Running             0          13s
java-demo-7f4bdcd5c6-ml4jt   0/1     ContainerCreating   0          13s
java-demo-7f4bdcd5c6-rfc82   0/1     ContainerCreating   0          13s
web2-65f55dd7d4-h22wq        1/1     Running             0          6m53s
web2-65f55dd7d4-t8mwg        1/1     Running             0          8m50s
web2-65f55dd7d4-wrrr9        1/1     Running             0          6m53s

制作通用模板

通过修改字段

就可以部署新的应用

posted @ 2020-11-01 11:00  元贞  阅读(270)  评论(0)    收藏  举报