一、概述
Kubernetes官方維護的Python客戶端client-python, 地址:https://github.com/kubernetes-client/python
安裝模塊
pip3 install kubernetes
環境說明
操作系統:centos 7.6
k8s版本:1.18.1
ip地址:192.168.31.74
主機名:k8s-master
操作系統:centos 7.6
k8s版本:1.18.1
ip地址:192.168.31.71
主機名:k8s-node01
二、獲取API cluster URL與token
獲取Cluster URL地址
登錄到k8s-master節點,執行:
# APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ") # echo $APISERVER https://192.168.31.74:6443
下面python腳本要使用,我獲取的是:https://192.168.31.74:6443
創建k8s admin-token
編輯新文件
# mkdir -p /kube/role # cd /kube/role # vi admin-token.yaml
內容如下:
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: admin annotations: rbac.authorization.kubernetes.io/autoupdate: "true" roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: admin namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: name: admin namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile
執行yaml文件
kubectl create -f admin-token.yaml
獲取token值
# kubectl describe secret/$(kubectl get secret -nkube-system |grep admin|awk '{print $1}') -nkube-system|grep token:
輸出:
token: eyJhbGciOiJSUzI1NiIsImtxxxx
由於token過長,這里用xxx代替
最后將token與APISERVER地址返回內容復制到python client主機上, 供腳本使用.
三、在python client主機上編寫腳本
本文采用的python版本為3.7.3,運行在一台centos 7.6的服務器上面。
創建目錄結構
# mkdir -p /kube/auth # cd /kube/auth # vim token.txt
將剛才獲取的Token字符串復制到該文件,比如:eyJhbGciOiJSUzI1NiIsImtxxxx
這里我們獲取的token會引入到我們的腳本下, 作為bearer authorization的api key與遠程k8s API建立認證連接.
編寫python client腳本
獲取的命名空間
# !/usr/bin/python3 # -*- coding: utf-8 -*- from kubernetes.client import api_client from kubernetes.client.apis import core_v1_api from kubernetes import client,config class KubernetesTools(object): def __init__(self): self.k8s_url = 'https://192.168.31.74:6443' def get_token(self): """ 獲取token :return: """ with open('token.txt', 'r') as file: Token = file.read().strip('\n') return Token def get_api(self): """ 獲取API的CoreV1Api版本對象 :return: """ configuration = client.Configuration() configuration.host = self.k8s_url configuration.verify_ssl = False configuration.api_key = {"authorization": "Bearer " + self.get_token()} client1 = api_client.ApiClient(configuration=configuration) api = core_v1_api.CoreV1Api(client1) return api def get_namespace_list(self): """ 獲取命名空間列表 :return: """ api = self.get_api() namespace_list = [] for ns in api.list_namespace().items: # print(ns.metadata.name) namespace_list.append(ns.metadata.name) return namespace_list if __name__ == '__main__': namespace_list = KubernetesTools().get_namespace_list() print(namespace_list)
執行輸出:
['default', 'istio-system', 'kube-node-lease', 'kube-public', 'kube-system']
注意:輸出時,會有一段警告信息
InsecureRequestWarning: Unverified HTTPS request is being made to host '192.168.31.74'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning,
這個是requests庫提示警告,因為我是ip訪問的,所以SSL驗證會失敗。但這個不影響。
獲取所有services
在上面的代碼基礎上,再加一個方法
def get_services(self): """ 獲取所有services :return: """ api = self.get_api() ret = api.list_service_for_all_namespaces(watch=False) for i in ret.items: print("%s \t%s \t%s \t%s \t%s \n" % ( i.kind, i.metadata.namespace, i.metadata.name, i.spec.cluster_ip, i.spec.ports))
單獨執行這個方法,會輸出很多信息。由於由於輸出過多,這里只列出我運行的一個flaskapp
None default flaskapp-1 10.1.168.165 [{'name': 'flaskapp-port',
'node_port': 30005,
'port': 5000,
'protocol': 'TCP',
'target_port': 5000}]
可以看到很多信息,包括service名,svc地址,以及node_port暴露的端口
獲取pod信息
先登錄k8s-master,查看目前運行的pod
# kubectl get pods NAME READY STATUS RESTARTS AGE flaskapp-1-5d96dbf59b-lhmp8 1/1 Running 4 23d
在上面的代碼基礎上,再加一個方法
def get_pod_info(self,namespaces,pod_name): """ 查看pod信息 :param namespaces: 命令空間,比如:default :param pod_name: pod完整名稱,比如:flaskapp-1-5d96dbf59b-lhmp8 :return: """ api = self.get_api() # 示例參數 namespaces = "default" pod_name = "flaskapp-1-5d96dbf59b-lhmp8" resp = api.read_namespaced_pod(namespace=namespaces,name=pod_name) #詳細信息 print(resp)
執行此方法,輸出以下信息,由於輸出過多,使用...省略
{'api_version': 'v1',
'kind': 'Pod',
...
它會輸出一段很長的json,里面包含了此pod的詳細信息
獲取pod日志
在上面的代碼基礎上,再加一個方法
def get_pod_logs(self,namespaces,pod_name): """ 查看pod日志 :param namespaces: 命令空間,比如:default :param pod_name: pod完整名稱,比如:flaskapp-1-5d96dbf59b-lhmp8 :return: """ api = self.get_api() # 示例參數 namespaces = "default" pod_name = "flaskapp-1-5d96dbf59b-lhmp8" """ pretty美化輸出 tail_lines=200輸出最近200行 """ log_content = api.read_namespaced_pod_log(pod_name, namespaces, pretty=True, tail_lines=200) print(log_content)
執行此方法,輸出以下信息:
* Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 182-124-947
這個是flask運行之后,輸出的日志信息。
想了解其他更多參考,請參考鏈接:
https://blog.csdn.net/sinat_33431419/article/details/105223726
備注:token直接寫入到txt是不安全的,可以考慮將token寫入到redis中,然后用python調用即可。
本文參考鏈接:
