可以考虑这么个场景,服务商的服务集群以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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。