ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • Python笔记

    • 基础知识

    • 类与面向对象

    • 并发编程

    • Web编程

    • 模块笔记

      • PyInstaller
      • Jieba
      • Kubernetes
        • 介绍
        • 客户端认证
          • 基于HTTPS证书认证
          • 基于HTTPToken认证
        • 常用资源操作接口
        • Namespace操作
        • Pod操作
        • Node操作
        • Deployment操作
    • 其他

  • C笔记

  • C++笔记

  • Arduino笔记

  • Dev
  • Python笔记
  • 模块笔记
Hoshinozora
2024-01-03
目录

Kubernetes

# 介绍

我们操作K8S资源API的方式一般有两种,一种是直接通过HTTP调用原生接口,一种是通过客户端库去调用API库。K8S提供多种语言的客户端库,其中就包括Python客户端库。

我们操作APIServer目前有两种认证方式:HTTPS证书认证、HTTPToken认证。

  • HTTPS证书认证:基于CA证书签名的数字证书认证(kubeconfig文件,默认路径~/.kube/config)。
  • HTTPToken认证:通过一个Token来识别用户(ServiceAccount)。

安装Kubernetes客户端库通过pip安装即可:pip install kubernetes -i https://pypi.tuna.tsinghua.edu.cn/simple

# 客户端认证

# 基于HTTPS证书认证

from kubernetes import client, config
import os

# 载入kubeconfig配置文件, 配置文件在(~/.kube/config)
config.load_kube_config("kube/config.yaml")

# 之后就可以开始通过接口类来操作K8S资源
1
2
3
4
5
6
7

# 基于HTTPToken认证

服务器上创建用户并获取Token:

# 创建用户
kubectl create serviceaccount api-admin -n kube-system

# 用户授权,绑定默认cluster-admin管理员集群角色
kubectl create clusterrolebinding api-admin --clusterrole=cluster-admin --serviceaccount=kube-system:api-admin

# 获取用户Token(1.24版本之前)
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/api-admin/{print $1}')

# 获取用户Token(1.24版本之后)
kubectl create token api-admin -n kube-system

# 获取APISERVER地址
kubectl config view | grep server
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Python代码:

from kubernetes import client

k8s_config = client.Configuration()
# APISERVER地址
k8s_config.host = "https://192.168.161.120:6443"
# 关闭SSL, 如果需要开启则需要指定CA证书
k8s_config.verify_ssl = False
# 指定K8S集群CA证书位置
# configuration.ssl_ca_cert = "./ca.crt"
# Token
TOKEN = "eyJhbGciOiJSUzI1NiIsImt..."
k8s_config.api_key = {"authorization": f"Bearer {TOKEN}"}
client.Configuration.set_default(k8s_config)

# 之后就可以开始通过接口类来操作K8S资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 常用资源操作接口

常用资源接口类实例化 资源
core_api = client.CoreV1Api() namespace,pod,service,pv,pvc
apps_api = client.AppsV1Api() deployment,statefulset,daemonset
networking_api = client.NetworkingV1beta1Api() ingress
storage_api = client.StorageV1Api() storage_class

# Namespace操作

# 查询

namespaces = core_api.list_namespace()
1

# 删除

# 指定命名空间名称即可。
core_api.delete_namespace(name=name)
1
2

# 创建

body = {
    "kind": "Namespace",
    "metadata": {
        "name": "test"
    }
}
core_api.create_namespace(body=body)
1
2
3
4
5
6
7

# Pod操作

# 查询

# 获取指定命名空间下的所有Pod, 可以通过".键名"方式取值。
pods = core_api.list_namespaced_pod(namespace="default")
1
2

# 删除

# 指定命名空间、Pod名称即可。
core_api.delete_namespaced_pod(namespace="default", name="nginx-pod")
1
2

# Node操作

# 查询

core_api.list_node_with_http_info()
1

# Deployment操作

# 查询

apps_api.list_namespaced_deployment(namespace)
1

# 创建

body = {
    'kind': 'Deployment',
    'metadata': {'name': 'my-app'},
    'spec': {
        'replicas': 3,
        'selector': {'matchLabels': {'app': 'my-app'}},
        'template': {
            'metadata': {'labels': {'app': 'my-app'}},
            'spec': {
                'containers': [{'image': 'nginx', 'name': 'web'}],
            },
        },
    }
}
res = apps_api.create_namespaced_deployment(namespace="default", body=body)
print("Created Deployment with name %s and namespace %s." % (res.metadata.name, res.metadata.namespace))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 删除

apps_api.delete_namespaced_deployment(namespace="命名空间", name="deploy名称")
1
#Python#模块#Kubernetes#SDK#容器编排
Jieba
类型提示

← Jieba 类型提示→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式