本文介绍基于火山引擎容器服务(VKE),实现多场景中的云原生改造。本文以从自建 Kubernetes 迁移到 VKE 为例,为您介绍云原生改造过程。
云原生的时代已经到来,云原生技术正在重塑整个软件生命周期,越来越多的用户开始咨询如何对自己的应用做云原生化改造、如何把业务平滑地迁移到云上。每个用户的业务场景都是不同的,有些差异化的业务场景对容器平台也有一些定制化的需求,火山引擎梳理了过去帮助用户迁移的经验,总结出了一些解决方案、最佳实践和工具来帮助用户迁移。
火山引擎容器服务依托火山引擎稳定可靠的 IaaS 能力,提供多种工作负载支持,支持快速弹性伸缩能力,帮助用户提高资源利用率。自研 VPC-CNI 插件将容器网络与 VPC 打通,无性能损耗,显著提升容器网络性能。结合字节跳动内部大规模容器实践经验,输出了一整套完善的容器最佳实践,能够支撑春晚红包等特大活动。同时,火山引擎容器服务拥有 Kubernetes 一致性认证,完全兼容原生 Kubernetes,用户完全不需要担心被单一厂商绑定的问题。
火山引擎容器服务和自建 Kubernetes 集群对比关系,如下表所示。
对比项 | 火山引擎容器服务 | 自建 Kubernetes |
---|---|---|
成本 | Master 全托管+专业服务 | Master 资源消耗 + 研发运维投入 |
弹性 | HPA、ClusterAutoscaler、VCI | HPA |
云服务融合 | CLB、NAS、TOS、TLS、AMS等 | 自建对接 |
实践经验 | 大量用户验证 + 字节跳动春节红包验证 | 摸索踩坑 |
性能与优化 | 高性能服务器 + VPC-CNI 网络性能提升 | 网络损耗大 |
安全 | 专业云安全中心 + 镜像漏洞扫描 | 人工修复 + 处理不及时 + 周期较长 |
apiserver
参数配置。networkpolicy
,需要确认是否有使用到。迁云到 VKE 需要涉及到的组件、数据、服务切换等相关设计。
上述从集群规划到生产流量切换,便是用户业务迁移上云所需要涉及到的方方面面。调试完以上各个组件后,即可进行一部分生产流量的切换。
全栈迁云架构思路分两种:一种是整体迁移,一种是平滑迁移。这两种方式相比,整体迁移更简单,平滑迁移相对复杂但对业务影响小,所以也需要根据用户的实际场景做选择。
容器化整体迁云部分有如下两个小场景:
在进行数据迁移时,可靠迁移是关键。根据数据类型的不同,VKE 会使用与之匹配的企业级迁移工具。数据、应用迁云完成后,需要进一步适配监控、日志等组件,待各个组件调试完毕并通过验收后,可以使用智能 DNS 进行生产流量的切割。
说明
使用的域名需要在火山引擎上进行 域名备案和接入。
在 Kubernetes 集群迁移场景中,镜像仓库之间进行镜像迁移和镜像同步复制是基本需求。而使用 docker pull 或 docker push 结合脚本的传统方式进行镜像同步,有如下几个局限性:
image-syncer 是一个简单、易用的批量镜像迁移和同步复制工具,支持目前主流的基于 Docker Registry V2 搭建的镜像存储服务,例如 CR、Docker、Hub、Quay、自建 Harbor 等。目前 image-syncer 已经初步经过了 TB 级别的生产环境镜像迁移验证。更多信息,请参见image-syncer。
image-syncer 提供了以下几项功能:
使用 image-syncer 时,只需要保证 image-syncer 的运行环境与需要同步的镜像仓库网络连通,即可快速地完成镜像迁移、复制以及增量同步。同时 image-syncer 对硬件资源几乎没有要求,可较大程度减少迁移操作成本。
说明
image-syncer 严格控制网络连接数目等于并发数。只有在单个镜像层过大的情况下,若并发数目过大时,可能会占满内存(内存占用 <= 并发数 * 最大镜像层大小)。
除了使用重传机制规避同步过程中可能出现的偶发问题之外,image-syncer 会在运行结束时统计最后同步失败的镜像个数,并且打印出详细的日志,帮助使用者定位同步过程中出现的问题。
使用 image-syncer 时,需要提供一个配置文件,内容示例如下:
{ "auth": { // 认证字段,其中每个对象为一个registry的一个账号和 // 密码;通常,同步源需要具有pull以及访问tags权限, // 同步目标需要拥有push以及创建仓库权限,如果没有提供,则默认匿名访问 "quay.io": { // registry的url,需要和下面images中对应registry的url相同 "username": "user-1", // 用户名,可选 "password": "********", // 密码,可选 "insecure": true // registry是否是http服务,如果是,insecure字段需要为true,默认是false,可选,支持这个选项需要image-syncer版本 > v1.0.1 }, "cr-demo-cn-beijing.cr.volces.com": { "username": "user-2", "password": "********" }, "registry.hub.docker.com": { "username": "user-3", "password": "********" } }, "images": { // 同步镜像规则字段,其中一条规则包括一个源仓库(键)和一个目标仓库(值) // 同步的最大单位是仓库(repo),不支持通过一条规则同步整个namespace以及registry // 源仓库和目标仓库的格式与docker pull/push命令使用的镜像url类似(registry/namespace/repository:tag) // 源仓库和目标仓库(如果目标仓库不为空字符串)都至少包含registry/namespace/repository // 源仓库字段不能为空,如果需要将一个源仓库同步到多个目标仓库需要配置多条规则 // 目标仓库名可以和源仓库名不同(tag也可以不同),此时同步功能类似于:docker pull + docker tag + docker push "quay.io/coreos/kube-rbac-proxy": "quay.io/ruohe/kube-rbac-proxy", "xxxx":"xxxxx", "xxx/xxx/xx:tag1,tag2,tag3":"xxx/xxx/xx" // 当源仓库字段中不包含tag时,表示将该仓库所有tag同步到目标仓库,此时目标仓库不能包含tag // 当源仓库字段中包含tag时,表示只同步源仓库中的一个tag到目标仓库,如果目标仓库中不包含tag,则默认使用源tag // 源仓库字段中的tag可以同时包含多个(例如"a/b/c:1,2,3"),tag之间通过","隔开,此时目标仓库不能包含tag,并且默认使用原来的tag // 当目标仓库为空字符串时,会将源镜像同步到默认registry的默认namespace下,并且repo以及tag与源仓库相同,默认registry和默认namespace可以通过命令行参数以及环境变量配置,参考下面的描述 } }
创建火山引擎镜像仓库标准版实例,操作方法参见 创建标准版实例。
在 华北 2 (北京) 地域创建名空间(本示例命名空间为 test),用于将自建 Harbor 同步到 CR 标准版实例中。操作步骤,请参见 创建命名空间。
安装 image-syncer Linux amd64 版本。
创建配置文件 demo.json
,将本地搭建的 Harbor 中的 library/nginx
仓库同步到步骤 2 中已创建的 test 命名空间。
{ "auth": { "harbor.test.com:32000": { "username": "admin", "password": "xxxxxxxxx", "insecure": true }, "cr-demo-cn-beijing.cr.volces.com": { "username": "cr_demo", "password": "xxxxxxxx" } }, "images": { "harbor.test.com:32000/library/nginx": "" } }
执行如下命令完成镜像迁移。
./image-syncer --proc=10 --config=./demo.json --registry=cr-demo-cn-beijing.cr.volces.com --namespace=test --retries=10 --log=./log
一次镜像同步会经历生成同步任务、执行同步任务、重试失败任务三个阶段。其中,每个同步任务都代表了一个需要同步的镜像(tag)。如果配置文件中某条规则没有指定 tag,在 生成同步任务 阶段会自动列出源仓库所有 tag,并生成对应的同步任务。如果生成同步任务失败,也会在重试阶段进行重试。