基於kubernetes Api完成更新鏡像版本


一、概述

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.6 1.18.1 19.03.5 10.212.20.94 k8s-master 2核4G
centos 7.6 1.18.1 19.03.5 10.212.21.159 k8s-node01 2核4G
centos 7.6 1.18.1 19.03.5 10.212.22.192 jenkins 2核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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM