容器云服务运维开发(15)
基于Kubernetes APIs与SDK,使用Python脚本,完成容器云服务运维任务
1.管理service资源(5分)
Kubernetes Python运维脚本开发,使用Restful APIs方式管理service服务。
使用已经部署完成的Kubernetes两节点云平台,在Master节点安装Python 3.7.3的运行环境与依赖库。
使用python request库和Kubernetes Restful APIs,在/root目录下,创建api_manager_service.py文件,要求编写python代码,代码实现以下任务:
①首先查询查询服务service,如果service名称“nginx-svc”已经存在,先删除。
②如果不存在“nginx-svc”,则使用service.yaml文件创建服务。
③创建完成后,查询该服务的信息,查询的body部分以json格式的文件输出到当前目录下的service_api_dev.json文件中。
④然后使用service_update.yaml更新服务端口。
⑤完成更新后,查询该服务的信息,信息通过控制台输出,并通过json格式追加到service_api_dev.json文件后。
# 上传k8s_Python_Packages解压
tar -zxf k8s_Python_Packages.tar.gz
# 解压python包
tar -zxf /root/Python_Packages/python-3.6.8.tar.gz
# 安装python
yum install -y /root/python-3.6.8/packages/*
# 验证是否安装成功
pip3 --version
# 进入Python_Packages
cd Python_Packages
# 安装依赖包
pip3 install pip-21.1.3-py3-none-any.whl
# 使用pip3命令安装开发环境依赖包
pip3 install --no-index --find-links=/root/Python_Packages/ -r /root/Python_Packages/requirements.txt
# 在Kubernetes中创建一个名为admin1的服务账号(ServiceAccount)在kube-system命名空间中
kubectl create serviceaccount admin1 -n kube-system
# 用于创建一个新的集群角色绑定,它将一个服务账号绑定到一个集群角色上
kubectl create clusterrolebinding admin1 --clusterrole=cluster-admin --serviceaccount=kube-system:admin1
# 获取账户token(用于替换api_server_token,做身份验证)
cat<<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: admin1
namespace: kube-system
annotations:
kubernetes.io/service-account.name: "admin1"
EOF
# 查看账户资源
kubectl describe secret admin1 -n kube-system
# 编写service.yaml
vi service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc3
namespace: default
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30083
type: NodePort
# 编写api_manager_service
vi api_manager_service.py
import requests,time
import logging
import os,yaml,json
#-----------logger-----------
#get logger
logger = logging.getLogger(__name__)
# level
logger.setLevel(logging.DEBUG)
# format
format = logging.Formatter('%(asctime)s %(message)s')
# to console
stream_handler = logging.StreamHandler()
stream_handler .setFormatter(format)
logger.addHandler(stream_handler )
#-----------logger-----------
def get_api_server_token(api_server_token, node_url):
# Bearer token
bearer_token = "bearer " + api_server_token
return bearer_token
class api_service_manager():
def __init__(self,node_url: str, bearer_token: str):
self.node_url = node_url
self.bearer_token = bearer_token
def create_svc(self, yamlFile, namespace: str):
headers = {
"Authorization": self.bearer_token,
"Content-Type": "application/json"
}
with open(yamlFile, encoding="utf8") as f:
body = json.dumps(yaml.safe_load(f))
request_url = self.node_url + "/api/v1/namespaces/" + namespace + "/services"
result = json.loads