【任务 1】容器云平台搭建
【适用平台】私有云
【题目 1】平台部署–部署容器云平台
登录 OpenStack 私有云平台,使用 CentOS7.9 镜像创建两台云主机,使用 kubeeasy 工具完成 Kubernetes 1.22.1 集群的搭建。然后使用 nginx 镜像在 default 命名空间下创建一个名为exam 的 Pod,并为该 Pod 设置环境变量 exam,其值为 2022。完成后提交 master 节点的用户名、密码和 IP 到答题框
kubeeasy install dependencies \
--host 10.18.4.10,10.18.4.11 \
--user root \
--password 000000 \
--offline-file /opt/dependencies/base-rpms.tar.gz
#[install k8s cluster offline]
kubeeasy install kubernetes \
--master 10.18.4.10 \
--worker 10.18.4.11 \
--user root \
--password 000000 \
--version 1.22.1 \
--offline-file /opt/kubernetes.tar.gz
kubectl run exam --image nginx:latest --env="exam=2022" --image-pull-policy='IfNotPresent'
【题目 2】平台部署–部署 Istio 服务网格
在 Kubernetes 集群上完成 Istio 服务网格环境的安装,然后新建命名空间 exam,为该命名空间开启自动注入 Sidecar。
kubeeasy add --istio istio
#创建exam命名空间
kubectl create ns exam
#通过为命名空间打标签来实现自动注入
kubect label ns exam istio-injection=enabled
【题目 3】平台部署–部署 KubeVirt 虚拟化
在 Kubernetes 集群上完成 KubeVirt 虚拟化环境的安装。
kubeeasy add --virt kubevirt
【题目 4】平台部署–部署 Harbor 仓库及 Helm 包管理工具
在 master 节点上完成 Harbor 镜像仓库及 Helm 包管理工具的部署。然后使用 nginx 镜像自定义一个 Chart,Deployment 名称为 nginx,副本数为 1,然后将该 Chart 部署到 default命名空间下,Release 名称为 web。
#[add harbor]
kubeeasy add --registry harbor
kubectl create deployment nginx -oyaml --image=nginx:latest --replicas=1 --dry-run --port=80 > /root/nginx/templates/deployment.yaml
cat > /root/nginx/templates/deployment <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
EOF
#创建helm应用的文档简介
cat > /root/nginx/templates/NOTES.txt <<EOF
name: nginx
EOF
#部署以Release为web命名的helm任务
cd /root
helm install web nginx
helm uninstall web
【题目 5】集群管理–备份 ETCD 数据
Kubernetes 使用 ETCD 来存储集群的实时运行数据,为防止服务器宕机导致 Kubernetes 集群数据丢失,请将 Kubernetes 集群数据备份到/root/etcd.db 中。 完成后提交 master 节点的 IP 地址、用户名和密码到答题框。
kubectl get pod -A -owide | grep etcd
kubectl describe pods -n kube-system etcd-k8s-master-node1 | grep docker
docker cp 23cfda6cf30:/usr/local/bin/etcdctl /usr/local/bin/etcdctl
ETCDCTL_API=3 /usr/local/bin/etcdctl \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--endpoints="https://127.0.0.1:2379" snapshot save /root/etcd.db
【任务 2】容器云应用部署:Docker Compose 编排部署
【题目 1】容器化 MariaDB 服务
编写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)设置服务开机自启。
[root@k8s-master-node1 mariadb]# cat dockerfile
FROM centos:7.9.2009
RUN rm -rf /etc/yum.repos.d/*
COPY ftp.repo /etc/yum.repos.d/
COPY init.sh /root/
COPY hyperf_admin.sql /root/
RUN yum install mariadb-server -y
RUN chmod +x /root/init.sh
CMD ["/root/init.sh"]
[root@k8s-master-node1 mariadb]# cat init.sh
#!/bin/bash
mysqld_safe &
sleep 5
mysqladmin -uroot password 'root'
mysql -uroot -proot -e "grant all privileges on *.* to 'root'@'localhost' identified by 'root';"
mysql -uroot -proot -e "grant all privileges on *.* to 'root'@'%' identified by 'root';"
mysql -uroot -proot -e "source /root/hyperf_admin.sql;"
tail -f /root/hyperf_admin.sql
【题目 2】容器化 Redis 服务
编写 Dockerfile 文件构建 hyperf-redis:v1.0 镜像,具体要求如下:(需要用到的软件包:
Hyperf.tar.gz)
(1)基础镜像:centos:7.9.2009;
(2)安装 Redis 服务;
(3)关闭保护模式;
(4)声明端口:6379;
(5)设置服务开机自启。
[root@k8s-master-node1 redis]# cat dockerfile
FROM centos:7.9.2009
RUN rm -rf /etc/yum.repos.d/*
COPY ftp.repo /etc/yum.repos.d/
RUN yum install redis -y
RUN sed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /etc/redis.conf
RUN sed -i "s/protected-mode yes/protected-mode no/g" /etc/redis.conf
EXPOSE 6379
CMD ["redis-server"]
【题目 3】容器化 Nginx 服务
编写 Dockerfile 文件构建 hyperf-nginx:v1.0 镜像,具体要求如下:(需要用到的软件包:
Hyperf.tar.gz)
(1)基础镜像:centos:7.9.2009;
(2)安装 nginx 服务;
(3)声明端口:80;
(4)设置服务开机自启。
[root@k8s-master-node1 web]# vi project/docker/conf.d/hyperf-admin.conf
upstream backend {
server 127.0.0.1:9511;
}
[root@k8s-master-node1 web]# cat dockerfile
FROM centos:7.9.2009
RUN rm -rf /etc/yum.repos.d/*
COPY ftp.repo /etc/yum.repos.d/
RUN yum install nginx -y
WORKDIR /var/www
COPY project/frontend /var/www/frontend
COPY project/docker/conf.d/hyperf-admin.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx","off","daemon off;"]
【题目 4】容器化 Hyperf 服务
编写 Dockerfile 文件构建 hyperf-service:v1.0 镜像,具体要求如下:(需要用到的软件包:
Hyperf.tar.gz)
(1)基础镜像:centos:7.9.2009;
(2)安装 PHP 及扩展;
(3)使用源码编译安装 Swoole。
FROM centos:centos7.9.2009
MAINTAINER huhy
RUN rm -rf /etc/yum.repos.d/*
# 上传repo文件
COPY local.repo /etc/yum.repos.d/
# 上传yum源
COPY yum /root/yum
# 上传swoole
COPY swoole-v4.8.3.zip /root/
# 安装php及相关扩展
RUN yum -y install php php-cli php-fpm php-mbstring php-pdo php-mysqlnd php-redis php-zip php-gd php-xml php-pear php-devel
# 安装编译所需的工具
RUN yum -y install gcc make autoconf libc-dev pkg-config
# 复制Swoole源码到容器中
COPY swoole-v4.8.3.zip /usr/local/src/swoole-v4.8.3.zip
# 解压Swoole源码
RUN yum install -y unzip
RUN cd /root/ && unzip swoole-v4.8.3.zip -d /usr/local/src/
# 编译Swoole并安装
RUN cd /usr/local/src/swoole-v4.8.3/ && phpize && ./configure --enable-openssl --enable-http2 --enable-sockets && make && make install
# 设置工作目录
WORKDIR /var/www
# 将PHP配置文件复制到容器中
COPY project /var/www/
# 暴露端口
EXPOSE 9501
# 设置开机启动
CMD ["php", "/var/www/backend/bin/hyperf.php", "start"]
【题目 5】编排部署 Hyperf 框架
编写/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 地址到答题框。
version: '3.1'
services:
app:
container_name: hyperf-service
image: hyperf-service:v1.0
command:
- /bin/sh
- -c
- |
cd /data
cp .env.dev.docker .env
php -d memory_limit=-1 `which composer` i --no-dev
rm -rf runtime/*
php bin/hyperf.php start
volumes:
- ./backend:/data
tty: true
links:
- mysql
- redis
environment:
HOST_IP: 127.0.0.1
HOST_PORT: 9511
mysql:
container_name: hyperf-mysql
image: hyperf-mariadb:v1.0
ports:
- 3306:3306
restart: always
redis:
image: hyperf-redis:v1.0
container_name: hyperf-redis
restart: always
nginx:
image: hyperf-nginx:v1.0
container_name: hyperf-nginx
ports:
- 8081:80
links:
- app
volumes:
- ./conf.d/:/etc/nginx/conf.d
- ./docker/log:/var/log/nginx
- ./frontend:/var/www/frontend
【任务 3】容器云应用部署:基于 Kubernetes 构建 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。
cat > gitlab.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: gitlab
name: gitlab
spec:
replicas: 1
selector:
matchLabels:
app: gitlab
template:
metadata:
creationTimestamp: null
labels:
app: gitlab
spec:
containers:
- image: gitlab/gitlab-ce:latest
imagePullPolicy: IfNotPresent
name: gitlab
ports:
- containerPort: 80
env:
- name: GITLAB_ROOT_PASSWORD
value: admin123
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: gitlab
name: gitlab
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
nodePort: 30888
selector:
app: gitlab
type: NodePort
EOF
$ kubectl apply -f gitlab.yaml
【题目 2】部署 GitLab Runner
将 GitLab Runner 部署到 gitlab-ci 命名空间下,Release 名称为 gitlab-runner,为 GitLab Runner 创建持久化构建缓存目录/home/gitlab-runner/ci-build-cache 以加速构建速度,并将其
注册到 GitLab 中。
【题目 3】配置 GitLab
将 Kubernetes 集群添加到 demo-2048 项目中,并命名为kubernetes-agent,项目命名空间选择 gitlab-ci。
【任务 4】容器云服务运维:Kubernetes 基于容器的运维
【题目 1】Pod 管理–创建 Pod
在 default 命名空间下使用 nginx:latest 镜像创建一个 QoS 类为 Guaranteed 的 Pod,名称为 qos-demo。
[root@k8s-master-node1 test4]# cat qos-demo.yml
apiVersion: v1
kind: Pod
metadata:
name: qos-demo
namespace: default
spec:
containers:
- name: qos-demo
image: nginx:latest
resources:
limits:
memory: "100Mi"
cpu: "100m"
requests:
memory: "100Mi"
cpu: "100m"
【题目 2】安全管理–配置 Pod 安全上下文
使用 busybox 镜像启动一个名为 context-demo 的 Pod,为该 Pod 配置安全上下文,要求容器内以用户 1000 和用户组 3000 来运行所有进程,并在启动时执行“sleep 1h”命令。
[root@k8s-master-node1 test4]# cat context-demo.yml
apiVersion: v1
kind: Pod
metadata:
name: context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
containers:
- name: context-demo
image: busybox
command: ["sh","-c","sleep 1h"]
【题目 3】CRD 管理–创建自定义资源类型
在 Kubernetes 集群中自定义一种资源类型 Student,API 为 stable.example.com/v1,单数形式为 student,复数形式为 students,简写为 stu,作用域为命名空间级,然后在 default 命
名空间下创建一个名为 exam 的 Student 对象。
[root@k8s-master-node1 test4]# cat CRD.yml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: students.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
scope: Namespaced
names:
plural: students
singular: student
kind: Student
shortNames:
- stu
【题目 4】解析管理–添加主机别名到 Pod
使用 nginx 镜像在 default 命名空间下创建一个名为 nginx 的 Pod,并在 Pod 的/etc/hosts中添加 IP 地址 127.0.0.1 与 chinaskills 的解析。
[root@k8s-master-node1 ~]# cat jiexi.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
restartPolicy: Never
hostAliases:
- ip: "127.0.0.1"
hostnames:
- "chinaskills"
containers:
- image: nginx:latest
name: nginx
imagePullPolicy: IfNotPresent
command:
- cat
args:
- "/etc/hosts"
[root@k8s-master-node1 ~]# kubectl create -f jiexi.yaml
[root@k8s-master-node1 ~]# kubectl logs nginx
【题目 5】HPA 管理–创建 HPA 规则
默认情况下 HPA 是无法调整伸缩灵敏度的,但不同的业务场景对伸缩灵敏度的要求不一样。要求在 default 命名空间下使用 nginx 镜像创建一个名为 web 的 deployment,自定义HPA 的伸缩灵敏度,为该 deployment 创建一个名为 web 的 HPA,扩容时立即新增当前 9 倍数量的副本数,时间窗口为 5s,伸缩范围为 1–1000。例如一开始只有 1 个 Pod,当 CPU 使用率超过 80%时,Pod 数量变化趋势为:1 → 10 → 100 → 1000。
[root@k8s-master-node1 test4]# cat web.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
spec:
selector:
matchLabels:
app: web
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: web
resources:
limits:
memory: "100Mi"
cpu: "100m"
[root@k8s-master-node1 test4]# cat Hpa.yml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: web
spec:
maxReplicas: 1000
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
behavior:
scaleUp:
policies:
- type: Percent
value: 900
periodSeconds: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
【题目 6】节点亲和性管理–创建硬限制规则的 Pod
在 default 命名空间下使用 nginx 镜像运行一个 Pod,名称为 nginx,要求使用requiredDuringSchedulingIgnoredDuringExecution 策略将 Pod 调度到具有“disktype=ssd”标签的节点。
[root@k8s-master-node1 test4]# cat lab.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx
【题目 7】网络策略管理–创建 Pod 网络策略
创建一个网络策略 network-exam,要求只有 internal 命名空间下的 Pod 可以通过 TCP协议的 8080 端口访问到 mysql 命名空间下的 Pod。
[root@k8s-master-node1 test4]# cat network-exam.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: network-exam
namespace: mysql
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
ns: internal
ports:
- port: 8090
protocol: TCP
【题目 8】驱逐机制管理–配置节点压力驱逐
设置 kubelet数据存储在/apps/data/kubelet目录下,并设置当 kubelet的存储空间不足 5%,或者当容器运行时文件系统可用存储空间不足 5%时开始驱逐 Pod
[root@k8s-master-node1 test4]# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--root-dir=/apps/data/kubelet --eviction-hard=nodefs.available<5% --eviction-hard=imagefs.available<5%
【题目 9】流量管理–创建 Ingress Gateway
使用提供的软件包 ServiceMesh.tar.gz 将 Bookinfo 应用部署到 default 命名空间下,使用Istio Gateway 可 以实 现应 用程 序从 外部 访问, 请为 Bookinfo 应用创 建一 个名 为bookinfo-gateway 的网关,指定所有 HTTP 流量通过 80 端口流入网格,然后将网关绑定到虚拟服务 bookinfo 上。
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
【题目 10】服务网格–创建基于用户身份的路由
创建一个名为 reviews 路由,要求来自名为 Jason 的用户的所有流量将被路由到服务reviews:v2。
$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
...
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
【题目 11】服务网格–创建请求路由
在default命名空间下创建一个名为reviews-route的虚拟服务,默认情况下,所有的HTTP流量都会被路由到标签为 version:v1 的 reviews 服务的 Pod 上。此外,路径以/wpcatalog/或/consumercatalog/开头的 HTTP 请求将被重写为/newcatalog,并被发送到标签为 version:v2 的
Pod 上。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews-route
spec:
#客户端访问服务的地址
hosts:
- reviews.prod.svc.cluster.local
http:
#如果请求的前缀为/wpcatalog、/consumercatalog,流量路由到v2版本的reviews中。
- name: "reviews-v2-routes"
match:
- uri:
prefix: "/wpcatalog"
- uri:
prefix: "/consumercatalog"
rewrite:
uri: "/newcatalog"
route:
- destination:
host: reviews.prod.svc.cluster.local
# 匹配的服务版本或子集为v2
subset: v2
#其它请求,流量路由到v1版本的reviews中。
- name: "reviews-v1-route"
route:
- destination:
host: reviews.prod.svc.cluster.local
subset: v1
评论区