前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes Python Client

Kubernetes Python Client

作者头像
py3study
发布2020-10-15 10:34:17
3.5K0
发布2020-10-15 10:34:17
举报
文章被收录于专栏:python3

一、概述

Kubernetes官方维护的Python客户端client-python, 地址:https://github.com/kubernetes-client/python

安装模块

代码语言:javascript
复制
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节点,执行:

代码语言:javascript
复制
# 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

编辑新文件

代码语言:javascript
复制
# mkdir -p /kube/role
# cd /kube/role
# vi admin-token.yaml

内容如下:

代码语言:javascript
复制
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文件

代码语言:javascript
复制
kubectl create -f admin-token.yaml

获取token值

代码语言:javascript
复制
# kubectl describe secret/$(kubectl get secret -nkube-system |grep admin|awk '{print $1}') -nkube-system|grep token:

输出:

代码语言:javascript
复制
token:      eyJhbGciOiJSUzI1NiIsImtxxxx

由于token过长,这里用xxx代替

最后将token与APISERVER地址返回内容复制到python client主机上, 供脚本使用.

三、在python client主机上编写脚本

本文采用的python版本为3.7.3,运行在一台centos 7.6的服务器上面。

创建目录结构

代码语言:javascript
复制
# mkdir -p /kube/auth
# cd /kube/auth
# vim token.txt

将刚才获取的Token字符串复制到该文件,比如:eyJhbGciOiJSUzI1NiIsImtxxxx

这里我们获取的token会引入到我们的脚本下, 作为bearer authorization的api key与远程k8s API建立认证连接.

编写python client脚本

获取的命名空间

代码语言:javascript
复制
# !/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)

执行输出:

代码语言:javascript
复制
['default', 'istio-system', 'kube-node-lease', 'kube-public', 'kube-system']

注意:输出时,会有一段警告信息

代码语言:javascript
复制
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

在上面的代码基础上,再加一个方法

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
flaskapp-1-5d96dbf59b-lhmp8   1/1     Running   4          23d

在上面的代码基础上,再加一个方法

代码语言:javascript
复制
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)

执行此方法,输出以下信息,由于输出过多,使用...省略

代码语言:javascript
复制
{'api_version': 'v1',
 'kind': 'Pod',
  ...

它会输出一段很长的json,里面包含了此pod的详细信息

获取pod日志

在上面的代码基础上,再加一个方法

代码语言:javascript
复制
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)

执行此方法,输出以下信息:

代码语言:javascript
复制
* 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调用即可。

本文参考链接:

https://blog.csdn.net/hypon2016/article/details/99439309

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/10/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
    • 安装模块
      • 环境说明
      • 二、获取API cluster URL与token
        • 获取Cluster URL地址
          • 创建k8s admin-token
            • 获取token值
            • 三、在python client主机上编写脚本
              • 创建目录结构
                • 编写python client脚本
                  • 获取的命名空间
                • 获取所有services
                  • 获取pod信息
                    • 获取pod日志
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档