使用helm部署release到kubernetes
Helm使得对软件进行版本化,打包,发布,以及对部署,删除,升级甚至回滚都非常容易。
chart
是helm打包软件的包的格式,charts中包含了kubernetes所需的配置好的资源信息。
Tiler
是Helm的服务端,运行在kubernetes中,它用来响应helm客户端的请求,完成一系列charts操作。
构建helm chart
helm create ${chart_name}
,本例中${chart_name}
为course。
chart的文件结构
chart包的文件结构如下:
.
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ └── service.yaml
└── values.yaml
Chart.yaml
描述了chart的信息,包括名字,版本,描述信息等等。 values.yaml
存储变量,给templates
文件中定义的资源使用。 templates
文件夹中使用go语言的模版语法,定义了各类kubernetes资源,结合values.yaml
中的变量值,声称实际的资源声明文件。 NOTES.txt
:在执行helm instll安装此Chart之后会被输出到屏幕的一些自定义信息
可选的文件结构:
LICENSE
: chart的license信息 README.md
: 友好的chart介绍文档 requirements.yaml
: charts的依赖说明
编辑values.yaml
# Default values for course.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
# 镜像的定义,包括镜像仓库,镜像版本和拉取策略
image:
repository: core.harbor.domain/example/message-service
tag: latest
pullPolicy: IfNotPresent
nameOverride: "message-services-of-course"
fullnameOverride: "message-service-of-course"
# 对service的定义
service:
type: ClusterIP
port: 9090
# 对ingress的定义
ingress:
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- message-service.local
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
# chart使用资源的限制
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
# chart部署节点的选择
nodeSelector: {}
# chart kubernetes容忍情况描述
tolerations: []
# chart亲和性描述
affinity: {}
chart打包
helm lint ${chart_name}
校验chart 配置是否正常 helm package ${chart_name}
打包chart,可以使用--debug
输出调试信息
例如:
[root@kuber24 charts]# helm lint course
==> Linting course
Lint OK
1 chart(s) linted, no failures
[root@kuber24 charts]# helm package course --debug
Successfully packaged chart and saved it to: /root/Downloads/charts/course-0.1.0.tgz
[debug] Successfully saved /root/Downloads/charts/course-0.1.0.tgz to /root/.helm/repository/local
chart下线,升级和降级
使用打包好的chart部署到kubernetes环境中。
[root@kuber24 charts]# helm install course-0.1.0.tgz --namespace test -n course
NAME: course
LAST DEPLOYED: Thu Nov 8 15:03:19 2018
NAMESPACE: test
STATUS: DEPLOYED
RESOURCES:
==> v1/Service
NAME AGE
message-service-of-course 1s
==> v1beta2/Deployment
message-service-of-course 1s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
message-service-of-course-b545dfc84-fthg9 0/1 Pending 0 1s
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace test -l "app.kubernetes.io/name=message-services-of-course,app.kubernetes.io/instance=course" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80
例如一种场景,我们部署可一个版本的程序,但是由于出现了错误,需要下线或者回滚到之前的版本,待问题修改好后,再升级到最新的版本。
下线部署
查看部署的现状:
[root@kuber24 charts]# helm ls
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
course 3 Thu Nov 8 15:09:29 2018 DEPLOYED course-0.1.0 1.0 test
harbor 1 Mon Nov 5 19:26:41 2018 DEPLOYED harbor-dev dev default
ingress-nginx 1 Mon Oct 29 18:41:45 2018 DEPLOYED nginx-ingress-0.9.5 0.10.2 kube-system
[root@kuber24 charts]# kubectl get deployments -n test
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
message-service-of-course 1 1 1 0 18m
使用helm delete course
下线部署。
操作过程:
[root@kuber24 charts]# helm ls
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
harbor 1 Mon Nov 5 19:26:41 2018 DEPLOYED harbor-dev dev default
ingress-nginx 1 Mon Oct 29 18:41:45 2018 DEPLOYED nginx-ingress-0.9.5 0.10.2 kube-system
[root@kuber24 charts]# kubectl get deployments -n test
No resources found.
重新部署
如果我们错误的下线了部署,可以使用chart仓库重新部署。helm的重新部署可能对kubernetes的资源造成影响,可以查看github isusses。helm3种可能会有所变化。
[root@kuber24 charts]# helm upgrade --install --force course ./course-0.1.0.tgz --namespace test
Release "course" has been upgraded. Happy Helming!
LAST DEPLOYED: Thu Nov 8 15:42:52 2018
NAMESPACE: test
STATUS: DEPLOYED
RESOURCES:
==> v1/Service
NAME AGE
message-service-of-course 0s
==> v1beta2/Deployment
message-service-of-course 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
message-service-of-course-b44999495-kv4q4 0/1 Pending 0 0s
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace test -l "app.kubernetes.io/name=message-services-of-course,app.kubernetes.io/instance=course" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80
更新部署
经常会出现这样的场景,需要修改部署的参数,我们可以使用 helm upgrade
来更新部署
使用helm upgrade --set "key=value" ${chart_name} ${char_repo/name}
来更新已经部署了的chart,包括chart的版本或者chart部署的参数。
在更新chart后,编辑course/Chart.yaml
种的version信息。例如我更新version为version: 0.1.1
。然后重新打包helm package course
更新安装:
[root@kuber24 charts]# helm upgrade course ./course-0.1.1.tgz
helm Release "course" has been upgraded. Happy Helming!
LAST DEPLOYED: Thu Nov 8 15:52:17 2018
NAMESPACE: test
STATUS: DEPLOYED
RESOURCES:
==> v1/Service
NAME AGE
message-service-of-course 9m
==> v1beta2/Deployment
message-service-of-course 9m
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
message-service-of-course-b44999495-kv4q4 0/1 CrashLoopBackOff 6 9m
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace test -l "app.kubernetes.io/name=message-services-of-course,app.kubernetes.io/instance=course" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl port-forward $POD_NAME 8080:80
查看当前部署的版本信息:
[root@kuber24 charts]# helm ls
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
course 7 Thu Nov 8 15:52:17 2018 DEPLOYED course-0.1.1 1.0 test
harbor 1 Mon Nov 5 19:26:41 2018 DEPLOYED harbor-dev dev default
ingress-nginx 1 Mon Oct 29 18:41:45 2018 DEPLOYED nginx-ingress-0.9.5 0.10.2 kube-system
回滚部署
经常由于各种原因,导致部署出现了问题,需要及时的回滚到上一个可靠的状态保证业务运行。
使用helm rollback course 1
回滚一个版本。
[root@kuber24 charts]# helm ls
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
course 7 Thu Nov 8 15:52:17 2018 DEPLOYED course-0.1.1 1.0 test
harbor 1 Mon Nov 5 19:26:41 2018 DEPLOYED harbor-dev dev default
ingress-nginx 1 Mon Oct 29 18:41:45 2018 DEPLOYED nginx-ingress-0.9.5 0.10.2 kube-system
[root@kuber24 charts]# helm rollback course 1
Rollback was a success! Happy Helming!
[root@kuber24 charts]# helm ls
NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE
course 8 Thu Nov 8 16:08:34 2018 DEPLOYED course-0.1.0 1.0 test
harbor 1 Mon Nov 5 19:26:41 2018 DEPLOYED harbor-dev dev default
ingress-nginx 1 Mon Oct 29 18:41:45 2018 DEPLOYED nginx-ingress-0.9.5 0.10.2 kube-system
最后
感谢大家的阅读,如果有什么问题️,请您留言。
欢迎大家来我的github,查看更多关于kubernetes的个人经验,共同进步。
欢迎转载,转载请注明出处!谢谢!