【k8s】利用crobjob实现定时宿主机集群任务

可以考虑这么个场景,服务商的服务集群以K8S部署在云端,并以一条防火墙策略放通某专线ip或端口,以供外部用户访问。现在出现了这么个需求,由于周末或节假日不上班,客户要求在这些时刻去禁用这些防火墙策略,以达到用户无法访问的目的。我们能想到最简单的方法是,由运维手动连接到所有节点虚机的控制台,去执行禁用命令,但问题也非常明显,人工操作很容易出现错删、漏删,其次工作日时还要再配置回来,当用户节点过多时,操作工作量就非常大。

整体思路

我们可以利用原生对象crobjob对宿主机进行防火墙策略起禁用,这样只需要在一个master节点执行k8s的api请求即可。首先我们使用python脚本获取所有宿主机节点名称,再使用node select机制让master节点下发至所需要执行的宿主机上,最后就可以使用原生对象crobjob来帮助我们执行命令,注意这时要注意开启特权及共享宿主机pid,否则容器内执行无法影响到宿主机的,详情如图所示:

关键代码

# 开始执行
def main():
    host_list = get_hostname_list()

    for hostname in host_list:
        job_yaml = hostname + '-' + 'job' + '.yaml'
        job_yaml_path = os.path.join('/tmp', job_yaml)

        generate_my_job(hostname, job_yaml_path)

        run_cmd('kubectl apply -f %s' % job_yaml_path)

        os.remove(job_yaml_path)

# 获取宿主机hostname
def get_hostname_list():
    node_info = subprocess.check_output(['kubectl', 'get', 'node'], shell = False)

    lines = node_info .decode().split('\n')[1:-1]
    hostname_list= [line.split()[0] for line in lines]
    return hostname_list

# 创建job
def generate_my_job(hostname, job_yaml_path):
    image = "sdocker.io/radial/busyboxplus:latest"
    # 想要执行的命令
    cmd = "chroot /host systemctl start firewalld.service 2>&1"
    job_name = hostname
    crob_job_def = f"""apiVersion: batch/v1
kind: CronJob
metadata:
  name: {job_name}
  labels:
    my-job: my-job-lable
  namespace: my-job   #命名空间隔离,防止影响其他人
spec:
  template:
    metadata:
      name: my-job
      labels:
        my-job: my-job-lable
    spec:
      hostPID: true            #共享宿主机
      hostNetwork: true
      nodeSelector:
        kubernetes.io/hostname: {hostname}
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        operator: Equal
        effect: NoSchedule
      containers:
      - name:my-job
        image: {image}
        imagePullPolicy: IfNotPresent
        command:
        - "sh"
        - "-c"
        - |
          current_time=$(date +"%Y-%m-%d %H:%M:%S")
          echo "$current_time - start" >> /var/run/my.log
          res=$({cmd})
          echo "$current_time - $res" >> /var/run/my.log
        securityContext:
          privileged: true    #特权模式
        volumeMounts:
        - name: host-root-dir
          mountPath: /host
        - name: host-log-dir
          mountPath: /var/run
      volumes:
      - name: host-root-dir
        hostPath:
          path: /
      - name: host-log-dir
        hostPath:
          path: /var/run/log/
      restartPolicy: Never
  backoffLimit: 1 
  schedule: '0 10 * * 1-5'        #表达式 每个工作日的上午10点
  suspend: true """

    # yaml存盘
    with open(job_yaml_path, "w") as f:
        try:
            f.write(crob_job_def )
        except Exception as e:
            raise e

Reference

kubernetes之Cronjob应用和踩坑 - 生命不止奋斗不息 - 博客园 (cnblogs.com)

Cron表达式详细讲解,平常看一看就记住了 - 掘金 (juejin.cn)

相关推荐
xidianjiapei0018 分钟前
Kubernetes的Ingress 资源是什么?
云原生·容器·kubernetes
风静如云1 小时前
OpenBMC:BmcWeb定义service
linux
sszdzq1 小时前
Docker
运维·docker·容器
leoufung2 小时前
VIM FZF 安裝和使用
linux·编辑器·vim
dmy2 小时前
docker 快速构建开发环境
后端·docker·容器
bugtraq20212 小时前
XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux
linux·运维·ubuntu
土豆沒加3 小时前
K8S的Dashboard登录及验证
云原生·容器·kubernetes
CodeWithMe3 小时前
[ Vim ] 常用命令 and 配置
linux·编辑器·vim
DC_BLOG3 小时前
Linux-GlusterFS进阶分布式卷
linux·运维·服务器·分布式
cookies_s_s4 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法