# stock-sdk-test **Repository Path**: thincats/stock-sdk-test ## Basic Information - **Project Name**: stock-sdk-test - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-18 - **Last Updated**: 2021-11-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## About Stock SDKTest 的部署脚本 目录结构为 - ansible: 基于 Ansible 的运维脚本,用于配置系统,安装 K8S 集群,复制虚拟机镜像,以及一些其他的批量操作。 - k8s-infra: 项目所需要外部服务的部署文件,如 Ceph、Drone、Gitlab 等 - k8s: 项目的部署文件,如 Airflow,Kubevirt 等 - scripts: 运维、代码生成相关的 Python 脚本 ### Version 各个组件的版本 **核心组件** | 组件 | 应用版本 | | ---- | -------- | | k8s | v1.22.2 | **/k8s-infra** | 组件 | 应用版本 | chart 版本 | | ------------------ | -------- | ---------- | | traefik | 2.5.3 | 10.6.0 | | drone | 13.12 | 0.1.7 | | gitlab | 14.4.0 | 5.4.0 | | harbor | 1.7.3 | 2.3.3 | | mongodb | 10.28.2 | 4.4.10 | | rook-ceph-operator | 1.7.5 | 1.7.5 | | rook-ceph-cluster | 1.7.5 | 1.7.5 | **/k8s** | 组件 | 应用版本 | | ---------------------- | ----------------------------------- | | kubevirt | 0.46.0 (hooks-sidecar 需要进行更新) | | k8s-sidecar-injector | - | | airflow | 1.10.4 | | airflow-worker-sidecar | - | | fluentd-collector | - | | mongo-rest | - | ## Getting Start ### Prerequisites 操作机器需要具有对 K8S 集群的访问权限,并且需要安装以下二进制依赖 - Python >= 3.8 - Helm: K8S 包管理器 - Poertry: Python 依赖与项目构建工具 - Make ### Installation 1. 安装上述二进制依赖 2. 在项目根目录下,使用 Poetry 安装 Python 项目依赖 ```sh cd stock-sdktest-deploy poetry install ``` 如果使用 VSCode,可以选择 Poetry 创建的虚拟环境作为 Python 解释器环境。 使用 `poetry run` 即可在虚拟环境中执行 Python 脚本。 项目中的 shell script 会使用 `poetry run` 来执行 Python 脚本。 ## Usage 更多详细的使用说明,可见 Details ### Quick Start 1. 进入 `k8s` 目录 ```sh cd k8s ``` 2. 在 `vars` 目录下创建空文件 `prod.yaml` ```sh touch vars/prod.yaml ``` 该步骤是为了符合 DevOps 规范,将状态与代码仓库隔离。 vars 文件将用来渲染模板,模板渲染在启动服务时自动执行,可以使用命令 `make gen-helm-values` 强制重新渲染,并查看 文件夹 `.values/prod` 的文件,观察渲染结果。 3. 执行 make,部署 airflow ```sh # 更新所有子chart依赖,如果没有修改子 Chart,不需要重新执行 make dep-all make airflow-install ``` 默认情况下,服务会部署在命名空间 `sdk-test` 中 部署时可能会依赖一些外部服务,比如 PV Provisioner,可以进入 `k8s-infra/` 部署相关组件 ```sh cd k8s-infra/ touch vars/prod.yaml make dep-all make traefik-install ... ``` 可见 `Makefile` 与 `scripts/app.mk` 获取所有可执行的部署命令 4. 部署其他组件,如 kubevirt, fluentd-controller 5. 部署 k8s-sidecar-injector k8s-sidecar-injector 将会将额外的 配置 注入到 POD 中,本项目是将 airflow-worker 注入到虚拟机实例中。 详情使用说明可见 `k8s/apps/k8s-sidecar-injector/files/tls/README.md`,这里不用按照 Readme 的配置进行,在 helm chart 中这些步骤将自动完成。 ```sh # 安装 k8s-sidecar-injector make k8s-sidecar-injector-install # 安装 airflow-worker-sidecar 配置 make airflow-worker-sidecar-install ``` **将 sdk-test 标记为可以注入** ```sh kubectl label namespace sdk-test sidecar-injector=enabled ``` **在需要请求 sidecard 的 pod 加入下面内容** ```yaml --- kind: Pod metadata: labels: injector.droidvirt.io/request: ``` 本项目已有一些定义好的 ``,在`k8s/apps/airflow-worker-sidecar/templates` 中 `sidecar_name` 列表 - android-appium-sidecar - android-worker-sidecar - osx-worker-sidecar 6. 启动 Android Installer VM Android Installer VM 使用 `hostDisk` 访问安装 ISO 镜像,所以需要确保该镜像已被上传到节点的对应目录,这个目录可以在`k8s/values.yaml.j2` 中的 `anrdoid-installer-vm.androidIsoPath` 修改。 ```sh make android-vm-installer-install ``` 7. 验证 VM 是否正常启动 使用 `kubectl port-foward` 将 vm 的 vnc 端口映射到本地,之后可以通过 VNC Viewer 查看。 ```sh kubectl port-forward services/android-vm-installer 10000:5900 -n sdk-test ``` 该命令将服务的 5900 端口映射到本地 10000 端口 8. 上述端口映射需要依赖 `hooks-sidecar` 开启服务,也可以利用 kubevirt 官方提供的工具 `virtctl` 进行 vnc 端口映射 ```sh virtctl vnc ``` ### Kubevirt 安装 在 `k8s/Makefile` 下,定义了命令 `kubevirt-install` 与 `containerized-data-importer-install` 安装 kubevirt ```sh make kubevirt-install ``` 安装 containerized-data-importer,该程序可用于将镜像导入到 PV 中 ```sh make containerized-data-importer-install ``` 例如 ```sh virtctl image-upload pvc android-vm-base-pvc --size=8Gi --block-volume --image-path=./disk.img --uploadproxy-url https://192.160.147.27:443 --insecure ``` ### Ceph 部署 1. 确保待部署节点,并记录下其主机名 这里以 node2, node3, node4 为例 2. 确认每个待部署节点都有独立的磁盘或者分区,如果没有,请进行 [创建 Raw Disk Image](#create-raw-disk-image) 新版本 Ceph 要求要有独立的磁盘或者分区,如果没有,则需要手动创建 Disk Image 并使用 LVM 进行管理。 3. 进入 `k8s-infra` 目录 ```sh cd k8s-infra ``` 4. 查看 `values.yaml.j2`,并且修改配置项 `infra-rook-ceph-cluster` 该配置项中的 `cephClusterSpec` 与官方文档 [ceph cluster crd](https://github.com/rook/rook/blob/master/Documentation/ceph-cluster-crd.md) 中定义一致,查看文档,了解各个字段的详情 主要注意 `cephClusterSpec.mon` 与 `cephClusterSpec.storage`,默认使用的是步骤 3 安装的 `local-disk-storage`,如果部署节点有独立分区,需要修改配置,可参见文档。 5. 启动 `rook-ceph-operator` ```sh make rook-ceph-operator-install ``` 6. 启动 `rook-ceph-cluster` ```sh make rook-ceph-cluster-install ``` 启动可能需要一些时间,需要耐心等待,默认将 Ceph 创建在命名空间 `rook-ceph` 中,建议不修改,可以通过查看 pod 情况了解进度 ```sh kubect get pods -n rook-ceph ``` 7. 验证 Ceph 集群 使用 rook-ceph-tools,其包含了 ceph 的大量工具,可以查阅 Ceph 文档查看具体帮助。 ```sh make exec-rook-ceph-tools # 进入 rook-ceph-tool POD ceph status # 查看 ceph 状态 ceph health # 查看 ceph 健康度 ``` **可选 (查看 dashboard 密码)** ```sh kubectl get secret rook-ceph-dashboard-password -o jsonpath='{.data.password}' | base64 -d ``` ### 创建 Raw Disk Image 相关步骤同样定义于 `ansible/playbooks/F1-create-ceph-lvm-disk.yml` 在每一个待部署节点执行下列操作 1. 创建 `/images` 文件夹 ```sh mkdir /images ``` 2. 创建一个 100G 大小的 Disk Image,大小根据需求设置 ```sh truncate -s 100G /images/ceph-disk.img ``` 3. 作为块设备挂载 ```sh losetup -P $(losetup -f) /images/ceph-disk.img ``` 4. 找到一个该挂载的 Loop Device ID,并记录下来 ```sh losetup -a | grep /images/ceph-disk.img ``` 5. 创建 LVM PV,loop device 为刚刚创建的 ```sh pvcreate /dev/ ``` 使用 `pvdisplay` 检验是否创建成功 6. 创建 LVM vg `ceph-disk` ```sh vgcreate ceph-disk /dev/ ``` 使用 `vgdisplay` 检验是否创建成功 7. 创建 LVM lv `ceph-disk/main` ```sh lvcreate --name main --extents +100%free ceph-disk ``` 使用 `lvdisplay` 检验是否创建成功 确认设备 `/dev/ceph-disk/main` 是否存在, 8. 为 mon 创建目录 ```sh mkdir -p /var/lib/rook/ceph-disk/mon ``` 9. 进入 k8s-infra 目录 ```sh cd k8s-infra ``` 之后,我们需要启动 `local-disk-storage` 服务,该服务使用上面创建的 Loop Device 作为底层的存储,并提供 K8S PV,Rook Ceph 将会使用这些 PV 创建 Ceph 集群 10. 修改 values.yaml.j2 查看 `values.yaml.j2`,找到配置项 `infra-local-disk-storage:`,修改 `pvs` 下面的各个节点以适应自己的环境 ```yaml infra-local-disk-storage: localDiskStorage: pvs: - nodes: ["node2", "node3", "node4"], ... - nodes: ["node2", "node3", "node4"], ... ``` 11. 启动 `local-disk-storage` ```sh make local-disk-storage-install ``` 使用 `kubectl get pv` 验证 这些 pv 是否存在 ``` ceph-local-disk- ... ceph-local-mon- ``` 12. 回到 Ceph 部署步骤,[返回](#ceph-deploy-step3) ## Details 目录 `k8s-infra` 与 `k8s` 具有同样的结构,之后以 `k8s` 目录为例进行说明 ### 注意 `k8s` 服务中的 Helm Chart 有待进一步完善,部署过程中可能会出现问题,可修改对应的 K8S Yaml 清单文件修复缺陷。 ### Conventions 部署文件目录结构 - apps: 包含 Helm Chart 的定义 - scripts: 一些脚本文件 - vars: 部署集群时,需要设置的变量文件 - Makefile: 定义了与部署相关的指令 - values.yaml.j2: jinja2 模板,传递给 Helm 的变量文件 进行实际部署时,需要将工作目录切换到相应的部署文件夹,以使 Makefile 中定义的脚本能够正常工作 ```sh cd k8s/ ``` ### Variables 进行部署之前,需要在 `k8s/vars` 文件夹下创建一个新的 yaml 文件 `k8s/vars/prod.yaml`,用于表示部署环境中的一些变量,如数据库的密码等。这些文件不应该加入到公开的源代码仓库中。 定义的变量可以在 `k8s/values.yaml.j2` 中进行引用,如 `{{ vars.name }}`,模板的语法可见 [jinja2 文档](https://jinja.palletsprojects.com/en/3.0.x/templates/) 每次执行部署命令时,一个 Python 脚本会将 `vars` 目录下定义的变量文件 `vars/base.yaml` 与 `vars/prod.yaml` 进行合并,渲染 `values.yaml.j2`,并把结果按服务名称输出到 `.values/prod/{service_name}.yaml` 中,这些文件将作为 Helm 的 values file。 如果需要定制服务部署的细节,如设置 `replicas`, `volumes` 等,可以修改 `values.yaml.j2`。一些服务的 helm chart 还没有完善,有待添加更多可定制化部分。 ### Deploy 由于 Helm 功能的限制,其很难支持声明多个服务的依赖关系,同时为了简化部署,这里将每一个服务的部署分成多步进行,需要手动进行每一个服务的部署。 通过 Make 执行部署命令,大部分服务以 Helm Chart 形式打包,每一个服务基本上含有 3 个部署相关的命令 ```sh # 更新 Helm chart 依赖,如果没有对子Chart进行修改,只需要执行一次 make -dep # 部署服务 make -install # 卸载服务 make -uninstall ``` 详细的指令可参见 `scripts/app.mk` 以及 `Makefile`,如果要添加新的 make 指令,应当在 `Makefile` 中添加,`scripts/app.mk` 由脚本自动生成,可能会被覆盖。 ## Service Deployment Order `k8s-infra` 为项目的外部服务依赖,如果已经有相关的服务,可以不进行或者选择性部署。 - traefik: Ingress Controller - Local Disk Storage: 让 Rook 能够使用 Raw Disk - Rook Ceph Operator: Ceph on K8S - Rook Ceph Cluster: Ceph on K8S - MongoDB - Harbor: Image Registry - Gitlab - Drone - Drone Runner Kube `k8s` 目录下时该项目的核心,需要进行部署 - kubevirt - fluentd-controller: fluentd 日志采集 - k8s-sidecar-injector: 向容器注入 Sidecar - airflow - airflow-worker-sidecar: Sidecar 定义 - mongo-rest: 测试数据查询 - android-vm-installer: Android 虚拟机,用于安装系统 - android-vm: Android 虚拟机 ## Known Issues - Kubevirt 升级后,API 改变,原有的 hooks-sidecar 需要进行升级才能够使用。 ## TODO - [] 升级 hooks-sidecar - [x] 添加 Android 虚拟机 部署脚本 - [] 添加 OSX 虚拟机 部署脚本 - [] 完善 Helm Chart - [] 增加 Helm test 测试 - [] 去除代码生成中的其他二进制依赖 - [] more things...