Pod定时重启

Pod定时重启,可以通过Cronjob定时执行kubectl命令来实现。

Dockerfile构建镜像

首先,需要构建一个带有kubectl+jq命令的镜像,kubectl命令执行pod重启,jq命令解析json文本

  1. 新建一个目录,并存放如下所示的文件
1
2
# ls
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. 构建镜像
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

这里有四个地方要设置:

  1. .spec.jobTemplate.spec.template.spec.containers.image:需要使用的镜像
  2. .spec.jobTemplate.spec.template.spec.containers.env:环境变量,需要设置APP_NAME为具体的工作负载,如果负载类型和命名空间不一致,还需要设置NAMESPACEWORKLOAD_TYPY
  3. .spec.jobTemplate.spec.template.spec.serviceAccount.spec.jobTemplate.spec.template.specserviceAccountName:使用sa进行鉴权,让pod可以使用kubectl命令。这里使用了cattle-system命名空间下的cattle的sa,如果权限不适用,可以手动创建一个sa。
  4. .spec.schedule:设置需要定时执行的时间

执行Cronjob

执行该Cronjob,就可以定时重启对应的工作负载(Pod)。