不想先学 Kubernetes,团队怎么跑通第一个云原生试点?
很多团队并不是不认可 Kubernetes,而是在真正开始推进时发现,第一步太重了。
常见情况是:
- 开发团队希望更快上线应用
- 运维团队希望平台标准化
- 管理者知道云原生是方向
- 但团队没有足够时间,先把 Kubernetes 全学一遍,再开始交付业务
于是问题就出现了:
不是方向不对,而是真正落地之前,团队先被复杂度挡住了。
很多团队并不是不认可 Kubernetes,而是在真正开始推进时发现,第一步太重了。
常见情况是:
于是问题就出现了:
不是方向不对,而是真正落地之前,团队先被复杂度挡住了。
还在手搓 K8s 离线安装包?你该升级装备了!
对于运维和开发工程师来说,离线环境部署 Kubernetes往往是一场噩梦。
当你兴致勃勃准备大干一场时,现实通常是这样的:
有没有一种工具,能像在线安装一样丝滑,把 K8s 集群和管理平台一次性端进离线机房?
今天,我们要向大家推荐一款神器 ROI (Rainbond Offline Installer)
ROI 是 Rainbond 团队专为完全离线环境打造的一站式部署工具。
它的目标很简单:让离线环境下的云原生平台交付,变得像 apt-get install 一样简单。
无论你是需要在无网的物理机房交付项目,还是在很多安全限制的内网做 POC,ROI 都能让你事半功倍。
ROI 不止安装 K8s。它提供了一个包含所有依赖的大礼包。
忘掉那些几百行的 Ansible 脚本吧。ROI 的操作逻辑简单到令人发指:
roi up,集群就好了。很多朋友为了离线装 K8s 费尽周折,但装好 K8s 后,如何让不懂 K8s 的开发人员也能用起来? 这才是更大的挑战。
使用 ROI,你在获得一个标准 K8s 集群的同时,还免费获得了一套强大的云原生应用管理平台 —— Rainbond。
Rainbond 能为你做什么?
ROI + Rainbond,不仅解决了怎么装的问题,更解决了怎么用的问题。
眼见为实,让我们看看用 ROI 部署有多简单。
# 下载 ROI 工具
curl -o roi https://get.rainbond.com/roi/roi-amd64 && chmod +x roi
# 一键下载所有离线资源
./roi download
拿到 offline-packages 目录后,通过 U 盘或光盘拷贝到内网服务器。
单机部署下默认会部署 NFS Server,你需要手动安装,如 yum -y install nfs-utils。
TODO:未来会支持自动部署
# 无需任何配置,直接起飞
./roi up
只需编写一个简单的 cluster.yaml:
hosts:
- name: node-1
address: 172.16.0.134
internalAddress: 172.16.0.134
user: root
password: root
- name: node-2
address: 172.16.0.135
internalAddress: 172.16.0.135
user: root
password: root
- name: node-3
address: 172.16.0.136
internalAddress: 172.16.0.136
user: root
password: root
# Role assignment
roleGroups:
etcd: [node-1, node-2, node-3]
master: [node-1, node-2]
worker: [node-1, node-2, node-3]
nfs-server: [node-1]
rbd-gateway: [node-2, node-3]
rbd-chaos: [node-2, node-3]
# Storage configuration
storage:
nfs:
enabled: true
sharePath: /nfs-data/k8s
storageClass:
enabled: true
# Database configuration - MySQL with master-slave replication
database:
mysql:
enabled: true
masterPassword: "RootPassword123!"
replicationPassword: "ReplPassword123!"
# Rainbond configuration
rainbond:
version: v6.4.0-release
然后执行:
./roi up -f cluster.yaml
✅ 安装完成!
终端会直接输出访问地址。打开浏览器,你不仅拥有了一个 Ready 状态的 K8s 集群,更拥有了一个功能完备的 Rainbond 控制台。
离线交付不再难,用 ROI 重新定义你的部署效率。
Kubernetes 已经成为了云原生时代基础设施的事实标准,越来越多的应用系统在 Kubernetes 环境中运行。Kubernetes 已经依靠其强大的自动化运维能力解决了业务系统的大多数运行维护问题,然而还是要有一些状况是需要运维人员去手动处理的。那么和传统运维相比,面向 Kubernetes 解决业务运维问题是否有一些基本思路,是否可以借助其他工具简化排查流程,就是今天探讨的主题。
首先有必要明确一点,什么样的问题算是 Kubernetes 领域的业务系统问题。Kubernetes 目前已经是云原生时代各类 “上云” 业务系统所处运行环境的事实标准。
我们假定你已经拥有了一套健壮的 Kubernetes 环境,业务系统的运行状态不会受到底层运行环境异常的影响,当业务系统出现问题时,Kubernetes 也可以正确的收集到业务系统的运行状态信息。
有了这假定条件之后,我们就可以将业务系统问题约束在业务从部署到正常运行起来这一时间区间内。所以本文探讨的业务系统问题的范畴包括:
解决这一类的问题的意义是显而易见的,因为将业务系统运行起来是一种最基础的需求。具备一套健壮的 Kubernetes 运行环境或者是编写了一套业务系统代码都不会为我们产生直接的价值。只有将业务系统代码运行到一个稳定的环境中,面向最终用户提供服务时才会为我们产生真正的价值。
值得庆幸的是,解决这类问题多半只需要我们踩一次坑。对于大多数全新的业务系统而言,部署到 Kubernetes 环境中去时,所可能遭遇的问题只需要被处理一次。一旦部署完成,业务系统就可以专注于迭代功能,不断 循环完成发布过程即可,顺利进入了一个循环往复的 CI/CD 流程之中。
除去基础需求这一显而易见的意义,我们也会探讨如何降低解决这类问题的难度,解决问题难度的降低本身也具有意义。云原生时代,我们倡导每个开发人员都能够掌控自己的业务系统,这种掌控也对开发人员提出了新的要求,即掌控 Kubernetes 的使用。这有点将运维层面的工作附加给开发人员的意思,实际推广过程并不顺利。为了便于开发人员使用 Kubernetes 来部署与调试自己开发的业务系统,企业可以选择云原生应用平台来降低开发人员使用 Kubernetes 的门槛,Rainbond 就是这样一款云原生应用管理平台,其易用性的特点降低了开发人员的学习门槛,同时能够为业务系统赋能。
正常情况下,负责部署业务系统的工作人员是通过声明式的配置文件来定义业务系统的,其中的关键部分称之为规约(Spec)。这些规约字段通过格式严苛的 Yaml 类型配置文件来定义,正确填写其中的键与值需要庞杂的 Kubernetes 知识的保障。而掌握配置文件的格式,以及配置中的内容,往往是开发人员学习原生 Kubernetes 的首个陡峭门槛。
原生的使用方式中,kubectl 命令行工具会为这些配置文件提供严苛的校验机制,然而在校验无法通过时,能够给出的提示却并不是很友好。
以一份非常简单的 Yaml 配置文件为例:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-nginx
name: my-nginx
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: my-nginx
template:
metadata:
labels:
app: my-nginx
spec:
containers:
- image: nginx
name: nginx
env:
- name: DEMO_GREETING
value: "true" # 此处必须用引号扩起来,因为这是个 string 类型
securityContext:
privileged: true # 此处必须不能使用引号,因为这是个 bool 类型
配置中有两个 true 值,然而其中一个必须使用引号,而另一个则不是,这对一些新手而言并不是很友好。而加载这份配置文件的错误版本时,系统给出的报错虽然可以定位问题,但是交互体验更加不友好。
$ kubectl apply -f my-deployment.yaml
Error from server (BadRequest): error when creating "my-deployment.yaml": Deployment in version "v1" cannot be handled as a Deployment: v1.Deployment.Spec: v1.DeploymentSpec.Template: v1.PodTemplateSpec.Spec: v1.PodSpec.Containers: []v1.Container: v1.Container.Env: []v1.EnvVar: v1.EnvVar.Value: ReadString: expects " or n, but found t, error found in #10 byte of ...|,"value":true}],"ima|..., bigger context ...|ainers":[{"env":[{"name":"DEMO_GREETING","value":true}],"image":"nginx","name":"nginx"}]}}}}
像这样的问题,在类似 Rainbond 这样的云原生应用管理平台中,则不会出现。产品设计之时,就已经屏蔽了一些常见输入错误,用户不需要关注传入值的类型问题,平台会自行进行转换。
平台会自动为环境变量添加引号以匹配 string 类型:

以开启/关闭来体现 bool 类型:

对于一些特殊输入,也会进行合理校验,提供的反馈信息更加人性化:

借助这些功能,即使是小白用户也可以正确的定义业务系统的规格。