专栏文章 如何基于 Rancher 构建 CICD 持续集成测试环境

牛马搬砖君 · 2021年06月18日 · 4146 次阅读

学习背景

最近刚刚换了一个砖厂,板砖,刚刚入团队,就接到领导的一个烫手的山芋任务,负责搭建公司的开发和测试环境,而且,只有我一个人,公司是由运维,但是主要活动在遥远的帝都,而我所在的魔都,没有运维,团队内部一个运维都没有,这也意味着,我将没有被大佬带飞的机会,只能自己摸石头过河,走一步算一步。通过自己学习和调研,最终给完成了公司,从打包到部署一系列的 CICD 持续集成。

学习的目的

学习主要解决以下问题

  • 团队只有一套环境,开发和测试挤在一起,根本没有稳定的环境测试
  • 需求迭代快,碎片化需求居多,发版频繁
  • 研发老是切半分支,不通知测试,测试老是出问题,测试环境数据混乱,无从下手
  • 各类文档缺乏,测试对项目的熟悉程度偏小,需求改动也频繁
  • 团队开发大多属于外包,帝都运维对服务端权限把控严格,开发对基础环境的构建,运行一无所知
  • 运维说的一些,运行环境的技术,连研发总监也不知道。。。。,遇到问题帝都运维也不是很愿意帮忙等

初识 Rancher

什么是 Rancher

Rancher 是一个开源的企业级容器管理平台。通过 Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher 提供了在生产环境中使用的管理 Docker 和 Kubernetes 的全栈化容器部署与管理平台。

Rancher 的组成

下图来源于 Rancher 官网

基础设施编排

Rancher 可以使用任何公有云或者私有云的 Linux 主机资源。Linux 主机可以是虚拟机,也可以是物理机。Rancher 仅需要主机有 CPU,内存,本地磁盘和网络资源。从 Rancher 的角度来说,一台云厂商提供的云主机和一台自己的物理机是一样的。同时,Rancher 为运行容器化的应用实现了一层灵活的基础设施服务。Rancher 的基础设施服务包括网络, 存储, 负载均衡, DNS 和安全模块。Rancher 的基础设施服务也是通过容器部署的,所以同样 Rancher 的基础设施服务可以运行在任何 Linux 主机上。

容器编排与调度

很多情况下我们都会选择使用容器编排调度框架来运行容器化应用。我为什么会选择 Rancher,因为 Rancher 包含了当前全部主流的编排调度引擎,例如 Docker Swarm, Kubernetes, 和 Mesos。同一个用户可以创建 Swarm 或者 Kubernetes 集群。并且可以使用原生的 Swarm 或者 Kubernetes 工具管理应用。同时,Rancher 是除了 Swarm,Kubernetes 和 Mesos 之外,Rancher 还支持自己的 Cattle 容器编排调度引擎。Cattle 被广泛用于编排 Rancher 自己的基础设施服务以及用于 Swarm 集群,Kubernetes 集群和 Mesos 集群的配置,管理与升级的便捷工具。

Rancher 的应用商店

一个好的开源项目,必定有一个良好的生态圈子,Rancher 的应用商店作为 Rancher 的可以在应用商店里一键部署由多个容器组成的应用。用户可以管理这个部署的应用,并且可以在这个应用有新的可用版本时进行自动化的升级。Rancher 提供了一个由 Rancher 社区维护的应用商店,其中包括了一系列的流行应用。Rancher 的用户也可以创建自己的私有应用商店。

企业级权限管理

Rancher 另外一大好处就是,支持企业级的一个权限管理,而且 Rancher 支持灵活的插件式的用户认证。支持 Active Directory,LDAP, Github 等 认证方式。 Rancher 支持在环境级别的基于角色的访问控制 (RBAC),可以通过角色来配置某个用户或者用户组对开发环境或者生产环境的访问权限

Rancher 优缺点

优点

  • 采用图形化方式:易用的 Web 管理界面,在 Docker 易用性的基础上,再一次降低了使用容器技术部署容器应用的难度。
  • 支持多种调度器:通过环境模板,很容易地创建和部署 Cattle、Swarm、K8S、Mesos 容器集群管理调度平台。
  • 管理主机集群:管理对象是多台主机的集群,而不仅仅是单台容器主机,创建和管理几台、几十台应用服务器集群,只需要 Ctrl+C、Ctrl+V,复制粘贴就解决了。
  • 内置应用商店:使用其中的 WordPress 模板,创建一个 WordPress 博客系统,只需点点鼠标,部署难度不高于申请一个免费的电子邮箱!
  • 资源弹性分配:内置应用负载均衡器,“服务” 最小只需 1 个容器实例,当负载不够/或过剩时,只需点点鼠标,增加/减少 “服务” 中容器的实例数,即可解决问题,应用系统具有天生的弹性扩容能力。

缺点

  • K8S 部署的问题:由于国内网络和国外网络访问的问题,在国内部署 K8S 集群,有点不方便;
  • 应用商店的问题:默认的 Rancher 官方认证和社区贡献的应用商店内容有限,应用还不够丰富,基本上都是网络和存储等基础的应用;个别应用部署后,无法通过相同的操作,再部署同样的另一套应用,比如 Rancher NFS

总结

基于以上优缺点的分析,最终我还是采用了 Rancher,因为他能解决我目前我们在服务器资源较少的情况下,能动态的分配,我的服务器资源,同时,Gui 界面,简单容易操作,便于团队其他小伙伴的学习操作,管理 K8s 的集群较为方便。

回归实践

实现目标

开发 push 代码到 Gogs,触发 jenkins 自动 pull 代码,通过 maven 编译、打包,然后通过执行 shell 脚本使 docker 构建镜像并 push 到私服 Harbor(或者阿里云)仓库,此操作完成后 Rancher 服务器上再配置对应的简单配置,Rancher 从 Harbor 仓(私服)拉取镜像,启动容器。整个操作流程完成。

最终设计

通过自己以往的经历,和社区的一些大佬,巨佬,超级巨佬的交流所得经验,最近现在为公司搭建如下的环境,

踩坑记录

  • rancher 搭建的时候,官方在 github 提供的依赖容器,大多是重复的需要自己整理

如何解决
可以将依赖文件下载下来,删除多余的或者重复的依赖镜像
为了不浪费大家时间,我个人整理如下

#!/bin/bash
function dsc() {
    #10.7.x.x 私服地址
    #拼命拉取镜像 直到成功为止
    pull=1
    while [ ${pull} != 0 ]
    do
        docker pull ${1}
        if [ $? -eq 0 ] ; then
            echo -e "\033[32m[ INFO ] \033[0m"  pull10.7.6.2/${1}
            pull=0
            continue
        else
            echo -e "\033[31m[ ERROR ]\033[0m" pull 10.7.6.2/${1}
            pull=1
            continue
        fi
    done
    #拼命tag 直到成功为止
    tag=1
    while [ ${tag} != 0 ]
    do
        docker tag ${1} 10.7.x.x/${1}
        if [ $? -eq 0 ] ; then
            echo -e "\033[32m[ INFO ] \033[0m"  10.7.6.2/${1}
            tag=0
            continue
        else
            echo -e "\033[31m[ ERROR ]\033[0m" 10.7.6.2/${1}
            tag=1
            continue        
        fi
    done
    #拼命推送镜像 直到成功为止
    push=1
    while [ ${push} != 0 ]
    do
        docker push 10.7.x.x/${1}
        if [ $? -eq 0 ] ; then
            echo -e "\033[32m[ INFO ] \033[0m"  push 10.7.6.2/${1}
            push=0
            continue
        else
            echo -e "\033[31m[ ERROR ]\033[0m" push 10.7.6.2/${1}
            push=1
            continue        
        fi      
    done    
}

# ranchar依赖镜像
dsc rancher/backup-restore-operator:v1.0.2&
dsc rancher/banzaicloud-fluentd:v1.11.2-alpine-2&
dsc rancher/banzaicloud-logging-operator:3.6.0&
dsc rancher/calico-cni:v3.13.4&
dsc rancher/calico-cni:v3.16.1&
dsc rancher/calico-ctl:v3.13.4&
dsc rancher/calico-ctl:v3.16.1&
dsc rancher/calico-kube-controllers:v3.13.4&
dsc rancher/calico-kube-controllers:v3.16.1&
dsc rancher/calico-node:v3.13.4&
dsc rancher/calico-node:v3.16.1&
dsc rancher/calico-pod2daemon-flexvol:v3.13.4&
dsc rancher/calico-pod2daemon-flexvol:v3.16.1&
dsc rancher/cis-operator:v1.0.1&
dsc rancher/cluster-proportional-autoscaler:1.7.1&
dsc rancher/cluster-proportional-autoscaler:1.8.1&
dsc rancher/configmap-reload:v0.3.0-rancher2&
dsc rancher/coredns-coredns:1.6.2&
dsc rancher/coredns-coredns:1.6.5&
dsc rancher/coredns-coredns:1.6.9&
dsc rancher/coredns-coredns:1.7.0&
dsc rancher/coreos-etcd:v3.3.15-rancher1&
dsc rancher/coreos-etcd:v3.4.13-rancher1&
dsc rancher/coreos-etcd:v3.4.3-rancher1&
dsc rancher/coreos-flannel:v0.12.0&
dsc rancher/coreos-flannel:v0.13.0-rancher1&
dsc rancher/coreos-kube-state-metrics:v1.9.7&
dsc rancher/coreos-prometheus-config-reloader:v0.38.1&
dsc rancher/coreos-prometheus-operator:v0.38.1&
dsc rancher/curlimages-curl:7.70.0&
dsc rancher/directxman12-k8s-prometheus-adapter-amd64:v0.6.0&
dsc rancher/eks-operator:v1.0.1&
dsc rancher/flannel-cni:v0.3.0-rancher6&
dsc rancher/fleet-agent:v0.3.0&
dsc rancher/fleet:v0.3.0&
dsc rancher/fluent-bit-out-syslog:0.1.0&
dsc rancher/fluent-fluent-bit:1.5.4&
dsc rancher/fluentd:v0.1.19&
dsc rancher/gitjob:v0.1.6&
dsc rancher/grafana-grafana:6.7.4&
dsc rancher/grafana-grafana:7.1.5&
dsc rancher/hyperkube:v1.16.15-rancher1&
dsc rancher/hyperkube:v1.17.12-rancher1&
dsc rancher/hyperkube:v1.18.9-rancher1&
dsc rancher/hyperkube:v1.19.2-rancher1&
dsc rancher/istio-1.5-migration:0.1.1&&
dsc rancher/istio-citadel:1.5.9&
dsc rancher/istio-coredns-plugin:0.2-istio-1.1&
dsc rancher/istio-galley:1.5.9&
dsc rancher/istio-install-cni:1.7.1&
dsc rancher/istio-installer:1.7.1-rancher1&
dsc rancher/istio-kubectl:1.4.6&
dsc rancher/istio-kubectl:1.5.10&
dsc rancher/istio-kubectl:1.5.9&
dsc rancher/istio-mixer:1.5.9&
dsc rancher/istio-mixer:1.7.1&
dsc rancher/istio-node-agent-k8s:1.5.9&
dsc rancher/istio-pilot:1.5.9&
dsc rancher/istio-pilot:1.7.1&
dsc rancher/istio-proxyv2:1.5.9&
dsc rancher/istio-proxyv2:1.7.1&
dsc rancher/istio-sidecar_injector:1.5.9&
dsc rancher/jaegertracing-all-in-one:1.14&
dsc rancher/jenkins-jnlp-slave:3.35-4&
dsc rancher/jetstack-cert-manager-controller:v0.8.1&
dsc rancher/jettech-kube-webhook-certgen:v1.2.1&
dsc rancher/jimmidyson-configmap-reload:v0.2.2&
dsc rancher/jimmidyson-configmap-reload:v0.3.0&
dsc rancher/k3s-upgrade:v1.17.12-k3s1&
dsc rancher/k3s-upgrade:v1.18.9-k3s1&
dsc rancher/k3s-upgrade:v1.19.2-k3s1&
dsc rancher/k8s-dns-dnsmasq-nanny:1.15.0&
dsc rancher/k8s-dns-dnsmasq-nanny:1.15.10&
dsc rancher/k8s-dns-dnsmasq-nanny:1.15.2&
dsc rancher/k8s-dns-kube-dns:1.15.0&
dsc rancher/k8s-dns-kube-dns:1.15.10&
dsc rancher/k8s-dns-kube-dns:1.15.2&
dsc rancher/k8s-dns-node-cache:1.15.13&
dsc rancher/k8s-dns-node-cache:1.15.7&
dsc rancher/k8s-dns-sidecar:1.15.0&
dsc rancher/k8s-dns-sidecar:1.15.10&
dsc rancher/k8s-dns-sidecar:1.15.2&
dsc rancher/kiali-kiali:v1.17&
dsc rancher/kiali-kiali:v1.23.0&
dsc rancher/kiwigrid-k8s-sidecar:0.1.151&
dsc rancher/klipper-helm:v0.2.3&
dsc rancher/klipper-helm:v0.2.7&
dsc rancher/klipper-helm:v0.3.0&
dsc rancher/klipper-lb:v0.1.2&
dsc rancher/kube-api-auth:v0.1.4&
dsc rancher/kubectl:v1.18.0&
dsc rancher/kubectl:v1.18.6&
dsc rancher/kubernetes-external-dns:v0.7.3&
dsc rancher/library-busybox:1.31.1&
dsc rancher/library-nginx:1.19.2-alpine&
dsc rancher/library-traefik:1.7.19&
dsc rancher/local-path-provisioner:v0.0.11&
dsc rancher/local-path-provisioner:v0.0.14&
dsc rancher/log-aggregator:v0.1.6&
dsc rancher/longhornio-csi-attacher:v2.0.0&
dsc rancher/longhornio-csi-node-driver-registrar:v1.2.0&
dsc rancher/longhornio-csi-provisioner:v1.4.0&
dsc rancher/longhornio-csi-resizer:v0.3.0&
dsc rancher/longhornio-longhorn-engine:v1.0.2&
dsc rancher/longhornio-longhorn-instance-manager:v1_20200514&
dsc rancher/longhornio-longhorn-manager:v1.0.2&
dsc rancher/longhornio-longhorn-ui:v1.0.2&
dsc rancher/metrics-server:v0.3.4&
dsc rancher/metrics-server:v0.3.6&
dsc rancher/minio-minio:RELEASE.2020-07-13T18-09-56Z&
dsc rancher/nginx-ingress-controller-defaultbackend:1.5-rancher1&
dsc rancher/nginx-ingress-controller:nginx-0.35.0-rancher1&
dsc rancher/opa-gatekeeper:v3.1.0-beta.7&
dsc rancher/openpolicyagent-gatekeeper:v3.1.1&
dsc rancher/openzipkin-zipkin:2.14.2&
dsc rancher/pause:3.1&
dsc rancher/pause:3.2&
dsc rancher/pipeline-jenkins-server:v0.1.4&
dsc rancher/pipeline-tools:v0.1.15&
dsc rancher/plugins-docker:18.09&
dsc rancher/prom-alertmanager:v0.21.0&
dsc rancher/prom-node-exporter:v1.0.1&
dsc rancher/prom-prometheus:v2.12.0&
dsc rancher/prom-prometheus:v2.18.2&
dsc rancher/prometheus-auth:v0.2.0&
dsc rancher/pstauffer-curl:v1.0.3&
dsc rancher/pushprox-client:v0.1.0-rancher1-client&
dsc rancher/pushprox-proxy:v0.1.0-rancher1-proxy&
dsc rancher/rancher-agent:v2.4.8&
dsc rancher/rancher-agent:v2.5.0&
dsc rancher/rancher-operator:v0.1.0&
dsc rancher/rancher-webhook:v0.1.0-beta5&
dsc rancher/rancher:v2.5.0&
dsc rancher/rke-tools:v0.1.65&
dsc rancher/security-scan:v0.1.14&
dsc rancher/security-scan:v0.2.1&
dsc rancher/shell:v0.1.4&
dsc rancher/sonobuoy-sonobuoy:v0.16.3&
dsc rancher/squareup-ghostunnel:v1.5.2&
dsc rancher/system-upgrade-controller:v0.6.2&
dsc rancher/tekton-utils:v0.1.0&
dsc rancher/thanosio-thanos:v0.15.0&
dsc rancher/webhook-receiver:v0.2.4&
dsc registry:2&
  • 构建频繁 Harbor,mysql 存储和连接老是爆炸,
    如何解决
    独立的 Harbor 子模块 + MySQL Galera 集群 + 镜像共享存储(这个涉及到 harbor 的高可用设计,是一个大话题目,感兴趣下次准备一个议题)

  • rancher 集群添加主机添加 node 节点主机,老是报错找不到镜像或者不匹配
    如何解决
    其实依赖镜像官方都提供了,但是官方提供的镜像,有的版本号是错误的,所以有的镜像,需要自己 使用 docker tag 命令重新编辑一下版本号

集群最终实现

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册