侧边栏壁纸
  • 累计撰写 30 篇文章
  • 累计创建 3 个标签
  • 累计收到 4 条评论
标签搜索

目 录CONTENT

文章目录

2022云计算国赛paas基础部分

小裴
2023-03-12 / 0 评论 / 0 点赞 / 241 阅读 / 3,832 字

【任务 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
0

评论区