基于kubernetes Api拉取deployment service

由于现有工作的需要,需要对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
                    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值