2022云计算技能大赛容器云开辟

打印 上一主题 下一主题

主题 523|帖子 523|积分 1569

仅供参考,学习测试使用
【使命 6】容器云运维开辟:Kubernetes APIs 运维开辟[10 分]

【标题 1】Python 运维开辟:基于 Kubernetes Restful API 实现 Deployment 创建[2 分]

在提供的OpenStack 私有云平台上,使用 k8s-python-dev 镜像创建 1 台云主机,云主机类型使用 4vCPU/12G 内存/100G 硬盘。该主机中已经默认安装了所需的开辟环境,登录默认账号暗码为“root/1DaoYun@2022”。
使用Kubernetes Restful API 库,在/root 目录下,创建 api_deployment_manager.py 文件, 要求编写 python 代码,代码实现以下使命:
(1)编写 Python 步伐实现 Deployment 资源的创建。Deployment 配置信息如下。如果同名Deployment 存在,先删除再创建。
(2)创建完成后,查询该Deployment 的详细信息,实行结果控制台输出,以yaml 格式展示。
创建Deployment 的yaml 的配置如下:
apiVersion: apps/v1 kind: Deployment metadata:
name: nginx-deployment labels:
app: nginx spec:
replicas: 3 selector:
matchLabels: app: nginx
template: metadata:
labels:
app: nginx spec:
containers:


  • name: nginx
    image: nginx:1.15.4 ports:
  • containerPort: 80

  1. from kubernetes import client, config
  2. # 加载 kubeconfig 配置文件
  3. config.load_kube_config()
  4. # 创建 Deployment 对象
  5. deployment = client.AppsV1Api().create_namespaced_deployment(
  6.     body={
  7.         "apiVersion": "apps/v1",
  8.         "kind": "Deployment",
  9.         "metadata": {
  10.             "name": "nginx-deployment",
  11.             "labels": {
  12.                 "app": "nginx"
  13.             }
  14.         },
  15.         "spec": {
  16.             "replicas": 3,
  17.             "selector": {
  18.                 "matchLabels": {
  19.                     "app": "nginx"
  20.                 }
  21.             },
  22.             "template": {
  23.                 "metadata": {
  24.                     "labels": {
  25.                         "app": "nginx"
  26.                     }
  27.                 },
  28.                 "spec": {
  29.                     "containers": [{
  30.                         "name": "nginx",
  31.                         "image": "nginx:1.15.4",
  32.                         "ports": [{
  33.                             "containerPort": 80
  34.                         }]
  35.                     }]
  36.                 }
  37.             }
  38.         }
  39.     },
  40.     namespace="default"
  41. )
  42. # 获取 Deployment 对象的详细信息
  43. deployment_info = client.AppsV1Api().read_namespaced_deployment(
  44.     name="nginx-deployment",
  45.     namespace="default"
  46. )
  47. # 将 Deployment 对象信息以 yaml 格式打印输出
  48. import yaml
  49. deployment_info_yaml = yaml.dump(
  50.     client.ApiClient().sanitize_for_serialization(deployment_info)
  51. )
  52. print(deployment_info_yaml)
复制代码
  首先通过 config.load_kube_config() 加载 kubeconfig 配置文件,然后使用 client.AppsV1Api().create_namespaced_deployment() 方法创建 Deployment 对象,并使用 client.AppsV1Api().read_namespaced_deployment() 方法获取该对象的详细信息。最后,使用 yaml.dump() 方法将 Deployment 对象信息以 yaml 格式输出到控制台。
  1.实行api_deployment_manager.py 脚本,成功创建 deployment 资源,计 1 分;
2.检查创建的 deployment 资源,配置信息无误计 1 分。
【标题 2】Python 运维开辟:基于 Kubernetes Python SDK 实现 Job 创建[1 分]

在前面已建好的 Kubernetes 开辟环境云平台上。使用 Kubernetes python SDK 的“kubernetes”Python 库,在/root 目录下,创建 sdk_job_manager.py 文件,要求编写 python 代码,代码实现以下使命:
(1)编写 Python 步伐实现 Job 资源的创建。Job 配置信息如下。如果同名 Job 存在, 先删除再创建。
(2)创建完成后,查询该 Job 的详细信息,实行结果控制台输出,以 json 格式展示。
Job 创建 yaml 的信息如下:
apiVersion: batch/v1 kind: Job
metadata: name: pi
spec:
template: spec:
containers:


  • name: pi image: perl
    command: [“perl”, “-Mbignum=bpi”, “-wle”, “print bpi(2000)”] restartPolicy: Never
    backoffLimit: 4
  1. from kubernetes import client, config
  2. # 加载Kubernetes配置
  3. config.load_kube_config()
  4. # 创建Kubernetes API客户端对象
  5. api_client = client.BatchV1Api()
  6. # 定义Job资源的元数据信息
  7. metadata = client.V1ObjectMeta(name="pi")
  8. # 定义Job的Pod模板
  9. pod_template = client.V1PodTemplateSpec(
  10.     spec=client.V1PodSpec(
  11.         restart_policy="Never",
  12.         containers=[
  13.             client.V1Container(
  14.                 name="pi",
  15.                 image="perl",
  16.                 command=["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
  17.             )
  18.         ]
  19.     )
  20. )
  21. # 定义Job的规格
  22. job_spec = client.V1JobSpec(
  23.     template=pod_template,
  24.     backoff_limit=4
  25. )
  26. # 创建Job资源
  27. try:
  28.     api_client.delete_namespaced_job(name="pi", namespace="default")
  29. except:
  30.     pass
  31. api_response = api_client.create_namespaced_job(
  32.     body=client.V1Job(
  33.         api_version="batch/v1",
  34.         kind="Job",
  35.         metadata=metadata,
  36.         spec=job_spec
  37.     ),
  38.     namespace="default"
  39. )
  40. print("Job created. status='%s'" % str(api_response.status))
  41. # 查询Job的详细信息
  42. api_response = api_client.read_namespaced_job(name="pi", namespace="default")
  43. print("Job details:")
  44. print(api_response.to_json())
复制代码
1.实行 sdk_job_manager.py 脚本,成功创建job 资源,计 0.5 分;
2.查询 job 资源,配置信息无误,计 0.5 分。
【标题 3】Python 运维开辟:Pod 资源的 Restful APIs HTTP 服务封装[3 分]

编写 Python 步伐实现Pod 资源管理步伐,将 Pod 资源管理的封装成Web 服务。
在/root 目录下创建pod_server.py 步伐,实现Pod 的增删查改等Web 访问操纵。http.server 的 host 为 localhost,端口 8889;步伐内部实现Kubernetes 认证。
提示阐明:Python 标准库http.server 模块,提供了HTTP Server 请求封装。须要实现的 Restful API 接口如下:
GET /pod/{name} ,查询指定名称{name}的 Pod;Response 的 Body 以 json 格式输出。
POST /pod/{yamlfilename} 创建 yaml 文件名称为{yamlfilename}的 Pod;Response 的
Body 以 json 格式。
编码完成后,“手工下载”文件服务器主目录所有*.yaml 文件到 root 目录下,“手动实行”所编写pod_server.py 步伐,提交答案进行检测。
  1. import http.server
  2. import json
  3. import os
  4. import ssl
  5. import subprocess
  6. import urllib.parse
  7. from kubernetes import client, config
  8. from kubernetes.client.rest import ApiException
  9. class PodServer(http.server.BaseHTTPRequestHandler):
  10.     def do_GET(self):
  11.         parsed_path = urllib.parse.urlparse(self.path)
  12.         path = parsed_path.path.split('/')
  13.         if path[1] == 'pod':
  14.             name = path[2]
  15.             try:
  16.                 config.load_kube_config()
  17.                 api_instance = client.CoreV1Api()
  18.                 api_response = api_instance.read_namespaced_pod(name, 'default')
  19.                 response = {'name': api_response.metadata.name,
  20.                             'status': api_response.status.phase,
  21.                             'host_ip': api_response.status.host_ip,
  22.                             'pod_ip': api_response.status.pod_ip}
  23.                 self.send_response(200)
  24.                 self.send_header('Content-type', 'application/json')
  25.                 self.end_headers()
  26.                 self.wfile.write(json.dumps(response).encode())
  27.             except ApiException as e:
  28.                 self.send_error(404, message=str(e))
  29.         else:
  30.             self.send_error(404)
  31.     def do_POST(self):
  32.         parsed_path = urllib.parse.urlparse(self.path)
  33.         path = parsed_path.path.split('/')
  34.         if path[1] == 'pod':
  35.             yaml_filename = path[2]
  36.             try:
  37.                 config.load_kube_config()
  38.                 with open(yaml_filename, 'r') as f:
  39.                     pod_yaml = f.read()
  40.                 api_instance = client.CoreV1Api()
  41.                 api_response = api_instance.create_namespaced_pod(body=pod_yaml, namespace='default')
  42.                 response = {'name': api_response.metadata.name,
  43.                             'status': api_response.status.phase,
  44.                             'host_ip':
复制代码
保存为pod_server.py文件并运行
1.HTTP 服务成功启动,计 1 分;
2.发起指定参数的GET 查询 Pod 请求,成功查询指定名称的 pod 服务,计 1 分;
3.发起指定参数的 POST 创建 Pod 请求,成功创建 Pod 服务,计 1 分。
【标题 4】Python 运维开辟:Service 资源 Restful APIs HTTP 服务封装[4 分]

编写 Python 步伐实现 Service 资源管理步伐,将 Service 资源管理的封装成 Web 服务。在/root 目录下创建 service_server.py 步伐,实现 Service 的增删查改等 Web 访问操纵。
http.server 的 host 为 localhost,端口 8888;步伐内部实现Kubernetes 认证。
提示阐明:Python 标准库http.server 模块,提供了HTTP Server 请求封装。须要实现的 Restful API 接口如下:
GET /services/{name},查询指定名称{name}的 Service;Response 的 Body 以 json 格式输出。
POST /services/{yamlfilename} 创建yaml 文件名称为{yamlfilename}的 Service; Response 的Body 以 json 格式,(手工将文件服务器主目录所有*.yaml 文件下载到 root 目录下)。
DELETE /services/{name};删除指定名称的 Service;Response 的 Body 以 json 格式。编码完成后,自己手动实行提供 Web HTTP 服务的 service_server.py 步伐,提交答案进
行检测。
  1. import http.server
  2. import json
  3. import os
  4. import subprocess
  5. class ServiceHandler(http.server.BaseHTTPRequestHandler):
  6.     def do_GET(self):
  7.         if self.path.startswith('/services/'):
  8.             service_name = self.path.split('/')[-1]
  9.             service_info = self.get_service_info(service_name)
  10.             if service_info is not None:
  11.                 self.send_response(200)
  12.                 self.send_header('Content-type', 'application/json')
  13.                 self.end_headers()
  14.                 self.wfile.write(json.dumps(service_info).encode())
  15.             else:
  16.                 self.send_response(404)
  17.                 self.send_header('Content-type', 'text/plain')
  18.                 self.end_headers()
  19.                 self.wfile.write(b'Service not found')
  20.     def do_POST(self):
  21.         if self.path.startswith('/services/'):
  22.             yaml_file_name = self.path.split('/')[-1]
  23.             yaml_file_path = os.path.join('/root', yaml_file_name)
  24.             if not os.path.isfile(yaml_file_path):
  25.                 self.send_response(404)
  26.                 self.send_header('Content-type', 'text/plain')
  27.                 self.end_headers()
  28.                 self.wfile.write(b'YAML file not found')
  29.                 return
  30.             service_name = self.create_service_from_yaml(yaml_file_path)
  31.             service_info = self.get_service_info(service_name)
  32.             if service_info is not None:
  33.                 self.send_response(200)
  34.                 self.send_header('Content-type', 'application/json')
  35.                 self.end_headers()
  36.                 self.wfile.write(json.dumps(service_info).encode())
  37.             else:
  38.                 self.send_response(500)
  39.                 self.send_header('Content-type', 'text/plain')
  40.                 self.end_headers()
  41.                 self.wfile.write(b'Failed to create service')
  42.     def do_DELETE(self):
  43.         if self.path.startswith('/services/'):
  44.             service_name = self.path.split('/')[-1]
  45.             result = self.delete_service(service_name)
  46.             if result:
  47.                 self.send_response(200)
  48.                 self.send_header('Content-type', 'application/json')
  49.                 self.end_headers()
  50.                 self.wfile.write(json.dumps({'result': 'success'}).encode())
  51.             else:
  52.                 self.send_response(404)
  53.                 self.send_header('Content-type', 'text/plain')
  54.                 self.end_headers()
  55.                 self.wfile.write(b'Service not found')
  56.     def get_service_info(self, service_name):
  57.         command = ['kubectl', 'get', 'service', service_name, '-o', 'json']
  58.         output = self.run_command(command)
  59.         if output is None:
  60.             return None
  61.         service_info = json.loads(output)['metadata']
  62.         return {
  63.             'name': service_info['name'],
  64.             'namespace': service_info['namespace'],
  65.             'creationTimestamp': service_info['creationTimestamp'],
  66.             'labels': service_info['labels'],
  67.         }
  68.     def create_service_from_yaml(self, yaml_file_path):
  69.         command = ['kubectl', 'apply', '-f', yaml_file_path]
  70.         output = self.run_command(command)
  71.         if output is None:
  72.             return None
  73.         service_name = output.strip().split(' ')[-1]
  74.         return service_name
  75.     def delete_service(self, service_name):
  76.         command = ['kubectl', 'delete', 'service', service_name]
  77.         output = self.run_command(command)
  78.         return output is not None
  79.     def run_command(self, command):
  80.         try:
  81.             output = subprocess.check_output(command, stderr=subprocess.STDOUT)
  82.             return output.decode()
  83.         except subprocess.CalledProcessError as e:
  84.             print(e.output.decode())
  85.             return None
  86. if __name__ == '__main__':
  87.     server_address = ('localhost', 8888)
  88.     httpd = http.server.HTTPServer(server_address, ServiceHandler)
  89.     httpd.socket = ssl.wrap_socket(httpd
复制代码
1.HTTP 服务成功启动,计 1 分;
2.发起指定参数的 POST 创建 service 请求,成功创建 service 资源,计 1 分;
3.发起指定参数的GET 查询 service 请求,成功查询指定名称的 Service,计 1 分;
4.发起指定参数的DELETE 删除 service 请求,成功删除指定名称的 Service,计 1 分

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表