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
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
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
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
2
# 创建
body = {
"kind": "Namespace",
"metadata": {
"name": "test"
}
}
core_api.create_namespace(body=body)
1
2
3
4
5
6
7
2
3
4
5
6
7
# Pod操作
# 查询
# 获取指定命名空间下的所有Pod, 可以通过".键名"方式取值。
pods = core_api.list_namespaced_pod(namespace="default")
1
2
2
# 删除
# 指定命名空间、Pod名称即可。
core_api.delete_namespaced_pod(namespace="default", name="nginx-pod")
1
2
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 删除
apps_api.delete_namespaced_deployment(namespace="命名空间", name="deploy名称")
1