KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的 IT 自动化运维能力,简化企业的 DevOps 工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用 (plug-and-play) 的集成。
作为全栈的多租户容器平台,KubeSphere 提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。KubeSphere 为用户提供构建企业级 Kubernetes 环境所需的多项功能,例如多云与多集群管理、Kubernetes 资源管理、DevOps、应用生命周期管理、微服务治理(服务网格)、日志查询与收集、服务与网络、多租户管理、监控告警、事件与审计查询、存储管理、访问权限控制、GPU 支持、网络策略、镜像仓库管理以及安全管理等。
KubeSphere 还开源了 KubeKey 帮助企业一键在公有云或数据中心快速搭建 Kubernetes 集群,提供单节点、多节点、集群插件安装,以及集群升级与运维。https://kubesphere.io/)。
KubeSphere 为用户屏蔽了基础设施底层复杂的技术细节,帮助企业在各类基础设施之上无缝地部署、更新、迁移和管理现有的容器化应用。通过这种方式,KubeSphere 使开发人员能够专注于应用程序开发,使运维团队能够通过企业级可观测性功能和故障排除机制、统一监控和日志查询、存储和网络管理,以及易用的 CI/CD 流水线等来加快 DevOps 自动化工作流程和交付流程等。
作为一个灵活的轻量级容器 PaaS 平台,KubeSphere 对不同云生态系统的支持非常友好,因为它对原生 Kubernetes 本身没有任何的侵入 (Hack)。换句话说,KubeSphere 可以部署并运行在任何基础架构以及所有版本兼容的 Kubernetes 集群之上,包括虚拟机、物理机、数据中心、公有云和混合云等。
您可以选择在公有云和托管 Kubernetes 集群(例如阿里云、AWS、青云QingCloud、腾讯云、华为云等)上安装 KubeSphere,还可以导入和纳管已有的 Kubernetes 集群。
KubeSphere 可以在不修改用户当前的资源或资产、不影响其业务的情况下部署在现有的 Kubernetes 平台上。有关更多信息,请参见在 Linux 上安装和在 Kubernetes 上安装。
借助开源的模式,KubeSphere 社区驱动着开发工作以开放的方式进行。KubeSphere 100% 开源免费,已大规模服务于社区用户,广泛地应用在以 Docker 和 Kubernetes 为中心的开发、测试及生产环境中,大量服务平稳地运行在 KubeSphere 之上。您可在 GitHub 上找到所有源代码、文档和讨论,所有主要的开源项目介绍可以在开源项目列表中找到。
参考Kubesphere官网进行安装和部署:https://kubesphere.io/zh/docs/
详细操作文档参考Kubesphere:https://kubesphere.io/zh/docs/
本文档面向初次使用 KubeSphere 的集群管理员用户,引导新手用户创建企业空间、创建新的角色和账户,然后邀请新用户进入企业空间后,创建项目和 DevOps 工程,帮助用户熟悉多租户下的用户和角色管理,快速上手 KubeSphere
目前,平台的资源一共有三个层级,包括 集群 (Cluster)、 企业空间 (Workspace)、 项目 (Project) 和 DevOps Project (DevOps 工程),层级关系如下图所示,即一个集群中可以创建多个企业空间,而每个企业空间,可以创建多个项目和 DevOps工程,而集群、企业空间、项目和 DevOps工程中,默认有多个不同的内置角色
示例逻辑
1.1、首先新建一个角色 (user-manager),为该角色授予账号管理和角色管理的权限,然后新建一个账号并给这个账号授予 user-manager 角色
平台角色--创建--user-manager--分配用户管理、角色管理的权限
1.2、 平台管理 → 账户管理,可以看到当前集群中所有用户的列表,点击 创建 按钮
touch-air-hr --> 角色为 user-manager
1.3、user-manager 账户登录来创建下表中的四个账号,ws-manager
将用于创建一个企业空间,并指定其中一个用户名为 ws-admin
作为企业空间管理员
用户名 | 集群角色 | 职责 |
---|---|---|
ws-manager | workspaces-manager | 创建和管理企业空间 |
ws-admin | cluster-regular | 管理企业空间下所有的资源 (本示例用于邀请新成员加入企业空间) |
project-admin | cluster-regular | 创建和管理项目、DevOps 工程,邀请新成员加入 |
project-regular | cluster-regular | 将被 project-admin 邀请加入项目和 DevOps 工程, 用于创建项目和工程下的工作负载、Pipeline 等资源 |
企业空间 (workspace) 是 KubeSphere 实现多租户模式的基础,是用户管理项目、DevOps 工程和企业成员的基本单位
2.1、切换为 ws-manager
登录 KubeSphere,ws-manager 有权限查看和管理平台的所有企业空间;点击左上角的 平台管理
→ 企业空间
,可见新安装的环境只有一个系统默认的企业空间 system-workspace,用于运行 KubeSphere 平台相关组件和服务,禁止删除该企业空间;在企业空间列表点击 创建
mall-workspace – 企业成员 – 邀请成员邀请 ws-admin,并赋予企业空间管理员的角色
2.2、企业空间 mall-workspace
创建完成后,切换为 ws-admin
登录 KubeSphere,点击左侧「进入企业空间」进入企业空间详情页
ws-admin可以从集群成员中邀请新成员加入当前企业空间,然后创建项目和 DevOps 工程。在左侧菜单栏选择
企业空间管理→
成员管理,点击
邀请成员;这一步需要邀请在 步骤 1.6. 创建的两个用户 project-admin
和 project-regular
进入企业空间,且分别授予 workspace-regular
和 workspace-viewer
的角色,此时该企业空间一共有如下三个用户:
分别使用project-admin
和 project-regular
登录,观察不同,admin可以创建项目,regular只有浏览权限
创建工作负载、服务和 CI/CD 流水线等资源之前,需要预先创建项目和 DevOps 工程
3.1、上一步将用户项目管理员 project-admin
邀请进入企业空间后,可切换为 project-admin
账号登录 KubeSphere,默认进入 demo-workspace 企业空间下,点击 创建,选择 创建资源型项目
在弹窗中的 project-regular
点击 "+"
,在项目的内置角色中选择 operator
角色。因此,后续在项目中创建和管理资源,都可以由 project-regular
用户登录后进行操作
3.2、再次使用 project-regular
账户登录,就可以看到它维护的项目
4.1、继续使用 project-admin
用户创建 DevOps 工程。点击 工作台,在当前企业空间下,点击 创建,在弹窗中选择 创建一个 DevOps 工程。DevOps 工程的创建者 project-admin
将默认为该工程的 Owner,拥有 DevOps 工程的最高权限
4.2、. 同上,这一步需要在 demo-devops
工程中邀请用户 project-regular
,并设置角色为 maintainer
,用于对工程内的 Pipeline、凭证等创建和配置等操作。菜单栏选择 工程管理 → 工程成员,然后点击 邀请成员,为用户 project-regular
设置角色为 maintainer
;后续在 DevOps 工程中创建 Pipeline 和凭证等资源,都可以由 project-regular
用户登录后进行操作
4.3、再次使用 project-regular
账户登录,就可以看到它拥有两个项目,一个是微服务商城、另一个是自动化部署的devops
创建WordPress应用
WordPress 是使用 PHP 开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的环境中架设属于自己的网站;本文以创建一个 Wordpress 应用 为例,以创建 KubeSphere 应用的形式将 Wordpress 的组件(MySQL 和 Wordpress)创建后发布至 Kubernetes 中,并在集群外访问 Wordpress 服务
一个完整的 Wordpress 应用会包括以下 Kubernetes 对象,其中 MySQL 作为后端数据库,Wordpress 本身作为前端提供浏览器访问
PersistentVolume(PV)是集群中由管理员配置的一段网络存储,它是集群中的资源,就像节点是集群资源一样;PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod
PersistentVolumeClaim(PVC)是由用户进行存储的请求;它类似于pod,Pod消耗节点资源,PVC消耗PV资源
PVC和PV是一一对应的
project-regular
账号(该已账号已被邀请至示例项目),并开启了外网访问,请参考 多租户管理快速入门MYSQL_ROOT_PASSWORD
即 root 用户的密码属于敏感信息,不适合以明文的方式表现在步骤中,因此以创建密钥的方式来代替该环境变量。创建的密钥将在创建 MySQL 的容器组设置时作为环境变量写入1、以项目普通用户 project-regular
登录 KubeSphere,在当前项目下左侧菜单栏的 配置中心 选择 密钥,点击 创建
2、填写密钥的基本信息,完成后点击 下一步
mysql-secret
MySQL 密钥
MySQL 初始密码
3、密钥设置页,填写如下信息,完成后点击 创建
WORDPRESS_DB_PASSWORD
和 123456
创建应用–按照指导一步步做
2、访问 Wordpress 服务前,查看 wordpress 服务,将外网访问设置为 NodePort
3、点击 更多操作
→ 编辑外网访问
,选择 NodePort
,然后该服务将在每个节点打开一个节点端口,通过 点击访问
即可在浏览器访问 WordPress
4、点击 更多操作
→ 编辑配置文件
,可以看到kubesphere给我们自动生成的yaml文件
至此,您已经熟悉了如何通过创建一个 KubeSphere 应用的方式,通过快速添加多个组件来完成一个应用的构建,最终发布至 Kubernetes;这种创建应用的形式非常适合微服务的构建,只需要将各个组件容器化以后,即可通过这种方式快速创建一个完整的微服务应用并发布 Kubernetes
同时,这种方式还支持用户以 无代码侵入的形式开启应用治理,针对 微服务、流量治理、灰度发布与 Tracing 等应用场景,开启应用治理后会在每个组件中以 SideCar 的方式注入 Istio-proxy 容器来接管流量,后续将以一个 Bookinfo 的示例来说明如何在创建应用中使用应用治理
微服务:服务自治
DevOps:Development 和 Operations 的组合
持续集成是指软件个人研发的部分想软件整体部分交付,频繁的进行集成以便更快的发现其中的错误,持续集成源自于极限编程(XP),是XP最初的12种实践之一
CI需要具备这些
:
持续部署是指当交付的代码通过评审之后,自动部署到生成环境中;持续部署是持续交付的最高阶段,这意味着所有通过了一些列的自动化测试的改动都将自动部署到生产环境,它也可被称为 Continuous Release
开发人员提交代码,持续集成服务器获取代码,执行单元测试,根据测试结果决定是否部署到预演环境,如果成功部署到预演环境,进行整体验收测试,如果测试通过,自动部署到产品环境,全程自动化高效运转
持续部署主要好处是,可以相对独立的部署新的功能,并能快速地收集真实用户的反馈
you build it,you run it
,这是Amazon一年可以完成5000万次部署,平均每个工程师每天部署超过50次的核心秘籍
CI&CD持续交付工具链图
Pipeline 是一系列的插件集合,可以通过组合它们来实现持续集成和持续交付的功能。 Pipeline DSL 为我们提供了一个可扩展的工具集,让我们可以将简单到复杂的逻辑通过代码实现
基于SpringBoot项目构建流水线
下面的流程图简单说明了流水线的完整的工作过程:
流程说明:
- 阶段一. Checkout SCM: 拉取 GitHub 仓库代码
- 阶段二. Unit test: 单元测试,如果测试通过了才继续下面的任务
- 阶段三. SonarQube analysis:sonarQube 代码质量检测
- 阶段四. Build & push snapshot image: 根据行为策略中所选择分支来构建镜像,并将 tag 为
SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER
推送至 Harbor (其中$BUILD_NUMBER
为 pipeline 活动列表的运行序号)- 阶段五. Push latest image: 将 master 分支打上 tag 为 latest,并推送至 DockerHub
- 阶段六. Deploy to dev: 将 master 分支部署到 Dev 环境,此阶段需要审核
- 阶段七. Push with tag: 生成 tag 并 release 到 GitHub,并推送到 DockerHub
- 阶段八. Deploy to production: 将发布的 tag 部署到 Production 环境
注意:
- GitHub 账号或密码带有 “@” 这类特殊字符,需要创建凭证前对其进行 urlencode 编码,可通过一些 第三方网站进行转换,然后再将转换后的结果粘贴到对应的凭证信息中。
- 这里需要创建的是凭证(Credential),不是密钥(Secret)
1、本示例代码仓库中的 Jenkinsfile 需要用到 DockerHub、GitHub 和 kubeconfig (kubeconfig 用于访问接入正在运行的 Kubernetes 集群) 等一共 3 个凭证 (credentials) ,参考 创建凭证 依次创建这三个凭证
2、然后参考 访问 SonarQube 并创建 Token,创建一个 Java 的 Token 并复制
2.1、查看内置安装的 SonarQube
kubectl get svc --all-namespaces
可以看到以NodePort的形式暴露了32303,任意节点ip访问32303端口,admin&admin登录
3、最后在 KubeSphere 中进入 devops-demo
的 DevOps 工程中,与上面步骤类似,在 凭证 下点击 创建,创建一个类型为 秘密文本
的凭证,凭证 ID 命名为 sonar-token,密钥为上一步复制的 token 信息,完成后点击 确定
第一步:Fork项目:登录 GitHub,将本示例用到的 GitHub 仓库 devops-java-sample Fork 至您个人的 GitHub
第二步:修改 Jenkinsfile:
CI/CD 流水线会根据示例项目的 yaml 模板文件,最终将示例分别部署到 kubesphere-sample-dev
和 kubesphere-sample-prod
这两个项目 (Namespace) 环境中,这两个项目需要预先在控制台依次创建,参考如下步骤创建该项目
1、第一步:创建第一个项目:
1.1、使用项目管理员
project-admin
账号登录 KubeSphere,在之前创建的企业空间 (demo-workspace) 下,点击
项目 → 创建
,创建一个
资源型项目
,作为本示例的开发环境,填写该项目的基本信息,完成后点击
下一步
。
kubesphere-sample-dev
,若需要修改项目名称则需在 yaml 模板文件 中修改 namespace1.2、本示例暂无资源请求和限制,因此高级设置中无需修改默认值,点击 创建,项目可创建成功
2、第二步:邀请成员:第一个项目创建完后,还需要项目管理员 project-admin
邀请当前的项目普通用户 project-regular
进入 kubesphere-sample-dev
项目,进入「项目设置」→「项目成员」,点击「邀请成员」选择邀请 project-regular
并授予 operator
角色,若对此有疑问可参考 多租户管理快速入门 - 邀请成员
注意:这里由于github上面的项目一直拉取失败,我将项目导入gitee,并修改了jenkinsfile
查看运行日志
审核流水线
1、点击流水线中 活动
列表下当前正在运行的流水线序列号,页面展现了流水线中每一步骤的运行状态,注意,流水线刚创建时处于初始化阶段,可能仅显示日志窗口,待初始化 (约一分钟) 完成后即可看到流水线。黑色框标注了流水线的步骤名称,示例中流水线共 8 个 stage,分别在 Jenkinsfile-online 中被定义
2、当前页面中点击右上方的 查看日志
,查看流水线运行日志。页面展示了每一步的具体日志、运行状态及时间等信息,点击左侧某个具体的阶段可展开查看其具体的日志。日志可下载至本地,如出现错误,下载至本地更便于分析定位问题
1、若流水线执行成功,点击该流水线下的 代码质量
,即可看到通过 sonarQube 的代码质量检测结果
2、流水线最终 build 的 Docker 镜像也将被成功地 push 到 DockerHub 中,我们在 Jenkinsfile-online 中已经配置过 DockerHub,登录 DockerHub 查看镜像的 push 结果,可以看到 tag 为 snapshot、TAG_NAME(master-1)、latest 的镜像已经被 push 到 DockerHub,并且在 GitHub 中也生成了一个新的 tag 和 release。演示示例页面最终将以 deployment 和 service 分别部署到 KubeSphere 的 kubesphere-sample-dev
和 kubesphere-sample-prod
项目环境中
3、可通过 KubeSphere 回到项目列表,依次查看之前创建的两个项目中的部署和服务的状态。例如,以下查看 kubesphere-sample-prod
项目下的部署。
进入该项目,在左侧的菜单栏点击 工作负载 → 部署,可以看到 ks-sample 已创建成功。正常情况下,部署的状态应该显示 运行
在菜单栏中选择 网络与服务 → 服务 也可以查看对应创建的服务,可以看到该服务的 Virtual IP 为 10.233.42.3
,对外暴露的节点端口 (NodePort) 是 30961
4、查看推送到您个人的 DockerHub 中的镜像,可以看到 devops-java-sample
就是 APP_NAME 的值,而 tag 也是在 jenkinsfile-online 中定义的 tag
5、点击 release
,查看 Fork 到您个人 GitHub(Gitee) repo 中的 v0.0.1
tag 和 release,它是由 jenkinsfile 中的 push with tag
生成的