【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)

相关推荐
inquisiter9 分钟前
UEFI镜像结构布局
linux·spring
Linux运维老纪1 小时前
运维之 Centos7 防火墙(CentOS 7 Firewall for Operations and Maintenance)
linux·安全·centos·云计算·运维开发·火绒
斯普信专业组1 小时前
Ceph异地数据同步之-RBD异地同步复制(下)
linux·服务器·ceph
duration~1 小时前
K8S自定义CRD
容器·贪心算法·kubernetes
counsellor1 小时前
CentOS 7安装hyperscan
linux·centos·hyperscan
电星托马斯1 小时前
Linux系统CentOS 6.3安装图文详解
linux·运维·服务器·程序人生·centos
啞謎专家1 小时前
CentOS中挂载新盘LVM指南:轻松扩展存储空间,解决磁盘容量不足问题
linux·运维·服务器
s_little_monster1 小时前
【Linux】进程信号的捕捉处理
linux·运维·服务器·经验分享·笔记·学习·学习方法
一大Cpp1 小时前
Ubuntu与本地用户交流是两种小方法
linux·运维·ubuntu
小王不会写code2 小时前
CentOS 7 镜像源失效解决方案(2025年)
linux·运维·centos