技术升级改造过程,最难落地的部分就是—容器化。
原因是微服务化后,再加上容器化,肯定会遇到部署难,调试难,访问难,配置难。
难就难在,任何一个没有解决,都没法完全落地。
本文说说容器化工作的容器平台,这部分落地的一些心得。
容器平台难落地,也难在涉及多层次的技术。
涉及 网络、容器、应用框架(Java 微服务的注册中心、配置中心)。
以容器层为中心,向上涉及应用微服务框架、向下涉及容器网络、基础网络。还涉及DevOps工具链、CICD。
目前落地成型后,涉及到的技术:
技术选型 | 地址 | 说明 |
---|---|---|
rancher | https://rancher.com/products/rancher/ | 多k8s集群管理工具 |
rke | https://rancher.com/products/rke/ | 一种k8s发行版 |
tke/ack/cce | 见腾讯云、阿里云、华为云的容器服务 | 公有云k8s paas服务 |
nginx-ingress/traefik | https://github.com/kubernetes/ingress-nginx | ingress controller |
nacos | https://nacos.io/en-us/ | 微服务配置中心、注册中心 |
vyos/nat/路由器/交换机 | https://wiki.vyos.net/ | 可云上部署的,多种协议的路由器、交换机、防火墙 |
s2e-runner | https://github.com/chimeh/cicd-s2e-runner | 二次开发的cicd |
helm | https://helm.sh/ | 开源k8s 部署工具 |
docker-compose | https://docs.docker.com/compose/reference/ | 单机 docker 化工具 |
xxxxxxxxxxxx |
开发小M:应用部署后,我想看日志,看应用访问地址,是否Runing …
要实际大幅提高研发体验,提高效率、质量。除了rancher 安装之外还有不少工作要做。
心得:
下图为某项目,多个微服务应用部署到 Rancher, 的截图。
工作不仅仅是安装。要想大幅提高开发、测试效率。在于安装之外,包括网络、访问方式等方面精心考虑,精心规划!
心得:
部署简单,就是买!买容器服务 腾讯云TKE/阿里云ACK/华为云CCE。
精心规划!
提高效率、提高可维护性,还也在于,在VPC网络、容器网络、ingress、域名、域名解析方面的巧妙设计:
心得:
Q:我的新的代码怎么支持CICD?
容器化,不就是写个Dockerfile吗?
实际上引入微服务技术后,git代码仓库的量变多。就没那么简单了。
A:把那3个文件 COPY 到你顶级目录,提交!
做的工具/流程/指导文章是否好,我们内部经常用于自我评价的:
一句话比一篇文章好、一条命令比几个步骤好!
代码模板,解决什么问题呢,心得:
java 微服务工程模板
仓库名规范: 字母开头,不含点,全小写,可用于域名一部分。
注意 docker-entrypoint.sh 已写成通用的!
cicd-java-refer/
├── docker
│ ├── docker-entrypoint.sh
│ ├── healthy.sh
│ └── ready.sh
├── Dockerfile
├── pom.xml
├── README.md
├── src
│ └── main
│ ├── java
│ └── test
│ └── resources
开发人员只需要简单2步,即可支持CICD:
xxx 是你的git 代码仓库
1. 拷贝 docker/ 整个目录,到 xxx 第一级目录,无需修改。
2. 拷贝 .gitlab-ci.yml,到 xxx 第一级目录,无需修改。
3. 拷贝 Dockerfile,到 xxx 第一级目录,可能需要修改里面EXPOSE。
4. git commit 。
站在
所以:
开发小M:源码给你,帮我部署到Dev环境。
运维小O:点一下gitlab的那个按钮!
运维小O:不想写yaml,简单一条命令或者一个鼠标左键,能搞定就好了。
场景:你维护者3个项目,6个环境的CICD,共70个git project,你会遇到什么问题、难题?
万众归一,所有的流水线能需要 artifact构建、扫描、docker 构建、入库、部署,能不能写成一个通用工具。我只需要维护好、使用好这个工具即可!
心得:
开发一个易用性好的命令行工具,能一条命令完成 源码检测、构建、docker构建、k8s部署、应用IP访问生产、域名生成。
开发小M:每次生产上线,怕!没有安全感。
环境及灰度部署设计,给研发以安全感。
这里的环境设计要综合考虑 基础设施成本、维护成本、团队规模、团队技术能力、可用性、上线稳定性要求。
在非生产的易用性、生产的上线稳定性的的一些,
心得:
环境 | 访问入口(域名/IP) | 业务容器 namespace | 配置中心 | 注册中心 | 数据库 |
---|---|---|---|---|---|
dev环境 | 独立 | 独立,xxx-dev | 独立 | 独立 | 独立 |
test环境 | 独立 | 独立,xxx-test | 独立 | 独立 | 独立 |
uat&pre环境 | 独立 | 独立,xxx-uat | 独立 | 独立 | 独立 |
beta&prod环境 | 独立,2个独立入口,prod入口对外服务 | 独立 | 独立 | 共用 | 共用,beta和prod共用数据库,prod 有灰度 |
开发小M:我本地开IDE,想连入环境调试一下,调用过来!
待续
运维小O:每个应用都要去配域名DNS,好繁琐啊
待续
用了Rancher,容器平台,就没有困难了吗? 不,困难问题还不少,根据落地的经验,一一道来。
运维小O:我在加班,几十个Dockerfile,几十个.gitlab-ci.yaml 又得改一遍。
开发小M:我的应用部署道XX环境了吗?
运维小O:几百个应用,搞不过来啊,上百个yaml要写改呢。
如果不是微服务架构,请跳过部署难。微服务架构下,部署问题会成为一个比较严重的问题。
体现在:
难点1:人工部署缺乏规范性
难点2:人工部署工作量大
deployment.yaml
, service.yaml
,configmap.yaml
,还不说 ingress.gitlab-ci.yaml
或Jenkinsfile
,改一下都要改40多次。难点3:人工部署工作重复、易出错
要点1: 启用 CICD 流水线,支持自动部署。
要点2:赋能开发人员自助配置流水线,非常强调简单性、零维护。
#s2i:1
stages:
- s2i
s2i:
stage: s2i
script:
- s2i .
举例,某个工程支持cicd,只需要把以上代码复制、粘贴替换到.gitlab-ci.yaml
(类似于Jenkinsfile)里,然后提交。s2i完成了很多事情。而devops,只需要维护s2i就行了。
要点3:runner 容器化,和工具集成
场景:来了一个项目,又得搞一个runner或者jenkins-slave。A项目要求kubectl版本1.13,B项目要求1.18。天天yum install, apk add。
既然业务应用容器化,CICD的工具也容器化,不香吗
开源出来地址:https://github.com/chimeh/cicd-s2e-runner/blob/master/Dockerfile
要点4:把应用的源码检测、构建、质量扫描、打docker、生成yaml、部署等等写成一个通用工具s2i
usage:
A cicd tool, from src to artifact, to docker img, deploy into kubernetes:
I. default do all action(artifact,docker,deploy):
s2i /path/to/srctop
II. only do specify action:
s2i /path/to/srctop [ analysis|artifact|docker|deploy|deploy-update-blue ]
1. only do artifact
s2i /path/to/srctop artifact
2. only do docker build push
export DOCKER_REPO=harbor.benload.com
export DOCKER_NS=bu5
s2i /path/to/srctop docker
3. only do kubernetes deploy
export K8S_KUBECONFIG=/root/.kube/config
export K8S_NS_SUFFIX=-dev
export K8S_NS=default
export K8S_DOMAIN_INTERNAL=benload.cn
export K8S_DOMAIN_PUBLIC=bu5-dev.tx
export INGRESS_INTERNAL_ENABLED=1
export INGRESS_PUBLIC_ENABLED=1
export INGRESS_CLASS_INTERNAL=nginx
export INGRESS_CLASS_PUBLIC=nginx
s2i /path/to/srctop deploy
III. do exec cmd:
s2i /path/to/rundir exec wrappercmd [...]
1. do ls on /root directory
s2i /root ls
开发小M:xxx 应用的访问地址是啥?
开发小M:帮我配置一下域名、IP端口,我要公网https访问。
运维小O:好多yaml要写啊!又写错了
运维小O:靠,NodePort端口冲突!
应用部署进Kubernetes集群内了。部署搞定、下一步要访问了。
访问难,难在哪?
难点1:部署后,不能立即直接访问
主机/系统/应用 、主机/系统/docker-compose/应用 方式部署时,访问简单直观。可以使用HOST-IP和HOST-PORT, 如下图。
但是,Kubernetes 里的应用访问呢?
NodePort、Ingress、LoadBalancer配置?微服务化后,难!难在人工工作量大,难在人工缺乏规范性。
难点2:用NodePort 端口有限,不直观,人工配置
难点3:用ingress 只支持https(s),人工配置工作量大
开发小M:这个IP地址:端口是哪个应用的地址?又忘了
开发小M:有没有https
开发小M:每次调试都要提交代码走CICD好慢啊,能不能本地调
开发小M:哪里看日志?
开发小M:…,效率好低,又得加班
待续…
开发小M:容器重启以后啥都没了,我配置放哪里,
开发小M:DEV、TEST的数据库的地址不一样
待续…
待续…
测试小T:谁把我的应用容器重启了,我在测试啊
开发小M:谁重启了我的应用。。。
待续…
待续…
开发小M:我要上生产,怎么个流程
待续…
待续…
待续…
待续…
待续…
待续…
回顾一下我们的容器平台历程,有一些参考意义。
地址:http://docs.rancher.com/rancher/v1.6/en
评价 | 说明 |
---|---|
优 | |
劣 |
地址:https://github.com/kubernetes/dashboard
评价 | 说明 |
---|---|
优 | |
劣 |
地址:https://docs.okd.io/
评价 | 说明 |
---|---|
优 | |
劣 |
RKE 地址:https://rancher.com/products/rke/
Rancher地址:https://rancher.com/products/rancher/
评价 | 说明 |
---|---|
优 | |
劣 |
2020年初,我们经过评估,servicemesh的复杂性过高。
还需要等待技术更成熟,包括易用性,再考虑升级到servicemesh。