【任务 1】容器云平台搭建[5 分]

在这里插入图片描述

【题目 1】平台部署–部署容器云平台[1.5 分]

登录OpenStack 私有云平台,使用 CentOS7.9 镜像创建两台云主机,使用 kubeeasy 工具完成Kubernetes 1.22.1 集群的搭建。然后使用 nginx 镜像在 default 命名空间下创建一个名为exam 的Pod,并为该 Pod 设置环境变量 exam,其值为 2022。
完成后提交 master 节点的用户名、密码和 IP 到答题框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

#两台节点,将提供的安装包 chinaskills_cloud_paas_v2.0.2.iso 上传至 master 节点/root 目录,并解压 到/opt 目录


[root@localhost ~]# mount -o loop chinaskills_cloud_paas_v2.0.2.iso /mnt/
[root@localhost ~]# cp -rfv /mnt/* /opt/
[root@localhost ~]# umount /mnt/


#安装 kubeeasy已经依赖
[root@localhost ~]# mv /opt/kubeeasy /usr/bin/kubeeasy
[root@localhost ~]# kubeeasy install depend \ --host 10.24.2.10,10.24.2.11 \ --user root \ --password 000000 \ --offline-file /opt/dependencies/base-rpms.tar.gz

--host:所有主机节点 IP,如:10.24.1.2-10.24.1.10,中间用“-”隔开,表示 10.24.1.210.24.1.10 范围内的所有 IP。若 IP 地址不连续,则列出所有节点 IP,用逗号隔开,如: 10.24.1.2,10.24.1.7,10.24.1.9
--user:主机登录用户,默认为 root。
--password:主机登录密码,所有节点需保持密码一致。
--offline-file:离线安装包路径。

#配置 SSH 免密钥
[root@localhost ~]# kubeeasy create ssh-keygen \ --master 10.24.2.10 \ --worker 10.24.2.11 \ --user root --password 000000


#部署 Kubernetes 集群
[root@localhost ~]# kubeeasy install kubernetes \ --master 10.24.2.10 \ --worker 10.24.2.11 \ --user root \ --password 000000 \ --version 1.22.1 \ --offline-file /opt/kubernetes.tar.gz

#查看集群信息
[root@k8s-master-node1 ~]# kubectl cluster-info
Kubernetes control plane is running at https://apiserver.cluster.local:6443 CoreDNS is running at https://apiserver.cluster.local:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

# 参数解释
--master:Master 节点 IP。
--worker:Node 节点 IP,如有多个 Node 节点用逗号隔开。
--version:Kubernetes 版本,此处只能为 1.22.1

1.Kubernetes 集群部署成功得 1 分;
2.Pod 创建成功且环境变量设置正确得 0.5 分。

【题目 2】平台部署–部署 Istio 服务网格[0.5 分]

1.Kubernetes 集群部署成功得 1 分;
2.Pod 创建成功且环境变量设置正确得 0.5 分。

在 Kubernetes 集群上完成 Istio 服务网格环境的安装,然后新建命名空间 exam,为该命名空间开启自动注入 Sidecar。
完成后提交 master 节点的用户名、密码和 IP 到答题框。

1
2
3
4
5
6
7
[root@k8s-master-node1 ~]# kubeeasy add --istio istio

#https://blog.csdn.net/shida_csdn/article/details/90713235

[root@k8s-master-node1 ~]# kubectl create ns exam
[root@k8s-master-node1 ~]# kubectl label namespace exam istio-injection=enabled

1.Istio 所有组件运行成功得 0.3 分;
2.命名空间 exam 自动注入成功得 0.2 分。

【题目 3】平台部署–部署 KubeVirt 虚拟化[1 分]

在 Kubernetes 集群上完成KubeVirt 虚拟化环境的安装。完成后提交 master 节点的用户名、密码和 IP 到答题框。

1
[root@k8s-master-node1 ~]# kubeeasy add --virt kubevirt

1.KubeVirt 所有组件运行成功得 1 分。

【题目 4】平台部署–部署 Harbor 仓库及Helm 包管理工具[1 分]

在 master 节点上完成Harbor 镜像仓库及Helm 包管理工具的部署。然后使用 nginx 镜像自定义一个 Chart,Deployment 名称为 nginx,副本数为 1,然后将该 Chart 部署到 default 命名空间下,Release 名称为 web。
完成后提交 master 节点的用户名、密码和 IP 到答题框。

1
[root@k8s-master-node1 ~]# kubeeasy add --registry harbor

1.Harbor 仓库部署成功得 0.5 分;
2.Helm 工具安装成功得 0.2 分;
3.Chart 包部署成功得 0.3 分。

【题目 5】集群管理–备份 ETCD 数据[1 分]

Kubernetes 使用 ETCD 来存储集群的实时运行数据,为防止服务器宕机导致 Kubernetes集群数据丢失,请将Kubernetes 集群数据备份到/root/etcd.db 中。完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

1
https://blog.csdn.net/lihongbao80/article/details/126508726

1.etcdctl 工具安装成功得 0.2 分;
2.ETCD 数据备份成功得 0.8 分。

【任务 2】容器云应用部署:Docker Compose 编排部署[7.0 分]

Hyperf 是一个高性能、高灵活性的渐进式 PHP 协程框架,内置协程服务器及大量常用的组件,性能较传统基于 PHP-FPM 的框架有质的提升,提供超高性能的同时,也保持着极其灵活的可扩展性。请根据要求完成数据库服务 MariaDB、缓存服务 Redis、微服务 Hyperf 及前端服务Nginx 按照要求进行容器化。

【题目 1】容器化 MariaDB 服务[1 分]

编写Dockerfile 文件构建hyperf-mariadb:v1.0 镜像,具体要求如下:(需要用到的软件包:
Hyperf.tar.gz)

(1)基础镜像:centos:7.9.2009;
(2)完成 MariaDB 服务的安装;
(3)声明端口:3306;
(4)设置数据库 root 用户的密码为root;
(5)将提供的数据库文件 hyperf_admin.sql 导入数据库;
(6)设置服务开机自启。
完成后构建镜像,并提交master 节点的用户名、密码和 IP 地址到答题框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
没有具体的软件包,同理的代替一下


#mysql初始化自启动脚本
[root@k8s-worker-node1 Pig]# cat mysql_init.sh
#!/bin/bash
mysql_install_db --user=root
mysqld_safe --user=root &
sleep 8
mysqladmin -u root password 'root'
mysql -uroot -proot -e "grant all on *.* to 'root'@'%' identified by 'root'; flush privileges;"
mysql -uroot -proot -e " source /opt/pig.sql;source /opt/pig_codegen.sql;source /opt/pig_config.sql; source /opt/pig_job.sql;"

#本地yum源
[root@k8s-worker-node1 Pig]# cat local.repo
[pig]
name=pig
baseurl=file:///root/yum
gpgcheck=0
enabled=1


[root@k8s-worker-node1 Pig]# cat Dockerfile-mariadb
FROM centos:centos7.9.2009
MAINTAINER Chinaskills
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
ENV LC_ALL en_US.UTF-8
RUN yum -y install mariadb-server
COPY mysql /opt/
COPY mysql_init.sh /opt/
RUN bash /opt/mysql_init.sh
EXPOSE 3306
CMD ["mysqld_safe","--user=root"]

[root@k8s-worker-node1 Pig]# docker build -t hyperf-mariadb:v1.0 -f Dockerfile-mariadb .

1.镜像构建成功得 0.5 分;
2.数据库安装且导入数据成功得 0.5 分。

【题目 2】容器化Redis 服务[1 分]

编写 Dockerfile 文件构建 hyperf-redis:v1.0 镜像,具体要求如下:(需要用到的软件包:
Hyperf.tar.gz)
(1)基础镜像:centos:7.9.2009;
(2)安装Redis 服务;
(3)关闭保护模式;
(4)声明端口:6379;
(5)设置服务开机自启。
完成后构建镜像,并提交master 节点的用户名、密码和 IP 地址到答题框。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@k8s-worker-node1 Pig]# cat Dockerfile-redis
FROM centos:centos7.9.2009
MAINTAINER Chinaskills
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum -y install redis
RUN sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis.conf && \
sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis.conf
EXPOSE 6379
CMD ["/usr/bin/redis-server","/etc/redis.conf"]

[root@k8s-worker-node1 Pig]# docker build -t hyperf-redis:v1.0 -f Dockerfile-redis .

1.镜像构建成功的 0.5 分;
2.Redis 服务安装成功且配置正确得 0.5 分。

【题目 3】容器化Nginx 服务[0.5 分]

编写 Dockerfile 文件构建hyperf-nginx:v1.0 镜像,具体要求如下:(需要用到的软件包:
Hyperf.tar.gz)
(1)基础镜像:centos:7.9.2009;
(2)安装nginx 服务;
(3)声明端口:80;
(4)设置服务开机自启。
完成后构建镜像,并提交master 节点的用户名、密码和 IP 地址到答题框。

1
2
3
4
5
6
7
8
9
10
11
[root@k8s-worker-node1 Pig]# cat Dockerfile-nginx
FROM centos:centos7.9.2009
MAINTAINER Chinaskills
RUN rm -rf /etc/yum.repos.d/*
COPY local.repo /etc/yum.repos.d/
COPY yum /root/yum
RUN yum -y install nginx
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

[root@k8s-worker-node1 Pig]# docker build -t hyperf-nginx:v1.0 -f Dockerfile-nginx .

1.镜像构建成功得 0.3 分;
2.Nginx 安装成功且配置正确得 0.2 分。

【题目 4】容器化Hyperf 服务[1 分]

编写Dockerfile 文件构建hyperf-service:v1.0 镜像,具体要求如下:(需要用到的软件包:
Hyperf.tar.gz)
(1)基础镜像:centos:7.9.2009;
(2)安装 PHP 及扩展;
(3)使用源码编译安装Swoole。
完成后构建镜像,并提交master 节点的用户名、密码和 IP 地址到答题框。

1
在这里插入代码片

1.镜像构建成功得 0.5 分;
2.PHP 安装成功得 0.2 分;
3.Swoole 安装成功得 0.3 分。

【题目 5】编排部署Hyperf 框架[3.5 分]

编写/root/hyperf/project/docker-compose.yaml 文件,具体要求如下:
(1)容器 1 名称:hyperf-mysql;镜像:hyperf-mariadb:v1.0;端口映射:3306:3306;
(2)容器 2 名称:hyperf-redis;镜像:hyperf-redis:v1.0;
(3)容器 3 名称:hyperf-ui;镜像:hyperf-nginx:v1.0;端口映射:80:8081;
(4)容器 4 名称:hyperf-service;镜像:hyperf-service:v1.0。
完成后编排部署Hyperf 框架,并提交master 节点的用户名、密码和 IP 地址到答题框。

1
在这里插入代码片

.docker-compose.yaml 文件编排成功得 1.5 分;
2.8081 端口访问服务成功得 1 分;
3.Hyperf-service 连接数据库和Redis 成功得 1 分。

【任务 3】容器云应用部署:基于 Kubernetes 构建 CICD[8.0 分]

该公司决定采用Kubernetes + GitLab CI 来构建 CICD 环境,以缩短新功能开发上线周期,及时满足客户的需求,实现 DevOps 的部分流程,来减轻部署运维的负担,实现可视化容器生命周期管理、应用发布和版本迭代更新,请完成GitLab CI + Kubernetes 的 CICD 环境部署(构建持续集成所需要的所有软件包在软件包 CICD-Runner.tar.gz 中)。CICD 应用系统架构如下:

【题目 1】安装GitLab 环境[1 分]

在Kubernetes 集群中新建命名空间gitlab-ci,将GitLab 部署到该命名空间下,Deployment和 Service 名称均为gitlab,以 NodePort 方式将 80 端口对外暴露为 30880,设置 GitLab 服务root 用户的密码为 admin@123,将项目包 demo-2048.tar.gz 导入到 GitLab 中并命名为demo-2048。
完成后提交 master 节点的用户名、密码和 IP 地址到答题框。(需要用到的软件包路径
CICD-Runner.tar.gz)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
[root@k8s-master-node1 ~]# kubectl create ns gitlab-ci
[root@k8s-master-node1 ~]# vi gitlab.yaml
apiVersion: v1
kind: Service
metadata:
name: gitlab
labels:
app: gitlab
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30888
selector:
app: gitlab

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitlab
labels:
app: gitlab
spec:
selector:
matchLabels:
app: gitlab
template:
metadata:
labels:
app: gitlab
spec:
serviceAccountName: gitlab-admin
containers:
- name: gitlab
image: gitlab/gitlab-ce:latest
imagePullPolicy: IfNotPresent
securityContext:
runAsUser: 0
privileged: true
env:
- name: GITLAB_ROOT_PASSWORD
value: admin@123
ports:
- name: http
containerPort: 80
volumeMounts:
- mountPath: /etc/gitlab
name: gitlabhome
- mountPath: /var/log/gitlab
name: loghome
- mountPath: /var/opt/gitlab
name: opthome
volumes:
- name: gitlabhome
hostPath:
path: /svc/gitlab/config
- name: loghome
hostPath:
path: /svc/gitlab/gitlab/logs
- name: opthome
hostPath:
path: /svc/gitlab/gitlab/data

---
apiVersion: v1
kind: ServiceAccount
metadata:
name: gitlab-admin
labels:
name: gitlab
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: gitlab-admin
labels:
name: gitlab
subjects:
- kind: ServiceAccount
name: gitlab-admin
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io

1.GitLab 部署正确且能正常访问得 0.5 分;
2.项目导入成功得 0.5 分。

【题目 2】部署GitLab Runner[2 分]

将 GitLab Runner 部署到 gitlab-ci 命名空间下,Release 名称为 gitlab-runner,为 GitLab Runner 创建持久化构建缓存目录/home/gitlab-runner/ci-build-cache 以加速构建速度,并将其注册到 GitLab 中。完成后提交 master 节点的用户名、密码和 IP 地址到答题框。(需要用到的软件包路径
CICD-Runner.tar.gz)

1
参考链接;https://www.qikqiak.com/post/gitlab-runner-install-on-k8s/

1.GitLab Runner 部署成功得 0.5 分;
2.GitLab Runner 注册成功得 0.5 分;
3.GitLab Runner 持久化配置成功得 1 分。

【题目 3】配置GitLab[1.5 分]

将 Kubernetes 集群添加到 demo-2048 项目中,并命名为 kubernetes-agent,项目命名空间选择 gitlab-ci。完成后提交 master 节点的用户名、密码和 IP 地址到答题框。(需要用到的软件包路径CICD-Runner.tar.gz)

1.GitLab Agent 安装成功得 1 分;
2.Kubernetes 连接成功得 0.5 分。

【题目 4】构建CICD[3.5 分]

编写流水线脚本.gitlab-ci.yml 触发自动构建,具体要求如下:
(1)基于镜像 maven:3.6-jdk-8 构建项目的drone 分支;
(2)构建镜像的名称:demo:latest;
(3)将镜像推送到Harbor 仓库 demo 项目中;
(4)将 demo-2048 应用自动发布到Kubernetes 集群 gitlab-ci 命名空间下。
完成后提交 master 节点的用户名、密码和 IP 地址到答题框。(需要用到的软件包路径
CICD-Runner.tar.gz)

1.项目变异成功得 0.5 分;
2.镜像构建成功得 1 分;
3.服务发布成功得 1 分;
4.服务能正常访问得 1 分。

【任务 4】容器云服务运维:Kubernetes 基于容器的运维[6 分]

【题目 1】Pod 管理–创建 Pod[0.5 分]

在 default 命名空间下使用nginx:latest 镜像创建一个QoS 类为 Guaranteed 的 Pod,名称为 qos-demo。完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
name: qos-demo
namespace: default
spec:
containers:
- name: qos-demo
image: nginx:latest
imagePullPolicy: IfNotPresent
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"

1.Pod 创建成功得 0.2 分;
2.Pod QoS 类型为Guaranteed 得 0.3 分。

【题目 2】安全管理–配置 Pod 安全上下文[0.5 分]

使用 busybox 镜像启动一个名为 context-demo 的 Pod,为该 Pod 配置安全上下文,要求容器内以用户 1000 和用户组 3000 来运行所有进程,并在启动时执行“sleep 1h”命令。
完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
name: context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
containers:
- name: context-demo
image: busybox:latest
imagePullPolicy: IfNotPresent
command: [ "sh", "-c", "sleep 1h" ]
securityContext:
allowPrivilegeEscalation: false

1.Pod 安全上下午配置正确得 0.5 分。

【题目 3】CRD 管理–创建自定义资源类型[0.5 分]

在 Kubernetes 集群中自定义一种资源类型 Student,API 为 stable.example.com/v1,单数形式为 student,复数形式为 students,简写为 stu,作用域为命名空间级,然后在 default 命名空间下创建一个名为 exam 的 Student 对象。完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

1

1.资源类型 Student 定义成功的 0.3 分;
2.exam 创建成功得 0.2 分。

【题目 4】解析管理–添加主机别名到 Pod[0.5 分]

使用 nginx 镜像在 default 命名空间下创建一个名为 nginx 的 Pod,并在 Pod 的/etc/hosts 中添加 IP 地址 127.0.0.1 与 chinaskills 的解析。
完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
restartPolicy: Never
hostAliases:
- ip: "127.0.0.1"
hostnames:
- "chinaskills"
containers:
- name: ngnix
image: nginx:latest
imagePullPolicy: IfNotPresent
command:
- cat
args:
- "/etc/hosts"

1.自定义解析配置正确得 0.5 分。

【题目 5】HPA 管理–创建 HPA 规则[1 分]

默认情况下 HPA 是无法调整伸缩灵敏度的,但不同的业务场景对伸缩灵敏度的要求不一样。要求在 default 命名空间下使用 nginx 镜像创建一个名为 web 的 deployment,自定义HPA 的伸缩灵敏度,为该deployment 创建一个名为web 的HPA,扩容时立即新增当前 9 倍数量的副本数,时间窗口为 5s,伸缩范围为 1–1000。例如一开始只有 1 个 Pod,当 CPU 使用率超过 80%时,Pod 数量变化趋势为:1 → 10 → 100 → 1000。
完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
apiVersion: apps/v1
kind: Deployment
metadata:
name: hap-nginx-deploy
namespace: default
labels:
app: nginx-demo
spec:
replicas: 1
revisionHistoryLimit: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: web
image: nginx
ports:
- containerPort: 80

# 然后创建Deployment:
$ kubectl create -f hpa-deploy-demo.yaml

# 现在我们来创建一个HPA,可以使用kubectl autoscale命令来创建:
$ kubectl autoscale deployment hpa-nginx-deploy --cpu-percent=80 --min=1 --max=100
deployment "hpa-nginx-deploy" autoscaled
···
$ kubectl get hpa
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
hpa-nginx-deploy Deployment/hpa-nginx-deploy 10% 0% 1 10 13s
#此命令创建了一个关联资源 hpa-nginx-deploy 的HPA,最小的 pod 副本数为1,最大为100。HPA会根据设定的 cpu使用率(80%)动态的增加或者减少pod数量。

#参考https://www.bookstack.cn/read/rancher-2.4.4-zh/2cf7e056a6f83ec4.md

1.HPA 创建成功得 0.2 分;
2.HPA 伸缩策略配置正确得 0.8 分。

【题目 6】节点亲和性管理–创建硬限制规则的 Pod[0.5 分]

在 default 命名空间下使用 nginx 镜像运行一个 Pod, 名称为 nginx, 要求使用requiredDuringSchedulingIgnoredDuringExecution 策略将 Pod 调度到具有“disktype=ssd”标签的节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
kubectl label node k8s-worker-node1 disktype=ssd

apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #硬性要求,最好放在节点包含disktype=ssd节点上
- weight: 1
preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd

完成后提交 master 节点的用户名、密码和 IP 到答题框。
1.Pod 调度策略配置正确得 0.5 分。

【题目 7】网络策略管理–创建 Pod 网络策略[0.5 分]

创建一个网络策略 network-exam,要求只有 internal 命名空间下的 Pod 可以通过 TCP
协议的 8080 端口访问到 mysql 命名空间下的Pod。
完成后提交 master 节点的 IP、用户名和密码到答题框。

1.网络策略创建成功得 0.2 分;
2.规则配置正确得 0.3 分。

【题目 8】驱逐机制管理–配置节点压力驱逐[0.5 分]

设置kubelet 数据存储在/apps/data/kubelet 目录下,并设置当kubelet 的存储空间不足5%, 或者当容器运行时文件系统可用存储空间不足 5%时开始驱逐 Pod。

完成后提交 master 节点的 IP 地址、用户名和密码到答题框。
1.节点压力驱逐配置正确得 0.5 分。

【题目 9】流量管理–创建 Ingress Gateway[0.5 分]

使用提供的软件包 ServiceMesh.tar.gz 将Bookinfo 应用部署到 default 命名空间下,使用Istio Gateway 可以实现应用程序从外部访问, 请为 Bookinfo 应用创建一个名为bookinfo-gateway 的网关,指定所有 HTTP 流量通过 80 端口流入网格,然后将网关绑定到虚拟服务 bookinfo 上。
完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

(2)部署应用程序
解压软件包并导入镜像:

1
2
3
[root@k8s-master-node1 ~]# tar -zxf ServiceMesh.tar.gz
[root@k8s-master-node1 ~]# cd ServiceMesh/
[root@k8s-master-node1 ServiceMesh]# docker load -i images/image.tar

部署应用到Kubernetes集群:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

Gateway配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@k8s-master-node1 ServiceMesh]# cat bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080

确认网关创建完成:

1
2
3
4
5
6
7
[root@k8s-master-node1 ServiceMesh]# kubectl apply -f bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

[root@k8s-master-node1 ServiceMesh]# kubectl get gateway
NAME AGE
bookinfo-gateway 32s

1.Bookinfo 应用部署成功得 0.2 分;
2.Bookinfo 能通过网关访问得 0.3 分。

【题目 10】服务网格–创建基于用户身份的路由[0.5 分]

创建一个名为 reviews 路由,要求来自名为 Jason 的用户的所有流量将被路由到服务
reviews:v2。完成后提交 master 节点的用户名、密码和 IP 到答题框。
使用Curl工具向Bookinfo应用发送请求产生模拟流量。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@k8s-master-node1 ServiceMesh]# cat curl.sh
#!/bin/bash
while true
do
curl http://10.24.2.5:22092/productpage >/dev/null 2>&1
sleep 1
done

[root@k8s-master-node1 ServiceMesh]# chmod +x curl.sh
[root@k8s-master-node1 ServiceMesh]# bash curl.sh &
[1] 2924

#注意对应地址

编写目标规则配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[root@k8s-master-node1 ServiceMesh]# cat destination-rule-all.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: productpage
spec:
host: productpage
subsets:
- name: v1
labels:
version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: ratings
spec:
host: ratings
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v2-mysql
labels:
version: v2-mysql
- name: v2-mysql-vm
labels:
version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: details
spec:
host: details
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2

创建默认目标规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@k8s-master-node1 ServiceMesh]# kubectl apply -f destination-rule-all.yaml
[root@k8s-master-node1 ServiceMesh]# kubectl get destinationrule
NAME HOST AGE
details details 21s
productpage productpage 21s
ratings ratings 21s
reviews reviews 21s

#重新部署productpage微服务,启用Istio:
[root@k8s-master-node1 ServiceMesh]# cat bookinfo/bookinfo.yaml | istioctl kube-inject -f - | kubectl apply -l app=productpage -f -
service/productpage unchanged
deployment.apps/productpage-v1 configured

#所有服务启用Istio:
[root@k8s-master-node1 ServiceMesh]# cat bookinfo/bookinfo.yaml | istioctl kube-inject -f - | kubectl apply -l app!=productpage -f -

#部署v2版本的reviews微服务并开启Istio:
[root@k8s-master-node1 ServiceMesh]# cat bookinfo/reviews-v2.yaml | istioctl kube-inject -f - | kubectl apply -f -
[root@k8s-master-node1 ServiceMesh]# cat bookinfo/reviews-v3.yaml | istioctl kube-inject -f - | kubectl apply -f -

请求路由

1
2
3
[root@k8s-master-node1 ServiceMesh]# kubectl autoscale deployment reviews-v1 --cpu-percent=50 --min=1 --max=10
[root@k8s-master-node1 ServiceMesh]# kubectl autoscale deployment reviews-v2 --cpu-percent=50 --min=1 --max=10
[root@k8s-master-node1 ServiceMesh]# kubectl autoscale deployment reviews-v3 --cpu-percent=50 --min=1 --max=10

默认请求路由配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
[root@k8s-master-node1 ServiceMesh]# cat virtual-service-all-v1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: details
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1

配置默认请求路由:

1
2
3
4
5
[root@k8s-master-node1 ServiceMesh]# kubectl apply -f virtual-service-all-v1.yaml
virtualservice.networking.istio.io/productpage created
virtualservice.networking.istio.io/reviews created
virtualservice.networking.istio.io/ratings created
virtualservice.networking.istio.io/details created

1.路由创建成功得 0.2 分;
2.用户限制正确得 0.3 分。

【题目 11】服务网格–创建请求路由[0.5 分]

在default 命名空间下创建一个名为reviews-route 的虚拟服务,默认情况下,所有的HTTP
流量都会被路由到标签为 version:v1 的 reviews 服务的 Pod 上。此外,路径以/wpcatalog/或
/consumercatalog/开头的HTTP 请求将被重写为/newcatalog,并被发送到标签为 version:v2 的
Pod 上。完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

使用下面的命令把50%的流量从reviews:v1转移到reviews:v3(金丝雀版本):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@k8s-master-node1 ServiceMesh]# cat virtual-service-reviews-50-50.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 50
- destination:
host: reviews
subset: v3
weight: 50
[root@k8s-master-node1 ServiceMesh]# kubectl apply -f virtual-service-reviews-50-50.yaml
virtualservice.networking.istio.io/reviews configured

假如认为reviews:v3微服务已经稳定,可以通过应用Virtual Service规则将100%的流量路由reviews:v3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@k8s-master-node1 ServiceMesh]# cat virtual-service-reviews-v3.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v3
[root@k8s-master-node1 ServiceMesh]# kubectl apply -f virtual-service-reviews-v3.yaml
virtualservice.networking.istio.io/reviews configured

初始化默认路由规则,将所有流量路由到服务的v1版本:

[root@k8s-master-node1 ServiceMesh]# kubectl apply -f virtual-service-all-v1.yaml

改变reviews服务的流量规则,将v1版本的流量镜像到v2版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@k8s-master-node1 ServiceMesh]# cat virtual-service-mirroring.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 100
mirror:
host: reviews
subset: v2
[root@k8s-master-node1 ServiceMesh]# kubectl apply -f virtual-service-mirroring.yaml
virtualservice.networking.istio.io/reviews configured

1.请求路由创建成功得 0.2 分;
2.路由策略配置正确得 0.3 分。

【任务 5】容器云服务运维:Kubernetes 基于虚拟机的运维[4.0 分]

【题目 1】VM 管理–创建 VM[0.5 分]

使用镜像 fedora-virt:v1.0 在 default 命名空间下创建一台 vm,名称为 vm-fedora,内存为1G。
完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#参考官网学习http://kubevirt.io/user-guide/virtual_machines/virtual_machine_instances/

apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
labels:
kubevirt.io/vm: vm-fedora
name: vm-fedora
spec:
running: false
template:
metadata:
labels:
kubevirt.io/vm: vm-fedora
spec:
domain:
resources:
requests:
memory: 1Gi
devices:
disks:
- name: containerdisk
disk:
bus: virtio
volumes:
- name: containerdisk
containerDisk:
image: fedora-virt:v1.0

1.VM 创建成功得 0.3 分;
2.VM 配置正确得 0.2 分。

【题目 2】存储与卷–创建 emptyDisk 卷[1 分]

使用镜像 fedora-virt:v1.0 在 default 命名空间下创建一台 vmi,名称为 vmi-fedora,并使用 emptyDisk 卷为 vmi 挂载一块 2G 的磁盘。完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

把上题的磁盘改为2G即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
labels:
kubevirt.io/vm: vm-fedora
name: vm-fedora
spec:
running: false
template:
metadata:
labels:
kubevirt.io/vm: vm-fedora
spec:
domain:
resources:
requests:
memory: 2Gi
devices:
disks:
- name: containerdisk
disk:
bus: virtio
volumes:
- name: containerdisk
containerDisk:
image: fedora-virt:v1.0

1.VMI 创建成功得 0.4 分;
2.卷挂载成功得 0.6 分。

【题目 3】KubeVirt 运维–创建 VMI[1.5 分]

将提供的镜像 exam.qcow2 转换为 docker 镜像 exam:v1.0,然后使用镜像 exam:v1.0 镜像在 default 命名空间下创建一台 vmi,名称为 exam,将虚拟机的 80 端口以 NodePort 的方式对外暴露为 30082,并使用数据源在启动时将 VM 的主机名初始化为exam。
完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

1.qcow2 镜像转化成功得 0.3 分;
2.VMI 创建成功得 0.3 分;
3.端口暴露成功得 0.3 分;
4.服务能正常访问得 0.4 分;
5.主机名初始化成功得 0.2 分。

【题目 4】KubeVirt 运维–启用快照[1 分]

KubeVirt 支持对 VM 进行快照,请启用KubeVirt 快照管理功能: 完成后提交 master 节点的 IP 地址、用户名和密码到答题框。

1
# 参考官网http://kubevirt.io/user-guide/operations/snapshot_restore_api/

1.快照功能启用成功得 1 分。

【任务 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.执行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.执行 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.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.HTTP 服务成功启动,计 1 分;
2.发起指定参数的 POST 创建 service 请求,成功创建 service 资源,计 1 分;
3.发起指定参数的GET 查询 service 请求,成功查询指定名称的 Service,计 1 分;
4.发起指定参数的DELETE 删除 service 请求,成功删除指定名称的 Service,计 1 分