范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

运维自动化之nacos,apollo,k8s常用API汇总

  1. Nacos API
  本代码包括列出service列表,列出指定服务下实例列表,服务上下线,实例注册,服务信息修改等方法, 更多关于nacosapi的详细信息,请参考https://nacos.io/zh-cn/docs/open-api.html,import requests class NacosAPI(object):     def __init__(self,url,username,password):         self.auth, self.url = {"username": username,"password": password},url         self.response = requests.post("%s/nacos/v1/auth/users/login" % (self.url), data=self.auth,verify=False).json()         self.params=(("accessToken", self.response["accessToken"]),)     def servicesList(self):         """列出service列表"""         data=requests.get("%s/nacos/v1/ns/catalog/services?pageNo=1&pageSize=100" % self.url,params=self.params).text         print(data)     def instanceList(self,service):         """列出指定服务下实例列表"""         data = requests.get("%s/nacos/v1/ns/instance/list?serviceName=%s" % (self.url,service), params=self.params).text         print(data)     def changeStatus(self,serviceName,ip,port,enabled):         """实例上下线 enabled:true 上线, false 下线"""         self.data = {"serviceName": serviceName,"ip": ip,"port":port,"enabled": enabled}         data=requests.put("%s/nacos/v1/ns/instance" % (self.url), params=self.params, data=self.data , verify=False).text         print(data)     def register(self,serviceName,ip,port):         """实例注册"""         url="%s/nacos/v1/ns/instance" % (self.url)         data=requests.post(url,data={"ip":ip,"port":port,"serviceName":serviceName})         print(data.text)     def instanceChange(self):         """修改实例信息"""         data = {"serviceName": "merchant-order", "ip": "10.42.4.129", "port": 8080, "clusterName": "DEFAULT","weight": 1, "enabled": False}         response = requests.put(url="%s/nacos/v1/ns/instance" % (self.url), data=data)         print(response.text) if __name__=="__main__":     nacos=NacosAPI("http://192.168.3.160:8848","nacos","NACOS")     nacos.register()
  2.Apollo 前台界面 API
  因开放平台未支持授权,故抓取了前台界面的api实现批量授权功能,开放平台的管理需要提前授权才能管理import requests class apollo_web():     def __init__(self,potalurl,username,password):         self.potalurl,self.username,self.password=potalurl,username,password         data = {"username": username,"password": password}         response = requests.post(f"{self.potalurl}/signin",data=data,allow_redirects=False)         self.SESSION=dict(response.cookies)["SESSION"]     def Authorize_App(self,Token,app:str):         """授权应用给用户"""         cookies = {"NG_TRANSLATE_LANG_KEY": "zh-CN","SESSION": self.SESSION}         params = (("envs", ["DEV", "SIT"]),("type", "AppRole"))         headers = {"Content-Type": "application/json"}         data = "{"appId":"%s"}" % app         response = requests.post(f"{self.potalurl}/consumers/{Token}/assign-role" ,                                  params=params, headers=headers,cookies=cookies, data=data, verify=False)         print(response.text) if __name__=="__main__":     apollo=apollo_web()     apollo.Authorize_App("Token","sms")
  3.Apollo 开放平台 API
  本代码包含获取配置,修改配置,发布配置,批量发布配置等功能, 在我的日常工作中,批量发布用的很频繁,import  requests,json from loguru import logger class ApolloAPI(object):     def __init__(self,apolloenv):         apollo_info= {"aliyun":{"url":"http://apollo.ali.cn","token":"a2814e7476b64fbdb08d9e9ec0b2d2d76e621cac"}                      ,"local":{"url":"http://apollo.tenx.cn","token":"a2814e7476b64fbdb08d9e9ec0b2d2d76e621cac"}}         self.apollourl=apollo_info[apolloenv].get("url")         self.apps=["zuul","omc","oms","omss"]         self.headers = {"Authorization": apollo_info[apolloenv].get("token"),"Content-Type": "application/json;charset=UTF-8"}     def GetnamespaceName(self,env,appid,clusterName="default"):         """获取某集群下,指定appid的所有namespace"""         url = "%s/openapi/v1/envs/%s/apps/%s/clusters/%s/namespaces" % (self.apollourl,env,appid,clusterName)         data=requests.get(url, headers=self.headers).json()         result=[x["namespaceName"] for x in data ]         return result     def AddApp_Config(self,env,appId,namespaceName,key,value,comment="",clusterName="default"):         """添加配置"""         url="%s/openapi/v1/envs/%s/apps/%s/clusters/%s/namespaces/%s/items" % (self.apollourl,env,appId,clusterName,namespaceName )         data={"key":key,"value":value,"comment":comment,"dataChangeCreatedBy":"apollo"}         respose = requests.post(url, json=data, headers=self.headers)         print("新增配置 :环境:%s,appId:%s,namespaceName:%s,key:%s,value:%s,新增配置结果:%s" % (env,appId,namespaceName,key,value,respose.text))     def ReleasesApp_OneNamespaceName(self,env,appId,namespaceName,clusterName="default"):         """发布指定appid下指定的namespace"""         url="%s/openapi/v1/envs/%s/apps/%s/clusters/%s/namespaces/%s/releases" % (self.apollourl,env,appId,clusterName,namespaceName)         data={"releaseTitle":"releaseTitle","releaseComment":"releaseComment","releasedBy":"apollo"}         respose=requests.post(url,json=data,headers=self.headers)         logger.info("ReleasesApp_OneNamespaceName:respose:%s" % (respose.text))         if respose.status_code==200:             return "发布成功"         else:             return "发布失败,HTTP状态码:%s" % respose.status_code     def ReleasesApp_AllNamespaceName(self,env,appId,clusterName="default"):         """发布指定appid下所有namespace"""         result=[]         namespaceNames=self.GetnamespaceName(env,appId,clusterName)         for namespaceName in namespaceNames:             logger.info("ReleasesApp_AllNamespaceName:app:%s,namespaceName:%s" % (appId,namespaceName))             result.append(self.ReleasesApp_OneNamespaceName(env,appId,namespaceName,clusterName))         return result     def ReleasesAllApps(self,env="FINDEV"):         """发布指定环境的所有应用"""         for app in self.apps:             try:                 result=self.ReleasesApp_AllNamespaceName(env,app)                 logger.info("app:%s,%s" % (app,result))             except Exception as e:                 logger.info("ReleasesAllApps:%s,error:%s" % (app,e))     def BeforeReleasesDetailAll(self,env,appId,clusterName="default"):         """获取即将发布后的配置信息"""         result={}         url="%s/openapi/v1/envs/%s/apps/%s/clusters/%s/namespaces" % (self.apollourl,env,appId,clusterName)         try:             respose=requests.get(url, headers=self.headers).json()             for x in respose:                 result[x["namespaceName"]]={}                 for i in x["items"]:                     result[x["namespaceName"]][i["key"]]=i["value"]             return result         except Exception as e:             print("BeforeReleasesDetailAll:%s:%s" % (env,appId))             raise Exception("sdsdsdsd")     def CurrentReleasesedDetailAll(self,env,appId,clusterName="default"):         """获取发布前的配置信息"""         result={}         namespaceNames = self.GetnamespaceName(env, appId, clusterName)         for namespaceName in namespaceNames:             url="%s/openapi/v1/envs/%s/apps/%s/clusters/%s/namespaces/%s/releases/latest" % (self.apollourl,env,appId,clusterName,namespaceName)             respose=requests.get(url, headers=self.headers)             if respose.text:                 resposejson=respose.json()                 result[resposejson["namespaceName"]]=resposejson["configurations"]         return result if __name__=="__main__":     apollo=ApolloAPI("ali")     apollo.ReleasesAllApps("PRE")
  4.K8S API
  本代码支持文件和文本认证信息,方便根据实际情况开发from kubernetes import client, config from kubernetes.client.rest import ApiException class KubernetesAPI:     def __init__(self,kube_conf):         """文件"""         config.load_kube_config(kube_conf)     def __init__(self,kube_conf_text):         """文本"""         yamldata=yaml.load(kube_conf_text, Loader=yaml.Loader)         k8_loader = kube_config.KubeConfigLoader(yamldata)         call_config = type.__call__(Configuration)         k8_loader.load_and_set(call_config)         Configuration.set_default(call_config)     def list_node(self):         """列出node"""         v1 = client.CoreV1Api()         try:             ret=v1.list_node(watch=False)             result={"code":200,"data:":[{"uid":x.metadata.uid,"name":x.metadata.name,"creattime":x.metadata.creation_timestamp,"pod_cid_rs":x.spec.pod_cid_rs,                            "pod_cidr":x.spec.pod_cidr,"unschedulable":x.spec.unschedulable} for x in ret.items]}         except ApiException as e:             result = {"code": 500, "msg": e}         return result     def list_namespace(self):         """列出namespace"""         v1 = client.CoreV1Api()         try:             ret=v1.list_namespace(watch=False)             result={"code":200,"data:":[{"uid":x.metadata.uid,"name":x.metadata.name,"creattime":x.metadata.creation_timestamp} for x in ret.items]}         except ApiException as e:             result = {"code": 500, "msg": e}         return result     def list_deploymet(self,namespaces):         """列出指定namespaces的deploymet"""         v1 = client.AppsV1Api()         try:             ret = v1.list_namespaced_deployment(namespaces,watch=False)             result = {"code": 200, "data":[{"uid":x.metadata.uid,"name":x.metadata.name,"namespace":x.metadata.namespace,"replicas":x.spec.replicas,                            "status":x.status.available_replicas,"creattime":x.metadata.creation_timestamp} for x in ret.items]}         except ApiException as e:             result = {"code": 500, "msg": e}         return result     def list_pods(self,namespace):         v1 = client.CoreV1Api()         try:             ret=v1.list_namespaced_pod(namespace)             result={"code":200,"data":[{"uid":x.metadata.uid,"name":x.metadata.name,"pod_ip":x.status.pod_ip,"host_ip":x.status.host_ip,"creattime":x.metadata.creation_timestamp} for x in ret.items]}         except ApiException as e:             result = {"code": 500, "msg": e}         return result     def list_pods_deployment(self,namespace,deployment):         """查询deployment的pods"""         v1 = client.CoreV1Api()         try:             ret=v1.list_namespaced_pod(namespace,label_selector="app.kubernetes.io/name=%s" % deployment)             result={"code":200,"data":[{"uid":x.metadata.uid,"name":x.metadata.name,"pod_ip":x.status.pod_ip,"host_ip":x.status.host_ip,"creattime":x.metadata.creation_timestamp} for x in ret.items]}         except ApiException as e:             result = {"code": 500, "msg": e}         return result     def query_pod_stdoutlogs(self,namespaces,pod):         """查看pod stdout日志"""         v1 = client.CoreV1Api()         try:             result = {"code": 200, "data":v1.read_namespaced_pod_log(pod,namespaces)}         except ApiException as e:             result = {"code": 500, "msg": e}         return result     def query_deployment_stdoutlogs(self,namespace,deployment):         """查看deployment下pod的日志"""         result=[]         querypods=self.list_pods_deployment(namespace,deployment)         if querypods["code"]==200:             for x in querypods["data"]:                 result.append({"name":x["name"],"logs":self.query_pod_stdoutlogs(namespace,x["name"])})         else:             result = {"code": 500, "msg": "查询pod出错:%s" % querypods["msg"]}         return result     def remove_pod(self,namespace,podname):         """删除pod"""         v1 = client.CoreV1Api()         try:             v1.delete_namespaced_pod(podname, namespace)             return {"code": 200, "msg": "删除成功"}         except ApiException as e:             return {"code": 500, "msg": str(e)}     def deployment_setvar(self,namespace,deployment,key,value):         """设置deployment变量"""         v1=client.AppsV1Api()         body={"spec":{"template":{"spec":{"containers":[{"env":[{"name":key,"value":value}],"name":deployment}]}}}}         try:             v1.patch_namespaced_deployment(name=deployment,namespace=namespace,body=body)             return {"code": 200, "msg":"设置成功"}         except ApiException as e:             return {"code":500,"msg":str(e)} if __name__=="__main__":     ss=KubernetesAPI("D:Softwareconfig")     sss=ss.query_deployment_stdoutlogs("dev","qtz")     print(sss)

创因科技小程序小创控价帮助品牌掌握正确的控价方式对于品牌而言,控价一直是一个比较沉重的话题。如果不控价,品牌陷入价格战,容易导致市场体系混乱如果控价过于严格,阻碍其他经销商的加入,品牌号召力减弱,市场认可度降低。比如某知名化妆品创因科技简析淘宝低价处理方案电商时代的到来带动品牌渠道的变革,但是对于很多企业而言线下市场依旧是重中之重,线上线下相辅相成,互不拖累甚至是互有帮益是最好的局面,而如今一些企业的面临的却是线上低价乱价影响市场的不会ps怎么办,5招带你玩转ppt修图功能一份优秀的ppt,总是离不开优质的内容和合理的素材组织方式。而优质的内容除了文案,恰当适宜的图片更是必不可少。如何修饰图片,是每个ppter或多或少绕不开的问题。图片处理,你可能首真我GTNeo2T真我Q3s发布!售价1499起,网友香啊最近,国内各大手机品牌官宣的产品非常多,吸引了众多小伙伴的目光。那么,话不多说,我们直接来聊聊刚刚结束的realme新品发布会。在整场发布会上,realme主要发布了realmeG车企转型的冰与火之歌数字化与用户运营如果数据成为运营的核心,而用户只是服务对象的话,或许是一种本末倒置。文东篱数字化的基因正在深度渗透并改造车企。12月12日,一汽大众宣布潘占福接替刘亦功担任公司董事党委书记总经理,跨入竞技领域富勒G90EVO开箱测评前言还要从办公室说起,前几日同事的鼠标双击罢工,遂向我求助推荐一款办公游戏兼顾的鼠标,本打算将自己手里的G93PRO处理给他,但是考虑到G93PRO那略微夸张的造型放在办公室显得太创因科技谈品牌方在淘宝平台的控价方式淘宝上,品牌方最棘手的问题就是低价乱价和假货问题。可能会产生如下影响1低价乱价的影响现在消费者大部分有这样的习惯,买东西前看下淘宝京东等电商平台卖多少。电商平台过多低价导致品牌自身充电宝级荣耀note10,搭载5000mah电池震撼来袭?感谢大家收看这期要倒不倒的徐一咯聊机给大家带来的荣耀note10最新消息。根据荣耀手机官方微博最新消息5000这数字史无前例很明显,荣耀Note10将会搭载5000mAh超大电池,4款神级PPT插件,让PPT设计简单起来纵观人类发展进程,从莽荒状态进入到目前智能化时代,中间历经石器青铜铁器蒸汽电气和信息时代,每个阶段的演进都离不开技术变革和工具革新,历史已充分验证了工具即生产力的道理。映射到PPT想买智能开关,不知道怎么装,来我告诉你,超简单,超easy很多人接触智能家居,一般都是从智能开关开始,因为智能开关,使用简单,价格便宜,作为入门智能家居的首选。那就有了一个新问题,好多人不明白智能开关如何购买,或者如何搭配,关注点赞评论,智能窗帘如何安装使用?你以为很困难,实际上太简单了智能窗帘由于结构简单,方便易用等特点,越来越多用户选择智能窗帘。那我们如何选购,如何安装呢?其实智能窗帘和普通窗帘一样的安装方法,使用方法也大致一样。首先确定一下你家是多大的尺寸,
天玑1000,天玑1100和天玑1200之间的差距到底有多大?了解一下相信大家也知道,在联发科没有天玑之前,还是默默无闻地给人的一种低端,顶多是个中端的感觉,但是自从有了天玑,有了天玑1000,就让我们看到了联发科的崛起。那么这篇文章我们来分别对比一电脑自助提速现在又要开始上网课了,家里的电脑可能有的网络链接有异常,有的可能是老电脑多度的卡。现在提供网络链接异常问题1使用360的断网急救箱进行急救,这个适合小白进行使用,不需要太多操作。2新电脑到手,跳过联网进入Windows11的方法来了新电脑到手,跳过联网进入Windows11的方法来了大家买的天选3或者ROG枪神6到了吗?不知道大家在首次开机的时候,有没有发现电脑在登录的过程中,会进入到连接网络的步骤,没有可以ios15。3。1为何不能升级?网友评论很精彩,也很真实苹果iOS15。3。1正式版已经更新了有一阵子了,关注的用户会发现,该版本的网评口碑并不好,不少用户都因此望而却步。那么iOS15。3。1正式版为何不能升级?网友评论很精彩,但也很最后我选择了小米mixfold一开始我用得是华为mate40标准版,我是从iPhone12mini转过来的,之前也一直用得苹果手机,但是由于万年不变的设计还有没有创新的操作系统,我转战安卓阵营,当鸿蒙系统出现以手机进化1980年的手机长啥样?什么!它就长这样?原标题ElaGame手机进化跑酷游戏PhoneEvolution展现手机发展史你知道1980年的手机是什么样的么?在过去的40多年里手机到底经历了怎样的进化历史呢?今天为大家推荐一东数西算将带来哪些改变?来源人民网人民日报海外版宁夏可再生能源丰富,吸引了不少企业在此布局数据中心。图为位于宁夏银川黄河东岸的一处光伏电站。袁宏彦摄(人民视觉)在全国首个大数据综合试验区贵州,数据中心发展让诚信的人先富诚信是世上最大的财富在阿里巴巴一年一度的全体员工大会上,董事局主席马云像往常一样以充满激情的语调,向员工们宣布了公司新一年的三大主题第一,诚信建设和知识产权保护第二,以高科技网络技术为社会创造更多就业聚焦科技兴电,助力现代能源体系建设近日,国网山东省电力公司第三批18项发明专利通过山东省产权交易中心进行挂牌交易,通过专利许可形式成功实现成果推广,并获得转化收益,有效促进了电力创新成果现场应用。十四五以来,国网山华为手机的落幕,是手机圈的悲哀前几年国内手机市场华为是绝对的老大哥,全球市场份额一度赶超安卓机皇三星,当初余大嘴还说出未来只有两三家手机厂商能生存,华为是第一当时余承东也确实不是打打嘴炮,按照当时华为的进攻速度为什么有人用过苹果手机后,不再换回安卓手机,原来是这3个原因笔者作为一个手机行业的行内人,发现一个非常奇怪的现象,那就是安卓手机用户买了苹果手机,使用一段时间后不会再换回安卓手机,而原来的苹果手机用户买了安卓手机以后,大多数人使用一段时间后