由于现有工作的需要,需要对python以及kubernetes的使用更为熟悉,所有尝试利用Python完成kubernetes的一系列操作。
此脚本是利用调用kubernetes的Api接口完成对deployment,与service的拉取,从而实现对该yaml的一个备份处理。
由于日常开发反馈一些问题,我们运维会对一些deploy,service进行命令行的修改,使得配置文件中与实际kubernetes运用中的有一定出入,所以6.0更新了将得到的kubernetes中最新的内容,通过重新赋值的方式更新该部分数据,从而实现最真实的备份。
最近更新时间:2019.11.15
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author : jiangjw
''' 可实现拉取kubernetes中的deployment与service,并组合为一个完整的yml文件;
4.0 更新了创建当天对应时间目录,并将各个team,以及cloud以目录分隔开来;
5.0 更新了删除7天以前的备份目录。
6.0 将内存中的镜像、ports等数据重新赋值,达到该文件为当前kubernetes实际应用的状态。'''
import os, yaml, json, datetime, shutil
from time import sleep
from tqdm import tqdm # 进度条模块
from kubernetes import client, config
from kubernetes.client.rest import ApiException
def deployment_all(namespace, timedir, data):
api_instance_deploy = client.AppsV1Api()
k8s_host = [
{
"ip": "192.168.1.20",
"hostnames": [
"xxx.xxx.net", "xxx.xxx.net", "xxx.xxx.net",
"xxx.xxx.net", "xxx.xxx.net",
"xxx.xxx.net", "xxx.xxx.net", "xxx.xxx.net",
"xxx.xxx.net", "xxx.xxx.net", "xxx.xxx.net",
"xxx.xxx.net"]
}
]
k8s_dns = {
"options": [
{
"name": "ndots", "value": "2"},
{
"name": "single-request-reopen"}
]
}
deploy_success_num = 0
deploy_fail_num = 0
deploy_fail_name = []
team_list1 = []
try:
print("\n\033[0;36m正在处理 deployment =>\033[0m")
response = api_instance_deploy.list_namespaced_deployment(namespace)
deploy_response = response.items
deploy_size = len(deploy_response)
'''加入进度条'''
pbar1 = tqdm(total=deploy_size, unit='个', unit_scale=True)
for i in deploy_response:
deploy_team = i.metadata.labels.get('team')
deploy_tag = i.metadata.labels.get('tag')
deploy_cloud = i.metadata.labels.get('cloud')
deploy_name = i.metadata.labels.get('app')
deploy_yml = deploy_name + '.yml'
# 创建对应目录
teamdir = os.path.join(timedir, deploy_team)
clouddir = os.path.join(teamdir, deploy_cloud)
if not os.path.exists(clouddir):
os.makedirs(clouddir)
deploy_name_yml = os.path.join(clouddir, deploy_yml) # 需存放路径不同,修改该行
apiversion = i.metadata.annotations.get('kubectl.kubernetes.io/last-applied-configuration')
all_dict = json.loads(apiversion) # deployment 转换为字典
'''组装,修改,更新部分区域'''
# 删除不需要得部分
all_dict['metadata'].pop('annotations')
# 增加dns与host部分
all_dict["spec"]["template"]["spec"]["hostAliases"] = k8s_host
all_dict["spec"]["template"]["spec"]["dnsConfig"] = k8s_dns
# 重新赋值镜像为当前
deploy_image = i.spec.template.spec.containers[0].image
all_dict['spec']['template']['spec']['containers'][0]['image'] = deploy_image
# 重新赋值副本数replicas为当前
deploy_scale = i.spec.replicas
all_dict['spec']['replicas'] = deploy_scale
# 修改拉取策略
# deploy_policy = i.spec.template.spec.containers[0].image_pull_policy
all_dict["spec"]["template"]["spec"]['containers'][0]['imagePullPolicy'] = 'IfNotPresent'
# 修改livenessProbe
if all_dict['spec']['template']['spec']['containers'][0].get('livenessProbe'):
# 如果k8s内存中包含livenessProbe,首先将默认的5项赋值
if i.spec.template.spec.containers[0].liveness_probe:
deploy_liveness_failure = i.spec.template.spec.containers[0].liveness_probe.failure_threshold
deploy_liveness_initial = i.spec.template.spec.containers[0].liveness_probe.initial_delay_seconds
deploy_liveness_period = i.spec.template.spec.containers[0].liveness_probe.period_seconds
deploy_liveness_success = i.spec.template.spec.containers[0].liveness_probe.success_threshold
deploy_liveness_timeout = i.spec.template.spec.containers[0].liveness_probe.timeout_seconds