在k8s中部署应用遇到的问题
https://blog.csdn.net/weixin_43757555/article/details/108418821 -- helm自定义模板https://blog.csdn.net/a772304419/article/details/113589534 -- configmap挂载到podhttps://blog.csdn.net/kozazyh/article/details/8
目录
1 背景
前面几篇博客已经写过如何安装k8s,以及相关资源或组件。基于这些基础设施,继续往上,便是部署应用(广义)了。这里记录在部署过程中遇到的一些问题或者经验总结。
2 集合
1) 通过Helm方式部署有关联的应用时报错
期望:部署Service,StatefulSet,待Pod就绪之后,再真正执行Job。
问题:Job在Service和StatefulSet还未完全就绪后,就已经执行完成。
解决方案:
A.首先需要了解Helm部署chart时的生命周期:
- 用户运行
helm install foo
- chart 被加载到服务端 Tiller Server 中
- 经过一些验证,Tiller Server 渲染 foo 模板
- Tiller 将产生的资源加载到 kubernetes 中去
- Tiller 将 release 名称和其他数据返回给 Helm 客户端
- Helm 客户端退出
B.Helm Hook的作用:
简单来说,就是通过Hooks干扰上述生命周期的一些过程。具体措施可以通过3个方面进行:
- 不同的Hook类型
- pre-install:在模板文件被渲染之后、而在Kubernetes创建任何资源创建之前执行。
- post-install:在Kubernetes加载全部的资源之后执行。
- pre-delete:在Kubernetes删除任何resource之前执行。
- post-delete:在一个release的全部资源被删除之后执行。
- pre-upgrade:在模板渲染之后,而在Kubernetes加载任何资源之前执行。
- post-upgrade:在Kubernetes更新完全部resource之后执行。
- pre-rollback:在模板被渲染之后、而在Kubernetes执行对全部resource的回滚之前。
- post-rollback:在Kubernetes的全部resource已经被修改之后执行。
- crd-install:在运行其他检查之前添加CRD资源,只能用于chart中其他的资源清单定义的 CRD 资源。
- Hook的权重
- 由负到正、从小到大 默认权重:默认为0
- Hook的删除
- “hook-succeeded” :指定Tiller应该在hook成功执行后删除hook。
- “hook-failed” :指定如果hook在执行期间失败,Tiller应该删除hook。
- “before-hook-creation” : 指定Tiller应在删除新hook之前删除以前的hook。
C.Hooks在Job中的声明,参考下方问题二中的脚本示例。
D.部署的命令:
# helm install <helm name> <chart name> -n <namespace> --wait
E.参考资料:
https://github.com/SecurityNeo/ReadingNotes/blob/master/PaaS/Helm/Helm.md -- Helm官方文档
https://blog.csdn.net/hxpjava1/article/details/86647706 -- 网友的Helm Hooks简单实践
2) 增加一个初始容器做“前锋”
从某种角度来说,这也算是上述问题一的一种解决方案,只是不能算最佳。原因是:这里由于业务特殊性,无其他等待方式,只能Sleep固定时间。这就导致这种等待“不靠谱”。
换做其他业务场景,也可以是一种不错的方式,所以记录在此。
增加一个初始容器,在容器中做时间处理,如sleep,调用某个其他已知业务接口,执行某些脚本等。干扰该Pod的就绪时间。
apiVersion: v1
kind: Job
metadata:
name: myJob
namespace: myNameSpace
# Hook的声明
annotations:
"helm.sh/hook": post-install
"helm.sh/hook-weight": "5"
"helm.sh/hook-delete-policy": before-hook-creation
spec:
template:
metadata:
name: myJob
spec:
restartPolicy: Never
initContainers:
- name: myInit
image: 10.0.45.123:5000/alpine:3.9.5
command: ["/bin/sh","-c","sleep 5"]
containers:
- name: myJob
image: 10.0.45.123:5000/alpine:3.9.5
command:
...
3) 容器中Hook
这个也实践过,不过同样不适用于当前业务需要,但也是一个参考:
https://blog.csdn.net/wang725/article/details/90719429
https://www.cnblogs.com/wuchangblog/p/13409485.html
4) Helm中变量的使用
Helm中有3个重要的概念:
- helm:命令行客户端工具,类似kubectl。主要用于k8s应用chart的创建、打包、发布和管理。
- chart:可简单看做一组yaml文件,是一系列用于描述k8s资源相关文件的集合。
- release:基于chart部署实体,应用级别的版本管理。通过helm执行一个chart后,就会生成对应的一个release,并在k8s中创建出真实的资源对象。
Chart模板中有一定的文件结构,不同的文件有不同的作用。可参考:
https://blog.csdn.net/twingao/article/details/105188730
https://www.it610.com/article/1281815336882028544.htm
https://blog.csdn.net/kozazyh/article/details/81747903
https://www.it610.com/article/1281815336882028544.htm
5)增加健康检查
这个是k8s的基础了,自己也不是特别了解,只能结合自己业务的特点,选择了其中一种方式,增加了存活和就绪检查,供参考。
...
containers:
- name: myService
image: 10.0.45.123:5000/busyboy
ports:
...
env:
...
livenessProbe:
tcpSocket:
port: 1099
initialDeplaySeconds: 3
periodSeconds: 2
readinessProbe:
tcpSocket:
port: 1099
initialDelaySeconds: 3
periodSeconds: 2
参考:
https://blog.csdn.net/weixin_39534208/article/details/112219228 -- 网友实践
3.其他参考资料
https://blog.csdn.net/weixin_43757555/article/details/108418821 -- Helm自定义模板
https://blog.csdn.net/a772304419/article/details/113589534 -- configmap挂载到pod
更多推荐
所有评论(0)