Pod定时重启,可以通过Cronjob定时执行kubectl命令来实现。
Dockerfile构建镜像
首先,需要构建一个带有kubectl+jq命令的镜像,kubectl命令执行pod重启,jq命令解析json文本
- 新建一个目录,并存放如下所示的文件
1 2
| Dockerfile kubernetes.repo redeploy.sh
|
Dockerfile
,主要是安装kubectl和jq命令,并设置CMD为 redeploy.sh
1 2 3 4 5 6
| FROM centos:7 ADD kubernetes.repo /etc/yum.repos.d/kubernetes.repo RUN yum install kubectl jq -y ADD redeploy.sh /opt/redeploy.sh RUN chmod 755 /opt/redeploy.sh CMD ["/opt/redeploy.sh"]
|
kubernetes.repo
,这里使用阿里云的k8s yum源
1 2 3 4 5 6 7
| [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
|
redeploy.sh
,该脚本通过给应用添加一个注释,触发应用自动更新,类似于UI 上的重新部署,有三个参数
WORKLOAD_TYPY:工作负载类型,默认为deployment
APP_NAME:具体的工作负载名称
NAMESPACE:命名空间,默认为default
1 2 3 4 5 6 7 8 9
| #!/bin/bash
WORKLOAD_TYPY=${WORKLOAD_TYPY:-deployment} APP_NAME=${APP_NAME} NAMESPACE=${NAMESPACE:-default}
kubectl -n $NAMESPACE get ${WORKLOAD_TYPY}/${APP_NAME} -o json | \ jq --arg time $( date -Iseconds ) '.spec.template.metadata.annotations += {"cronjob/restartTimestamp": $time}' | \ kubectl apply -f -
|
- 构建镜像
1 2 3
| docker build -t TAGNAME:VERSION .
docker build -t hub/k8s-redeploy-pod:v1 .
|
在k8s集群创建Cronjob定时重启pod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| apiVersion: batch/v1beta1 kind: CronJob metadata: name: redeploy namespace: cattle-system spec: concurrencyPolicy: Allow failedJobsHistoryLimit: 1 jobTemplate: spec: template: spec: containers: - args: - /opt/redeploy.sh env: - name: APP_NAME value: nginx image: hub/k8s-redeploy-pod:v1 . imagePullPolicy: Always name: redeploy resources: {} securityContext: allowPrivilegeEscalation: false capabilities: {} privileged: false readOnlyRootFilesystem: false runAsNonRoot: false stdin: true tty: true restartPolicy: Never schedulerName: default-scheduler terminationGracePeriodSeconds: 30 serviceAccount: cattle serviceAccountName: cattle schedule: '* * * * *' successfulJobsHistoryLimit: 3 suspend: false
|
这里有四个地方要设置:
.spec.jobTemplate.spec.template.spec.containers.image
:需要使用的镜像
.spec.jobTemplate.spec.template.spec.containers.env
:环境变量,需要设置APP_NAME
为具体的工作负载,如果负载类型和命名空间不一致,还需要设置NAMESPACE
、WORKLOAD_TYPY
.spec.jobTemplate.spec.template.spec.serviceAccount
、.spec.jobTemplate.spec.template.specserviceAccountName
:使用sa进行鉴权,让pod可以使用kubectl命令。这里使用了cattle-system命名空间下的cattle的sa,如果权限不适用,可以手动创建一个sa。
.spec.schedule
:设置需要定时执行的时间
执行Cronjob
执行该Cronjob,就可以定时重启对应的工作负载(Pod)。