背景介绍

有时往k8s集群里部署一堆服务的时候,需要拷贝一堆yaml文件,当然还有其他方式部署,例如通过建立一个一个的流水线等方式,但是这太慢了,虽然是一劳永逸,但是如果说仅仅是部署一次那就可太费劲了,那么直接拷贝一堆yaml文件就简单了许多,但是如果之前的环境中镜像地址是走的内网,而现在放到另一个环境中,网络不通时,就需要更改其中的镜像地址了

假如之前的网络环境到阿里云内网镜像地址是通的,也就是长这样:registry-vpc.cn-beijing.aliyuncs.com/xxxx/xxxxx

然后现在要部署到华为云上时,直接启动yaml文件肯定是起不来的,需要修改下此镜像地址,改为:registry.cn-beijing.aliyuncs.com/xxxx/xxxx,改成这样就可以拉了。

那么该如何实现呢?

调用k8s接口完成镜像替换

下面这段代码是通过k8s的接口,先去查当前命名空间下都有哪些服务,然后把这些服务都写道一个数组里,然后再去迭代这个数组,然后去修改整个命名空间下的所有pod的镜像地址

import re
from kubernetes import client, config class deployServer:
def __init__(self, kubeconfig):
self.kubeconfig = kubeconfig
config.kube_config.load_kube_config(config_file=self.kubeconfig)
self._AppsV1Api = client.AppsV1Api()
# 这俩暂时用不到
# self._CoreV1Api = client.CoreV1Api()
# self._ExtensionsV1beta1Api = client.ExtensionsV1beta1Api() def list_deploy(self, namespace_name):
'''
:param namespace_name: 指定命名空间
:return: 返回一个deployment的列表
'''
deploySubj = self._AppsV1Api.list_namespaced_deployment(namespace_name)
return [ subj.metadata.name for subj in deploySubj.items ] def patchMultiDeploy(self, namespace_name, newimgdomain):
for i in self.list_deploy(namespace_name):
self.patchDeploy(namespace_name, i, newimgdomain)
print("{}: {} patch success.".format(namespace_name, i)) def patchDeploy(self, deploy_namespace, deploy_name, newimgdomain, keyword='vpc'):
img_addr_rule = r"[^?]{1,}\.[^?]{1,}\.com(\/.*\:.*)"
img_domain_rule = r"([^?]{1,}\.[^?]{1,}\.com).*\:.*"
old_deploy = self._AppsV1Api.read_namespaced_deployment(
name=deploy_name,
namespace=deploy_namespace,
)
old_deploy_container = old_deploy.spec.template.spec.containers
# 迭代deployment的列表,获取deployment的名称以及它所在索引位置
for i, k in enumerate(old_deploy_container):
# 捕获处域名之外的镜像地址
oldImgAddr = re.findall(img_addr_rule, old_deploy_container[i].image)[0]
# 捕获镜像地址的域名,也可以不获取,但是获取会更准确些
oldImgDoamin = re.findall(img_domain_rule, old_deploy_container[i].image)[0]
# 符合条件的才会进行替换
if keyword in oldImgDoamin:
old_deploy_container[i].image = newimgdomain + oldImgAddr
self._AppsV1Api.patch_namespaced_deployment(
name=deploy_name,
namespace=deploy_namespace,
body=old_deploy
)
return if __name__ == '__main__':
kubeconfig = r'kubeconfig/config'
k8s = deployServer(kubeconfig)
# 指定服务所在命名空间
namespace = 'ops-logging'
# 指定要替换的镜像的域名
img = 'docker.elastic.co'
k8s.patchMultiDeploy(namespace, img)

注意这里需要指定kubeconfig文件

修改文件里的镜像地址

上面那个是直接调接口,通过patch来进行修改,下面是直接修改yaml文件

import os
import re def modifyImagesFromFile(originpath, src_img, dst_img):
_re_rule = r".*image: ([^?]{1,}\.[^?]{1,}\.com).*\:.*"
if os.path.isdir(originpath):
filesubj = os.walk(originpath)
filename = []
# 迭代指定路径下的所有文件
for path, _, file in filesubj:
# 把所有的文件拼成一个完整的路径,并写道一个列表里
filename = [os.path.join(path, f) for f in file]
if filename:
for f in filename:
with open(f, 'r+', encoding='utf-8') as fr:
fr_data = fr.read()
replace_list = re.findall(_re_rule, fr_data)
if replace_list:
for pattern in replace_list:
if src_img in pattern:
# 把匹配到的内容进行替换
fr_data = fr_data.replace(pattern, dst_img)
fr.seek(0)
fr.write(fr_data)
print("{} replace success".format(f))
else:
print("Unknown")
else:
print("{} not a directory".format(originpath)) if __name__ == '__main__':
originpath = r"E:\项目\DEV环境\sg-saas-pro-hbali\gldsg-gvs\deployments"
dst_img = 'registry.cn-beijing.aliyuncs.com'
src_img = 'registry-vpc.cn-beijing.aliyuncs.com'
modifyImagesFromFile(originpath)

注意: 需要把所有的deployment文件都放到一个目录里

总结一哈

如果是在线修改的话,就用上面调k8s接口通过patch来修改,直接粘贴复制,指定好命名空间,指定好kubeconfig的文件位置即可

如果是把所有的yaml文件都down下来了,那么就直接迭代目录下的所有文件,通过正则去捕获镜像地址,然后进行替换,再写入源文件就可以了。


欢迎各位朋友关注我的公众号,来一起学习进步哦

最新文章

  1. Eclipse new server : Cancnot create a server using the selected type
  2. java JDK8 学习笔记——第11章 线程和并行API
  3. XML详解:第二部分 XML Schema
  4. memcached简介(转)
  5. Java中throws和throw的区别讲解
  6. poj 1840 Eqs (hash)
  7. javascript - 工作笔记 (事件绑定)
  8. Mac 10.10 下安装jdk 1.7 以上
  9. Vijos P1881 闪烁的星星 (加强自己多一点。。)
  10. laravel5 html引用问题
  11. 18 UI美化状态集合的位图selector
  12. 2015年第六届蓝桥杯javaB组 试题 答案 解析
  13. ios表单验证帮助类
  14. ecmall 的一些方法说明
  15. MySQL 5.7 优化SQL提升100倍执行效率的深度思考(GO)
  16. 一个发送邮件的java类,包含多种发送方法
  17. django中celery的使用
  18. am335x backlight
  19. OpenFileDialog 打开文件对话框
  20. Xamarin Error:Could not find android.jar for API Level 23.

热门文章

  1. mysql数据库表引入redis解决方案
  2. Redis-第九章节-动态字符串
  3. 简单梳理下 Vue3 的新特性
  4. 微信小程序:报错fail webview count limit exceed
  5. Kubernetes中分布式存储Rook-Ceph部署快速演练
  6. SpringBoot整合MyBatis-Plus框架(代码生成器)
  7. windows server 2008 r2 AD域服务器设置
  8. 2.5w字 + 36 张图爆肝操作系统面试题,太牛逼了!
  9. 关于 JMeter 5.4.1 的一点记录
  10. ElasticSearch学习笔记(超详细)