这篇文章已发表一年多。旧文章可能包含过时内容。请检查页面信息自发布以来是否已不再准确。
Kubernetes 的简易之道
Kelsey Hightower 写了一份关于 Kubernetes 的无价指南,名为 Kubernetes the Hard Way。对于想要深入了解 Kubernetes 的人来说,这是一份极好的资源——但如果你想轻松使用 Kubernetes 怎么办?这正是我们与 Google Cloud 一直在共同努力的方向。在这篇指南中,我们将向你展示如何启动并运行一个集群,以及如何将你的代码实际部署到该集群并运行它。
这就是 Kubernetes 的简易之道。
我们将实现什么
- 1. 设置一个集群
- 2. 将应用部署到集群
- 3. 使用滚动更新实现自动化部署
前提条件
- 一个容器化应用
- 你也可以使用一个演示应用。
- 一个Google Cloud 账户或另一个提供商上的 Kubernetes 集群
- 集群创建后的所有步骤在所有提供商上都是相同的。
- 一个免费的 Codefresh 账户
- Codefresh 是一个处理 Kubernetes 部署配置和自动化的服务。
我们为开源项目提供了免费的 Codefresh,并为私有项目提供了每月 200 次免费构建,以尽可能简化 Kubernetes 的采用。你可以在任意数量的集群上部署任意数量的应用。
设置集群
- 在cloud.google.com 创建账户并登录。
注意:如果您使用的是 Google Cloud 之外的集群,可以跳过此步骤。
Google Container Engine 是 Google Cloud 的托管式 Kubernetes 服务。在我们的测试中,它既强大又易于使用。
如果您是平台新手,可以在此过程结束时获得 500 美元赠金。
- 打开菜单并向下滚动到 Container Engine。然后选择 Container Clusters。
- 点击 创建集群。
第一步就完成了。根据我的经验,创建集群通常只需要不到 5 分钟。
将应用部署到 Kubernetes
首先前往Codefresh 并使用 GitHub、Bitbucket 或 Gitlab 创建账户。如前所述,Codefresh 对开源项目和小型私有项目都是免费的。我们将使用它来创建将我们的应用部署到 Kubernetes 所需的配置 Yaml 文件。然后我们将部署我们的应用,并自动化这个过程,使其在每次提交代码更改时自动发生。步骤如下:
- 1. 创建 Codefresh 账户
- 2. 连接到 Google Cloud(或其他集群)
- 3. 添加集群
- 4. 部署静态镜像
- 5. 构建和部署镜像
- 6. 自动化流程
连接到 Google Cloud
要连接您在 Google Container Engine 中的集群,请前往账户设置 > 集成 > Kubernetes,然后点击认证。这会提示您使用 Google 凭据登录。
登录后,您的所有集群都会在 Codefresh 中可用。
添加集群
要添加集群,点击向下箭头,然后点击添加集群,选择项目和集群名称。现在您可以部署镜像了!
可选:使用替代集群
要连接非 GKE 集群,我们需要向 Codefresh 添加令牌和证书。前往账户设置(左下角) > 集成 > Kubernetes > 配置 > 添加提供商 > 自定义提供商。展开下拉菜单并点击添加集群。
按照说明生成所需信息并点击保存。您的集群现在会出现在 Kubernetes 选项卡下。
将静态镜像部署到 Kubernetes
现在到了有趣的部分!Codefresh 提供了一个易于修改的样板,它负责配置 Kubernetes 应用的繁重工作。
- 点击 Kubernetes 选项卡:这里显示命名空间列表。
可以将命名空间视为在 Kubernetes 集群上有点像 VLAN 的东西。每个命名空间可以包含所有需要在 Kubernetes 集群中相互通信的服务。现在,我们只使用默认命名空间(简易方法!)。
- 点击添加服务并填写详细信息。
您可以使用我之前提到的演示应用,它有一个 Node.js 前端和 MongoDB 后端。
以下是我们需要提供的信息
集群 - 这是我们之前添加的集群,我们的应用将部署到那里。
命名空间 - 我们将使用默认命名空间,但如果您愿意,可以创建并使用新的命名空间。命名空间是用于对与应用关联的所有服务进行分组的独立单元。
服务名称 - 您可以随意命名服务。由于我们正在部署 Mongo,我将它命名为 mongo!
暴露端口 - 我们暂时不需要将端口暴露到集群外部,因此不勾选此框,但我们将指定一个端口供其他容器与此服务通信。Mongo 的默认端口是“27017”。
镜像 - Mongo 是 Dockerhub 上的一个公共镜像,因此我可以使用名称和标签引用它,例如“mongo:latest”。
内部端口 - 这是 mongo 应用监听的端口,在本例中仍然是“27017”。
现在我们可以忽略其他选项。
- 向下滚动并点击部署。
砰!您刚刚将此镜像部署到了 Kubernetes。通过点击状态,您可以看到服务、部署、副本和 Pod 都已配置并正在运行。如果点击编辑 > 高级,您可以查看和编辑与此应用关联的所有原始 YAML 文件,或者复制它们并将它们放入您的仓库,以便在任何集群上使用。
构建和部署镜像
为了让我们的演示应用的其余部分运行起来,我们需要构建和部署应用的 Node.js 部分。为此,我们需要将我们的仓库添加到 Codefresh。
- 点击仓库 > 添加仓库,然后复制粘贴demochat 仓库 URL(或使用您自己的仓库)。
我们可以选择使用 Dockerfile,或者在需要帮助创建 Dockerfile 时使用模板。在本例中,demochat 仓库已经有一个 Dockerfile,所以我们选择它。点击接下来的几个屏幕,直到镜像构建完成。
构建完成后,镜像会自动保存在 Codefresh Docker 仓库中。您也可以向您的账户添加任何其他仓库并使用它。
要部署镜像,我们需要
- 一个拉取 Secret
- 镜像名称和仓库
- 将使用的端口
创建拉取 Secret
拉取 Secret 是 Kubernetes 集群用于访问私有 Docker 仓库的令牌。要创建一个,我们需要生成令牌并将其保存到 Codefresh。
点击用户设置(左下角)并生成新令牌。
将令牌复制到剪贴板。
前往账户设置 > 集成 > Docker 仓库 > 添加仓库,然后选择Codefresh 仓库。粘贴您的令牌并输入您的用户名(区分大小写)。您的用户名必须与屏幕左下角显示的名称一致。
测试并保存。
之后在部署镜像时,我们就可以创建我们的 Secret 了。
获取镜像名称
- 点击镜像并打开您刚刚构建的镜像。在注释下,您会看到以 r.cfcr.io 开头的镜像名称。
- 复制镜像名称;我们稍后会用到它。
将私有镜像部署到 Kubernetes
我们现在准备好部署我们构建的镜像了。
- 前往 Kubernetes 页面,像我们部署 mongo 时一样,点击添加服务并填写页面。确保选择与之前部署 mongo 时相同的命名空间。
现在我们暴露端口,以便可以访问此应用。这会分配一个 IP 地址并自动配置 Ingress。
- 点击部署:您的应用将在几秒钟内启动并运行!根据您的集群位置,IP 地址分配可能需要更长时间。
在此视图中,您可以扩展副本、查看应用状态以及执行类似任务。
- 点击 IP 地址以查看正在运行的应用。
到目前为止,您的整个应用应该已经启动并运行了!还不错吧?现在该自动化部署了!
自动化部署到 Kubernetes
每次我们对应用进行更改时,都希望构建新镜像并将其部署到集群。我们已经设置了自动化构建,但要自动化部署
点击仓库(左上角)。
点击 demochat 仓库的流水线(齿轮图标)。
在部署之前运行一些测试是个好主意。在构建和单元测试下,为单元测试脚本添加 `npm test`。
点击部署脚本并选择Kubernetes (Beta)。输入您已部署的服务信息。
您可以选择使用仓库中的部署文件,或使用您刚刚生成的部署文件。
- 点击保存。
部署自动化就完成了!现在,无论何时进行更改,镜像都会进行构建、测试和部署。
结论
我们希望让每个团队,而不仅仅是大型企业团队,都能轻松采用 Kubernetes,同时保留 Kubernetes 的所有强大功能和灵活性。在 Kubernetes 服务屏幕上的任何时候,您都可以切换到 YAML 视图,查看本次演练中您执行的配置生成的所有 YAML 文件。您可以修改文件内容,将其复制粘贴到本地文件等。
本次演练为大家提供了一个坚实的基础。准备就绪后,您可以直接调整实体,以指定您想要的精确配置。
我们非常欢迎您的反馈!请在 Twitter 上与我们分享,或者直接联系我们。
补充说明
有没有视频可以带我完成这个过程?当然有。
这是否适用于 Helm Charts?是的!我们目前正在面向有限用户试点 Helm Charts。如果您想尽早尝试,请联系我们。
这适用于任何 Kubernetes 集群吗?它应该适用于任何 Kubernetes 集群,并已针对 Kubernetes 1.5 及更高版本进行了测试。
我可以在自己的数据中心部署 Codefresh 吗?当然可以,Codefresh 是使用 Helm Charts 构建在 Kubernetes 之上的。Codefresh 云版对开源免费,并提供每月 200 次构建。Codefresh 本地部署版目前仅限企业用户。
每次更新时数据库不会被清除吗?是的,在本例中我们跳过了创建持久卷。配置持久卷需要更多一些工作,如果您需要帮助,请随时联系我们,我们很乐意提供帮助!