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
制作通用模板
通过修改字段
就可以部署新的应用
本文来自博客园,作者:元贞,转载请注明原文链接:https://www.cnblogs.com/yuleicoder/articles/13861460.html
浙公网安备 33010602011771号