K8s中组件的版本管理软件(一)-- 服务端镜像生成
我们iot平台使用微服务架构,部署在K8s上,有多个K8s和多个平台,每平台组件数在50+,并不全部一致,可能某个组件1平台有,2平台没,,可能某个组件1平台要的是1.0版本,2平台要的是2.0版本,,,比较乱,,现在想要有一个软件可以清楚地查看出来,某个组件或平台的版本情况。下边是我写的软件。服务端镜像生成平台组件只有个别才会开放外部端口,只能在K8s系统内互...
我们iot平台使用微服务架构,部署在K8s上,有多个K8s和多个平台,每平台组件数在50+,并不全部一致,
可能某个组件1平台有,2平台没,,
可能某个组件1平台要的是1.0版本,2平台要的是2.0版本,,,
比较乱,,
现在想要有一个软件可以清楚地查看出来,某个组件或平台的版本情况。
下边是我写的软件。
服务端镜像生成
平台组件只有个别才会开放外部端口,只能在K8s系统内互访,,
这个服务端的作用就是,根据客户端的访问要求取得K8s内组件的版本,返回给客户端。
服务端使用python+flask+python-kubernetes的服务架构。
客户端提交的数据格式为:
{
"appname":"组件名",
"rename":"正则",
"podport":"端口",
"plat":"所属平台",
"requrl":"请求路径"
}
客户端的请求处理app.py:不要在意那些细节
from flask import Flask, render_template
from flask import request
from poddata import get_podip, get_podimage
import requests
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
@app.route('/versioning', methods=['GET', 'POST'])
def hello_world():
if request.method == 'POST':
appname = request.json.get('appname')
rename = request.json.get('rename')
podport = request.json.get('podport')
plat = request.json.get('plat')
requrl = request.json.get('requrl')
print(' POST info: NAME:{}, RENAME:{}, PLAT:{}, REQURL:{}'.format(appname,rename,plat,requrl))
if requrl == 'image':
return get_podimage(rename,plat)
elif requrl == 'image2':
return get_podimage(rename,plat,1)
else:
podip = get_podip(rename,plat)
if podip == "":
return "Unable to get IP"
else:
returl = 'http://'+podip + ':' + podport + requrl
print(returl)
page = requests.get(returl)
return page.text
else:
return render_template('hello.html',
message= 'owow',
hostname= '',
version=1.6,
name= 'yse')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
组件版本获取,有二种方式,1是直接用组件(容器的IP:端口/请求路径),2是直接获取容器里镜像的版本
poddata.py
from kubernetes import client, config
import re
with open('/var/run/secrets/kubernetes.io/serviceaccount/token', 'r') as file:
Token = file.read().strip('\n')
configuration = client.Configuration()
configuration.host = 'https://apiserver.cluster.local:6443'
configuration.verify_ssl = False
configuration.api_key = {"authorization": "Bearer " + Token}
client.Configuration.set_default(configuration)
def get_podip(rename,plat=''):
v1 = client.CoreV1Api()
ret = v1.list_namespaced_pod(plat)
for v1pod in ret.items:
retone = re.search(rename,v1pod.metadata.name)
if retone != None:
return v1pod.status.pod_ip
return ""
def get_podimage(rename,plat='',i=0):
v1 = client.CoreV1Api()
ret = v1.list_namespaced_pod(plat)
for v1pod in ret.items:
retone = re.search(rename,v1pod.metadata.name)
if retone != None:
return v1pod.status.container_statuses[i].image
return ""
if __name__ == '__main__':
# get_podip(".*?mysql.*?")
print("get_podip or get pod_podinage")
把服务端构建成映像 docker build -t versioning:v2.0
目录是这样的
Dockerfile
FROM alpine:3.10.1
RUN apk add python3 py-pip && python3 -m ensurepip && pip install --upgrade pip && pip install flask && pip install kubernetes
COPY templates /app
WORKDIR /app
COPY . /app/
ENTRYPOINT ["python"]
CMD ["app.py"]
templates目录是flask的默认页面模板,无关,
然后把构建好的镜像上传到仓库。
更多推荐
所有评论(0)