天天看点

在k8s中部署应用遇到的问题

目录

1 背景

2 集合

1) 通过Helm方式部署有关联的应用时报错

2) 增加一个初始容器做“前锋”

3) 容器中Hook

4) Helm中变量的使用

5)增加健康检查

3.其他参考资料

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://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/  -- 官方文档

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

继续阅读