一、概述
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