基于kubernetes Api完成更新镜像版本

发布时间:2020-08-06 09:50:59编辑:admin阅读(288)

    一、概述

    kubernetes Api python client 相关内容信息 Github地址:
    https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md

     

    目前公司才用的镜像更新的方式为,jenkins服务器执行一个镜像更新shell脚本,脚本中通过使用ansible从而达到从kubernetes master执行更新命令,从而达到镜像版本的更新。

    后期需考虑逐步通过python得到需更新的镜像,与版本以及deployment直接通过调用kubernetes Api完成对更镜像的版本更新。

    所以特此学习Kubernetes Api 熟悉该Api的调用

     

    二、代码实现

    环境说明

    系统k8s版本docker版本ip主机名配置
    centos 7.61.18.119.03.510.212.20.94k8s-master2核4G
    centos 7.61.18.119.03.510.212.21.159k8s-node012核4G
    centos 7.61.18.119.03.510.212.22.192jenkins2核4G

     

     

     

     

     

     

    安装模块

    登录jenkins服务器,执行

    pip3 install kubernetes

     

    拷贝k8s config

    登录jenkins服务器,拷贝k8s master节点的$HOME/.kube/config文件

    scp 10.212.20.94:/root/.kube/config .

     

    python脚本

    举例:将应用 flaskapp-1的镜像地址更改为:nginx:1.12

     

    登录k8s-master节点,查看一下当前的镜像地址

    [root@k8s-master ~]# kubectl get pods
    NAME                          READY   STATUS    RESTARTS   AGE
    flaskapp-1-54b8675b87-8rsnf   1/1     Running   0          22s
    [root@k8s-master ~]# kubectl get po flaskapp-1-54b8675b87-8rsnf -o yaml|grep '\- image:'
      - image: jcdemo/flaskapp

    可以看到,当前的镜像地址为:jcdemo/flaskapp

     

    登录jenkins服务器,编辑文件test.py,完整内容如下:

    # !/usr/bin/python3
    # -*- coding: utf-8 -*-
    '''replace_namespace_deployment,快速替换deployment需要升级或回滚的镜像'''
    
    import os
    from kubernetes import client, config
    from kubernetes.client.rest import ApiException
    
    
    def read_deployment(name, namespace, update_image):
        body = api_instance.read_namespaced_deployment(name, namespace)
        # 修改镜像版本为指定
        body.spec.template.spec.containers[0].image = update_image
        return body
    
    
    def replace_deployment(name, namespace, body):
        try:
            api_response = api_instance.replace_namespaced_deployment(name, namespace, body)
            print("\033[0;32m{} 中deployment : {} {}更新完成\033[0m".format(namespace, name, update_image))
        except ApiException as e:
            print("Exception when calling AppsV1Api->replace_namespaced_deployment: %s\n" % e)
    
    
    if __name__ == "__main__":
        # kubernetes生成时/root目录下.kube目录下的认证配置文件
        kube_conf = os.path.join('/root/config')
        config.load_kube_config(kube_conf)
        api_instance = client.AppsV1Api()
    
        # 传入参数配置
        name = 'flaskapp-1'
        namespace = 'default'
        update_image = 'nginx:1.12'
    
        # 调用函数
        body = read_deployment(name, namespace, update_image)
        replace_deployment(name, namespace, body)

    说明:

    kube_conf 指定k8s的认证配置文件,在上面的步骤中,我scp到/root目录了。

    name 表示应用名,也就是Deployment中,定义的name变量。

    namespace 命名空间

    update_image 需要更新的镜像地址

     

    执行python脚本

    python3 test.py

    输出:

    default 中deployment : flaskapp-1 nginx:1.12更新完成

     

    三、验证

    此时,登录主机k8s-master,查看pods

    # kubectl get pods
    NAME                          READY   STATUS              RESTARTS   AGE
    flaskapp-1-54b8675b87-8rsnf   1/1     Running             0          6m40s
    flaskapp-1-856b8bf88d-zhvvp   0/1     ContainerCreating   0          12s

    发现应用正在更新中

     

    等待1分钟,再次查看

    [root@k8s-master ~]# kubectl get pods
    NAME                          READY   STATUS    RESTARTS   AGE
    flaskapp-1-856b8bf88d-zhvvp   1/1     Running   0          56s
    [root@k8s-master ~]# kubectl get po flaskapp-1-856b8bf88d-zhvvp -o yaml|grep '\- image:'
      - image: nginx:1.12

    发现镜像地址已经更改过来了!

     

     

    本文参考链接:

    https://blog.csdn.net/weixin_44956450/article/details/101160820


关键字

上一篇: Prometheus监控Minio集群

下一篇: 安装KubeSphere