背景介绍

有时往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下来了,那么就直接迭代目录下的所有文件,通过正则去捕获镜像地址,然后进行替换,再写入源文件就可以了。


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

k8s在线和离线批量修改镜像地址的两种方式的更多相关文章

  1. Docker镜像构建的两种方式

    关于Docker里面的几个主要概念 这里用个不太恰当的比方来说明. 大家肯定安装过ghost系统,镜像就像是ghost文件,容器就像是ghost系统.你可以拿别人的ghost文件安装系统(使用镜像运行 ...

  2. Docker镜像构建的两种方式(六)--技术流ken

    镜像构建介绍 在什么情况下我们需要自己构建镜像那? (1)当我们找不到现有的镜像,比如自己开发的应用程序 (2)需要在镜像中加入特定的功能 docker构建镜像有两种方式:docker commit命 ...

  3. Docker镜像构建的两种方式(六)

    镜像构建介绍 在什么情况下我们需要自己构建镜像那? (1)当我们找不到现有的镜像,比如自己开发的应用程序 (2)需要在镜像中加入特定的功能 docker构建镜像有两种方式:docker commit命 ...

  4. Android系统移植与调试之------->如何修改开机动画的两种方式剖析

    首先,我们先来分析一下源码: frameworks/base/cmds/bootanimation/BootAnimation.cpp 首先看一下定义的常量: BootAnimation::ready ...

  5. 修改element内部样式的两种方式

    第一种: 全局样式修改: 但这种方式有点不好的地方,这样会影响别的组件,比如修改elementUI的树结构的样式,这样改的话会影响到别的树组件: 第二种方式: 在要修改的组件内修改树结构样式 比如改这 ...

  6. js 修改页面样式的两种方式

    1.  element.style       行内样式操作 代码示例 : <!DOCTYPE html> <html lang="en"> <hea ...

  7. jdbc插入修改clob类型的两种方式

    方法一: Connection con = dbl.loadConnection(); strSql = "insert into table1(id,a) values (1,EMPTY_ ...

  8. Jquery EasyUI修改行背景的两种方式

    1.数据加载完成不请求后台的做法 方式一: //更改表格行背景 function changeLineStyle(index){ var rows=$("#alertGird"). ...

  9. CentOS 7配置静态IP地址的两种方法 来自:互联网

    CentOS 7配置静态IP地址的两种方法 来自:互联网 时间:2021-01-12 阅读:4 如果你想要为CentOS 7中的某个网络接口设置静态IP地址,有几种不同的方法,这取决于你是否想要使用网 ...

随机推荐

  1. 一周精彩内容分享(第 3 期):开工大吉的 B 面

    这里记录过去一周,我看到的值得分享的东西. 一方面是整理记录一下自己一周的学习,另一方面也是期待自己有更多的输出,有更多的价值. 周刊开源(Github:wmyskxz/weekly),欢迎提交 is ...

  2. 使用stress进行压力测试

    本文转载自使用stress进行压力测试 导语 stress,顾名思义是一款压力测试工具.你可以用它来对系统CPU,内存,以及磁盘IO生成负载. 安装stress 几乎所有主流的linux发行版的软件仓 ...

  3. idea 如何在新窗口中打开项目

    参考链接:https://blog.csdn.net/dreamfly88/article/details/52240188 以前一直再用eclipse,可以同时打开好几个项目,idea中同样支持打开 ...

  4. @Transaction注解失效的几种场景

    一.@Transactional介绍 1.@Transactional注解可以作用于哪些地方? @Transactional 可以作用在接口.类.类方法上. 作用于类:表示所有该类的public方法都 ...

  5. Bitter.NotifyOpenPaltform : HTTP 异步消息接收调度中心--开源贡献 之 一:简介

    现在互联网的系统越来越趋向于复杂,从单体系统到现在的微服务体系演变.公司与公司的分工也越来越明确. 大数据公司提供了大数据服务 人脸识别公司提供了人脸识别服务 OCR 公司提供了专业的OCR 服务 车 ...

  6. 单例模式有效解决过多的if-else

    策略模式 引例:假如我们要分享一个篇文章.有微信分享.微博分享.QQ分享等......我们是先判断类型是哪个,然后再调用各自得API去做分享操作 一般来说,大多数人都会根据类型判断是哪个渠道吧,如下代 ...

  7. JavaScript:什么是回调?

    翻译练习 原博客地址:JavaScript: What the heck is a Callback? 在6分钟内通过简单的例子学习和理解回调的基本原理. 什么是回调? 简单地说:回调就是一个在另一个 ...

  8. Codeforces (ccpc-wannafly camp day2) L. Por Costel and the Semipalindromes

    题目链接:http://codeforces.com/gym/100923/problem/L 分析:题目要求序列首尾相同,在此基础上的字典序第k个:因为只存在a,b所以我们把它等效成0和1的话,字典 ...

  9. 关于PHP的__construct()函数

    1 <?php 2 header("Content-Type:text/html;charset=utf-8");//调整为utf-8编码格式 3 class car 4 { ...

  10. add_header被覆盖 -配置错误

    Nginx的配置文件分为Server.Location.If等一些配置块,并且存在包含关系,和编程语言比较类似.如果在外层配置的一些选项,是可以被继承到内层的. 但这里的继承也有一些特性,比如add_ ...