我们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的默认页面模板,无关,

然后把构建好的镜像上传到仓库。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐