初始化 Kubernetes 集群
第一步是初始化 IBM Cloud 上的 Kubernetes 集群。IBM Cloud 可能需要几分钟时间来启动新的 Kubernetes 集群;因此,通过先执行初始化操作,可以在后台运行的同时完成一些其他步骤。
登录到您的 IBM Cloud 帐户。在 Dashboard 页面的右上方,您应该会看到按钮 Create resource 。
如果该按钮未出现在此页面的顶部,请在资源目录页面中查找 Kubernetes Service 。
在本教程中,您将创建一个免费的 Lite Kubernetes 集群
。要初始化 Lite 集群,您需要升级自己的 IBM Cloud 帐户(如果尚未升级)。
别担心。本教程中的所有资源都是免费的;在闲置一段时间(通常为 30 天)后,它们将被关闭,或者被控制在免费限制范围内。您的信用卡对帐单上不会出现任何新的费用。
我也输入了自己的信用卡信息来完成此操作,所以我们是共同进退的!
在您升级帐户之后,选择 Lite ;对于集群名称,使用 living-on-the-cloud ,然后选择 Create cluster :
IBM Cloud 现在将开始初始化 Kubernetes 集群。如前所述,这将需要几分钟时间,因此,在 IBM Cloud 完成初始化过程的同时,可继续执行后续步骤。
创建一个容器注册表
返回到资源目录页面,搜索 Container Registry 并将其选中;它应如下所示:
在创建注册表页面上,您可以查看定价套餐。默认情况下,我们的帐户将设置为 Lite 套餐,因此,它会受到速率限制,以便遵循 0.5GB 存储空间和 5GB 提取数据的限制。
单击 Create 以转至 Registry 主页,其中为您提供 Container Registry 的概述 - 可用的名称空间、注册表和镜像的数量。
配置 IBM Cloud 和 Docker CLI
- 如果您尚未安装 IBM Cloud 命令行界面(CLI),请 下载 并进行安装。
打开终端或命令窗口,然后输入以下命令以验证安装是否成功:
ibmcloud --version
您会获得类似下面的返回结果:
ibmcloud version 0.14.0+3303164-2019-02-07T02:13:34+00:00
让我们开始配置 IBM Cloud CLI 以使用 IBM Cloud 帐户资源。
运行以下命令以安装容器注册表插件:
ibmcloud plugin install container-registry -r Bluemix
完成安装脚本后,运行以下命令以确保安装成功:
ibmcloud cr info
您会获得与下面类似的输出:
Container Registry us.icr.io
Container Registry API endpoint https://us.icr.io/api
IBM Cloud API endpoint https://api.ng.bluemix.net
IBM Cloud account details
IBM Cloud organization details注意:如果先前安装了容器注册表,并且容器注册表 URL 包含" bluemix" 一词,请了解如何更新您的 API 端点。
使用以下命令以通过 IBM Cloud CLI 登录到您的 IBM Cloud 帐户:
ibmcloud login -a https://api.ng.bluemix.net
系统会提示您输入与 IBM Cloud 帐户关联的电子邮件和密码。
注意:如果您使用联合 IBM Cloud 帐户,请执行这些步骤。
在登录后,为容器注册表创建一个名称空间。虽然名称空间的名称可以随意,但在本教程和系列教程中,我将使用 living-on-the-cloud
。
要创建名称空间,请运行以下命令:
ibmcloud cr namespace-add living-on-the-cloud
您会获得以下响应:
Adding namespace 'living-on-the-cloud'...
Successfully added namespace 'living-on-the-cloud'
使用以下命令行登录到容器注册表:
ibmcloud cr login
创建要用于 Docker 命令行的 API 令牌。
ibmcloud cr token-add --description "Living on the Cloud" --non-expiring --readwrite
描述也可以随意,但在本系列教程中,我将使用 "Living on the Cloud" 。
您会获得类似下面的响应:
Token identifier b6ff5759-e085-58da-8086-ead373a9e9da
Token eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJiNmZmNTc1OS1lMDg1LTU4ZGEtODA4Ni1lYWQzNzNhOWU5ZGEiLCJpc3MiOiJyZWdpc3RyeS5uZy5ibHVlbWl4Lm5ldCJ9.1zgwfBe6epmFrh-PfZWR5Kf3ZyyL4M6QFLymLCPyqEM将 Docker 守护程序链接到容器注册表:
docker login us.icr.io -u token
当系统提示您输入密码时,请使用您获得的令牌。
虽小犹荣
现在可以开始做一些我最喜欢的事情了 - 编码。这次只是编写一个简单的应用程序,但是随着您继续学习本系列教程,我将向您展示如何向该应用程序添加新功能。
转至 start.spring.io 。
- Group ID 和 Artifact 可以由您决定,但我分别使用了 com.ibm.developer 和 storm-tracker *(因为我们正在讨论云,而 storm(风暴)即表示云,明白了吗?)。
- 对于 Dependencies ,您将需要引入 Web 。
单击 Generate Project ,这将使用您刚刚输入的值来下载一个脚手架式 Spring Boot 项目的 ZIP 压缩文件。
- 解压缩该压缩文件,然后在您的 IDE 中打开该项目。
目前,storm-tracker 应用程序将仅执行非常简单的"Hello World"。
创建名为 StormTrackerController 的新类并向其添加 @GetMapping ,这将返回 "Hello World"
作为响应。
完整的类应如下所示:
@RestController
@RequestMapping("/api/v1/storms")
public class StormTrackerController {@GetMapping
public ResponseEntity helloWorld(){
return ResponseEntity.ok("Hello World");
}
}此时最好启动该应用程序并验证一切是否正常运行。如果您不熟悉 Spring Boot,那么端点应位于 http:localhost:8080/api/v1/storms 。
在 pom.xml
中,您将添加一个插件来将该应用程序容器化,并将其推送到您刚刚在 IBM Cloud 帐户上设置的容器注册表。
在 pom.xml 中的 下,添加以下内容:
io.fabric8
docker-maven-plugin
true
us.icr.io/living-on-the-cloud/${project.name}
adoptopenjdk/openjdk8-openj9
java
-jar
/${project.build.finalName}.jar
/
dir
artifact让我们快速完成此插件配置的重要部分。
在
下,您将设置名称以及镜像在容器注册表中的存储位置:
<name>us.icr.io/living-on-the-cloud/${project.name}</name>
- us.icr.io 是 IBM Cloud 容器注册表的 API 端点(可能需要进行更改以与您的区域匹配)。
- living-on-the-cloud 是您之前创建的容器名称空间。
- ${project.name} 是仓库的名称,该仓库是一个容器仓库,用于存储所有相关镜像;如果您使用的是之前提供的相同值,那么它可以解析为 storm-tracker 。
在
下,声明应基于哪个镜像来构建 Docker 镜像:
<from>adoptopenjdk/openjdk8-openj9</from>
对于基础 Docker 镜像,您使用的是 AdoptOpenJDK OpenJ9 镜像的 Java 8 版本。(了解有关 AdoptOpenJDK 和 OpenJ9 的更多信息。)Eclipse OpenJ9 是可免费使用的开源 JVM 实现,它大约占用 Hotspot 所用内存的 60%。
同样在 下,您将定义 Docker 镜像的入口点,并将项目工件复制到 Docker 镜像中:
<arg>java</arg> <arg>-jar</arg> <arg>/${project.build.finalName}.jar</arg>
/
dir
artifact
项目工件是在执行 **mvn package** 时构建的 JAR 文件。
弄清楚这一切后,执行以下命令来构建项目,将其容器化,然后将其推送到容器注册表:
mvn package docker:build docker:push
在构建执行结束时,您会看到以下输出:
[INFO] DOCKER> Pushed us.icr.io/living-on-the-cloud/storm-tracker in 14 seconds
如果返回到容器注册表主页,那么您会看到它现在存储了一个镜像:
部署到 Kubernetes
至此,您的 Kubernetes 集群有望完成初始化。要验证是否已完成初始化,请返回到 Dashboard 页面并查看您刚刚创建的集群的状态是否为 Normal 。
下一部分将会执行相当多的命令。但不用担心,我将介绍每一条命令的用法。
将 container-service 插件添加到 IBM Cloud CLI,这还将下载并安装 kubectl
:
ibmcloud plugin install container-service
注意:如果要了解"kubectl"的发音,请 观看权威指南 (由 Waldo Grundenwald 编写)。
将 IBM Cloud CLI 设置为您集群所在的区域。在先前的镜像中,区域为 Dallas(它将转换为 us-south )。如果您的集群位于其他区域,那么可以运行命令 ibmcloud regions
来查看所有区域。
要设置区域,请运行以下命令:
ibmcloud ks region-set us-south
下载您集群的配置信息:
ibmcloud ks cluster-config living-on-the-cloud
此命令的输出响应应如下所示:
export KUBECONFIG=/Users/<username>/.bluemix/plugins/container-service/clusters/living-on-the-cloud/kube-config-hou02-living-on-the-cloud.yml
我们将复制此行并将其粘贴到终端以设置环境变量 KUBECONFIG ( kubectl 将从中读取值)。
要验证 kubectl
能否连接到您的集群,请运行以下命令:
kubectl get nodes
返回的输出应如下所示:
NAME STATUS ROLES AGE VERSION
10.77.223.210 Ready 8h v1.11.7+IKS
在正确配置了命令行后,现在可以开始部署并配置 Spring Boot 应用程序。
部署并运行您之前在集群上创建的镜像:
kubectl run storm-tracker --image=us.icr.io/living-on-the-cloud/storm-tracker
此行告知 Kubernetes 运行 --image argument 所定义的名为 storm-tracker 的镜像。
为了能够从外部 IP 访问您的服务,您需要公开该服务,如下所示:
kubectl expose deployment storm-tracker --port=8080 --target-port=8080 --name=storm-tracker-service --type=NodePort
该代码包含许多项,我将为您分解:
expose
deployment
storm-tracker
--port=8080
--targetPort=8080要查找已公开的端口,可以要求 Kubernetes 提供您刚刚创建的 NodePort
的描述:
kubectl describe service storm-tracker-service
这会提供以下输出:
Name: storm-tracker-service
Namespace: default
Labels: run=storm-tracker
Annotations:
Selector: run=storm-tracker
Type: NodePort
IP: XXX.XXX.XXX.XXX
Port: 8080/TCP
TargetPort: 8080/TCP
NodePort: 30299/TCP
Endpoints: XXX.XXX.XXX.XXX:8080
Session Affinity: None
External Traffic Policy: Cluster
Events:在此示例输出中,公开的端口为 30299 。
您还需要获取 Kubernetes 集群的公共 IP:
ibmcloud ks workers --cluster living-on-the-cloud
输出应如下所示:
ID Public IP Private IP Machine Type State Status Zone Version
kube-hou02-paeb33817993d9417f9ad8cfad7fcf270e-w1 184.172.XXX.XXX XXX.XXX.XXX.XXX free normal Ready hou02 1.11.7_1544使用来自这些输出的公共 IP 和端口,您应该能够在 <public IP>:<exposed port>/api/v1/storms 中调用您的 Spring Boot 应用程序。
结束语
虽然感觉貌似费了很多功夫才完成此过程,但实际上,将镜像部署到 Kubernetes 非常容易。我演示的许多步骤都是一次性初始设置的一部分。这仍然非常简单,在不到 30 分钟的时间里,您从零开始部署了一个可供全球访问的应用程序!
当然,本指南仅介绍了一小部分的 Kubernetes 功能以及现代应用程序通常期望获得的功能。在学习本系列教程的过程中,您将继续了解要添加到此应用程序的新功能,并学习如何在生产环境中自动完成构建、部署和操作应用程序的许多任务。
© 著作权归作者所有