vlambda博客
学习文章列表

读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务

Platform as a Service

顾名思义,平台即服务 (PaaS) 是一种能够按需提供平台的软件解决方案。这些平台可以是任何能够公开服务的平台,例如数据库平台、Java 平台、Java EE 平台、.NET 平台、Node.js 平台等等。

拥有 PaaS 的组织可以轻松快速地满足他们的需求和业务平台,以从一个点运行他们的应用程序、流程和管理一切。

在本章中,我们将介绍以下主题:

  • An introduction to OpenShift
  • OKD (The Origin Community Distribution of Kubernetes)
  • OKD installation
  • Templates
  • Networking
  • Monitoring

An introduction to OpenShift

OpenShift 是一个利用 Kubernetes 编排器的容器平台,支持容器软件生命周期和管理。 OpenShift 是适合开发人员和运营团队的解决方案。

OpenShift for developers

测试您的代码,因为它将进入生产环境。不要跳过任何测试;专注并尽可能多地做出承诺。

每个开发人员都以自己的方式工作,并且在由多个开发人员组成的团队中,编码、使用不同的第三方工具、准备环境和部署应用程序都可以以不同的方式完成。这可能会导致整个开发基础架构的异构环境有许多不同的场景和问题需要解决和解决。 OpenShift 帮助开发人员依赖标准工具、标准环境和标准部署流程。

OpenShift 最受赞赏的功能之一是所谓的 source-to-image (S2I),它自动从源代码构建应用程序并创建一个容器映像,可以轻松快速地运送,没有问题。

当然,OpenShift 提供了交付您自己的容器镜像的功能——您可以创建 Docker 文件、构建镜像并将其推送到 OpenShift 注册表。

OpenShift 应用程序生命周期管理提供从开发到生产环境的一致性,内置管道改进了持续集成以及持续交付和部署。

团队可以从 Jenkins、GitLab、GitLab-CI、Nexus 等标准工具中进行选择,以将它们与 OpenShift 集成。

可以根据选择的技术创建新项目,使用标准模板或基于 JSON 或 YAML 文件创建新项目。通过标准化工具和生命周期管理,S2I 中的简单 Git 推送可以触发应用程序的构建,然后将其直接部署到选择的环境中。

OpenShift for operations

OpenShift 安全、稳定且可扩展。它在您操作的任何地方都提供持续性和稳定性。

OpenShift 依赖于 Kubernetes,这是容器编排方面的事实标准。安装和维护 Kubernetes 集群可能非常具有挑战性,尤其是在处理网络、路由、存储、安全和监控等底层资源时。 OpenShift 提供所有这些开箱即用的功能,轻松快速地提供跨环境的一致性。借助此类功能和集成,运营团队可以致力于添加新节点、扩展应用程序和创建新集群。

OpenShift 提供了两个主要的控制工具:

  • Web console
  • CLI

我们将在章节中描述这些工具提供的用于管理 OpenShift 集群的所有功能稍后

OpenShift 具有三种不同的风格:

  • OpenShift Enterprise, which requires a Red Hat subscription
  • OpenShift Origin, which is the open source community project (renamed OKD since August 2018)
  • OpenShift Online, which is powered by Red Hat and available only online with various plans

为了使用方便,当然也为了免费的成本控制,在本书中,我们将使用开源社区风味的OKD;从现在开始,任何 OpenShift 措辞都将指代 OKD,除非另有说明。 OKD 项目的所有源代码都可以在 GitHub 上的 Apache 许可证(2.0 版)下获得。

OKD

OKD 利用 Kubernetes 技术,并通过提供安全和网络功能对其进行扩展。您可以在在线文档和 GitHub 上找到 OKD 中的 Origin 措辞。 OKD 版本对应于 Kubernetes 发行版——例如,OKD 1.10 包含 Kubernetes 1.10。

OKD 是围绕 Docker 容器打包和 Kubernetes 容器集群管理的核心构建的。前面描述 OpenShift 的所有陈述都适用于 OKD;事实上,OpenShift 是建立在 OKD 之上的。

现在是时候动手做一些更实用的东西来继续我们的云原生应用程序环境之旅了。

Installing OKD

首先,您需要为您的操作系统下载并安装捆绑包,无论是以下任何一种:

  • Linux
  • macOS X
  • Windows

这是链接 https://www.okd.io/download.html

在撰写本文时,OKD 的最新版本是 v3.11.0 build 0cbc58b。您可以下载更新的版本,其中包含一些更新和更改。

另外,请记住,在本书中,我们将提供将在 Linux 系统上运行的说明和示例,因此如果您运行的是不同的操作系统平台,可能会有一些差异:

  1. Once we have downloaded the bundle and unpacked it wherever we want, we will refer to its installation folder as OKD_HOME.

让我们通过查看它包含的内容来检查包:

# cd $OKD_HOME
# ll
total 235116
-rwxrwxr-x. 1 luigi luigi 120350344 Oct 10 18:48 kubectl
-rw-rwxr--. 1 luigi luigi 10759 Oct 10 18:48 LICENSE
-rwxrwxr-x. 1 luigi luigi 120350344 Oct 10 18:48 oc
-rw-rwxr--. 1 luigi luigi 15834 Oct 10 18:48 README.md

除了 README.mdLICENSE 文件之外,我们还有主要文件,即名为 kubectl.exe 的 Kubernetes 控制工具和 OKD名为 oc 的命令行工具。

oc 工具是我们第一个用于启动、停止、配置和管理 OpenShift 集群的管理工具。 OpenShift 使用 Kubernetes API 以自己的方式编排容器,这就是为什么我们还拥有 Kubernetes 控制工具的原因。

  1. Test the installation as follows:
# cd $OKD_HOME
# ./oc version
oc v3.11.0+0cbc58b
kubernetes v1.11.0+d4cacc0
features: Basic-Auth GSSAPI Kerberos SPNEGO
  1. One important thing: you absolutely need Docker installed on your PC. In my environment, I'm running the following Docker version:
# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-60.git9cb56fd.fc27.x86_64
Go version: go1.9.7
Git commit: 9c9378f-unsupported
Built: Sun Jul 8 08:52:30 2018
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-60.git9cb56fd.fc27.x86_64
Go version: go1.9.7
Git commit: 9c9378f-unsupported
Built: Sun Jul 8 08:52:30 2018
OS/Arch: linux/amd64
Experimental: false

如果没有 Docker,可以从 https://www.docker.com/get- 下载开始

让我们回到我们的容器平台 OKD,让我们第一次运行它。这可能需要一些时间,因为它需要下载所有 Docker 镜像才能将我们的平台作为容器化运行。

  1. Open a Terminal window and do the following:
# ./oc cluster up
Getting a Docker client ...
Checking if image openshift/origin-control-plane:v3.11 is available ...
Checking type of volume mount ...
Determining server IP ...
Checking if OpenShift is already running ...
Checking for supported Docker version (=>1.22) ...
Checking if insecured registry is configured properly in Docker ...
Checking if required ports are available ...
Checking if OpenShift client is configured properly ...
Checking if image openshift/origin-control-plane:v3.11 is available ...
Starting OpenShift using openshift/origin-control-plane:v3.11 ...
I1107 10:02:17.533327 29872 config.go:40] Running "create-master-config"
I1107 10:02:19.950416 29872 config.go:46] Running "create-node-config"
I1107 10:02:20.837991 29872 flags.go:30] Running "create-kubelet-flags"
I1107 10:02:21.342993 29872 run_kubelet.go:49] Running "start-kubelet"
I1107 10:02:21.596927 29872 run_self_hosted.go:181] Waiting for the kube-apiserver to be ready ...
ae999762568bI1107 10:06:21.628135 29872 interface.go:26] Installing "kube-proxy" ...
I1107 10:06:21.628195 29872 interface.go:26] Installing "kube-dns" ...
I1107 10:06:21.628235 29872 interface.go:26] Installing "openshift-service-cert-signer-operator" ...
I1107 10:06:21.628275 29872 interface.go:26] Installing "openshift-apiserver" ...
I1107 10:06:21.628576 29872 apply_template.go:81] Installing "kube-dns"
I1107 10:06:21.628571 29872 apply_template.go:81] Installing "openshift-service-cert-signer operator"
I1107 10:06:21.628571 29872 apply_template.go:81] Installing "openshift-apiserver"
I1107 10:06:21.628861 29872 apply_template.go:81] Installing "kube-proxy"
I1107 10:06:24.734288 29872 interface.go:41] Finished installing "kube-proxy" "kube-dns" "openshift-service-cert-signer-operator" "openshift-apiserver"
I1107 10:08:05.759760 29872 run_self_hosted.go:242] openshift-apiserver available
I1107 10:08:05.759791 29872 interface.go:26] Installing "openshift-controller-manager" ...
I1107 10:08:05.759814 29872 apply_template.go:81] Installing "openshift-controller-manager"
I1107 10:08:08.170568 29872 interface.go:41] Finished installing "openshift-controller-manager"
Adding default OAuthClient redirect URIs ...
Adding centos-imagestreams ...
Adding router ...
Adding persistent-volumes ...
Adding registry ...
Adding sample-templates ...
Adding web-console ...
I1107 10:08:08.206912 29872 interface.go:26] Installing "centos-imagestreams" ...
I1107 10:08:08.206937 29872 interface.go:26] Installing "openshift-router" ...
I1107 10:08:08.206949 29872 interface.go:26] Installing "persistent-volumes" ...
I1107 10:08:08.206960 29872 interface.go:26] Installing "openshift-image-registry" ...
I1107 10:08:08.206971 29872 interface.go:26] Installing "sample-templates" ...
I1107 10:08:08.206979 29872 interface.go:26] Installing "openshift-web-console-operator" ...
I1107 10:08:08.207255 29872 apply_list.go:67] Installing "centos-imagestreams"
I1107 10:08:08.207622 29872 interface.go:26] Installing "sample-templates/mongodb" ...
I1107 10:08:08.207642 29872 interface.go:26] Installing "sample-templates/mariadb" ...
I1107 10:08:08.207651 29872 interface.go:26] Installing "sample-templates/mysql" ...
I1107 10:08:08.207661 29872 interface.go:26] Installing "sample-templates/cakephp quickstart" ...
I1107 10:08:08.207673 29872 interface.go:26] Installing "sample-templates/dancer quickstart" ...
I1107 10:08:08.207684 29872 interface.go:26] Installing "sample-templates/django quickstart" ...
I1107 10:08:08.207695 29872 interface.go:26] Installing "sample-templates/nodejs quickstart" ...
I1107 10:08:08.207705 29872 interface.go:26] Installing "sample-templates/postgresql" ...
I1107 10:08:08.207715 29872 interface.go:26] Installing "sample-templates/rails quickstart" ...
I1107 10:08:08.207725 29872 interface.go:26] Installing "sample-templates/jenkins pipeline ephemeral" ...
I1107 10:08:08.207735 29872 interface.go:26] Installing "sample-templates/sample pipeline" ...
I1107 10:08:08.207790 29872 apply_list.go:67] Installing "sample-templates/sample pipeline"
I1107 10:08:08.208061 29872 apply_list.go:67] Installing "sample-templates/mongodb"
I1107 10:08:08.208226 29872 apply_list.go:67] Installing "sample-templates/mariadb"
I1107 10:08:08.208246 29872 apply_template.go:81] Installing "openshift-web-console-operator"
I1107 10:08:08.208475 29872 apply_list.go:67] Installing "sample-templates/cakephp quickstart"
I1107 10:08:08.208677 29872 apply_list.go:67] Installing "sample-templates/nodejs quickstart"
I1107 10:08:08.208703 29872 apply_list.go:67] Installing "sample-templates/postgresql"
I1107 10:08:08.210179 29872 apply_list.go:67] Installing "sample-templates/dancer quickstart"
I1107 10:08:08.210319 29872 apply_list.go:67] Installing "sample-templates/rails quickstart"
I1107 10:08:08.210321 29872 apply_list.go:67] Installing "sample-templates/django quickstart"
I1107 10:08:08.208377 29872 apply_list.go:67] Installing "sample-templates/mysql"
I1107 10:08:08.208401 29872 apply_list.go:67] Installing "sample-templates/jenkins pipeline ephemeral"
I1107 10:08:17.213093 29872 interface.go:41] Finished installing "sample-templates/mongodb" "sample-templates/mariadb" "sample-templates/mysql" "sample-templates/cakephp quickstart" "sample-templates/dancer quickstart" "sample-templates/django quickstart" "sample-templates/nodejs quickstart" "sample-templates/postgresql" "sample-templates/rails quickstart" "sample-templates/jenkins pipeline ephemeral" "sample-templates/sample pipeline"
I1107 10:08:39.004121 29872 interface.go:41] Finished installing "centos-imagestreams" "openshift-router" "persistent-volumes" "openshift-image-registry" "sample-templates" "openshift-web-console-operator"
Login to server ...
Creating initial project "myproject" ...
Server Information ...
OpenShift server started.

该服务器可通过位于 https://127.0.0.1:8443 的 Web 控制台访问。

您登录如下:

User: developer
Password: <any value>
  1. To log in as administrator, use the following:
oc login -u system:admin

让我们分析最重要的方面。有很多日志,但它已经为您完成了许多任务。

首先是命令——我们依靠 oc cluster 命令来运行集群。为什么是集群?因为oc运行了几个容器,也就是几个服务器,有网络、路由、存储、容器注册等等。这比自己提供一切然后配置 Kubernetes 集群要容易得多。

oc 命令带有其他几个标志来帮助你,如下:

# ./oc --help

The OpenShift client

OpenShift 客户端有助于从操作的角度管理平台。您可以将新应用程序、扩展现有应用程序部署到任何 Kubernetes 或 OpenShift 集群。

客户端工具还包括一个特殊的子命令 <​​kbd>adm,用于执行管理任务。

以下是它的使用方法:

oc [flags]

基本命令如下:

  • types: An introduction to concepts and types
  • login: Log in to a server
  • new-project: Request a new project
  • new-app: Create a new application
  • status: Show an overview of the current project
  • project: Switch to another project
  • projects: Display existing projects
  • explain: Documentation of resources
  • cluster: Start and stop OpenShift cluster

构建和部署命令如下:

  • rollout: Manage a Kubernetes deployment or OpenShift deployment config
  • rollback: Revert part of an application back to a previous deployment
  • new-build: Create a new build configuration
  • start-build: Start a new build
  • cancel-build: Cancel running, pending, or new builds
  • import-image: Import images from a Docker registry
  • tag: Tag existing images into image streams

应用管理命令如下:

  • get: Display one or many resources
  • describe: Show details of a specific resource or group of resources
  • edit: Edit a resource on the server
  • set: Commands that help set specific features on objects
  • label: Update the labels on a resource
  • annotate: Update the annotations on a resource
  • expose: Expose a replicated application as a service or route
  • delete: Delete one or more resources
  • scale: Change the number of pods in a deployment
  • autoscale: Auto scale a deployment config, deployment, replication controller, or replica set
  • secrets: Manage secrets
  • serviceaccounts: Manage service accounts in your project

故障排除和调试命令如下:

  • logs: Print the logs for a resource
  • rsh: Start a shell session in a pod
  • rsync: Copy files between local filesystem and a pod
  • port-forward: Forward one or more local ports to a pod
  • debug: Launch a new instance of a pod for debugging
  • exec: Execute a command in a container
  • proxy: Run a proxy to the Kubernetes API server
  • attach: Attach to a running container
  • run: Run a particular image on the cluster
  • cp: Copy files and directories to and from containers.
  • wait: Wait for one condition on one or many resources (this is still experimental)

高级命令如下:

  • adm: Tools for managing a cluster
  • create: Create a resource from a file or from standard input
  • replace: Replace a resource by filename or standard input
  • apply: Apply a config to a resource by filename or standard input
  • patch: Update field(s) of a resource using strategic merge patch
  • process: Process a template into list of resources
  • export: Export resources so they can be used elsewhere
  • extract: Extract secrets or config maps to disk
  • idle: Idle scalable resources
  • observe: Observe changes to resources and react to them (this is still experimental)
  • policy: Manage authorization policy
  • auth: Inspect authorization
  • convert: Convert config files between different API versions
  • import: Commands that import applications
  • image: Useful commands for managing images
  • registry: Commands for working with the registry
  • api-versions: Print the supported API versions on the server, in the form of group/version
  • api-resources: Print the supported API resources on the server

设置命令如下:

  • logout: End the current server session
  • config: Change configuration files for the client
  • whoami: Return information about the current session
  • completion: Output shell completion code for the specified shell (bash or zsh)

其他一些命令如下:

  • ex: Experimental commands under active development
  • help: Get help with any command
  • plugin: Run a command-line plugin
  • version: Display client and server versions

使用 oc <命令> --help 获取有关给定命令的更多信息。

在我们的例子中,我们运行命令 oc cluster 并带上标志。要检查任何复合命令,例如 oc cluster,请使用 --help 指令,如下所示:

# ./oc cluster --help

您可以参考以下链接了解更多信息:https://rasor.github.io/开发与openshift.html

Managing a local OpenShift cluster

OpenShift 集群将在 Docker 主机上作为一体化容器运行。 Docker 主机可以是本地 虚拟机 (VM)、远程机器或本地 Unix 主机。

使用 up 命令在 Docker 主机上启动新集群。

在尝试使用现有的 Docker 连接之前,请确保 Docker 命令正常工作并且您可以创建新容器。

默认路由是使用 nip.io 和集群的主机 IP 设置的。使用 --routing-suffix 标志 to 使用不同的路由后缀。

语法如下:

oc cluster ACTION [flags]

可用的命令如下:

  • add: Add components to an oc cluster up cluster
  • down: Stop OpenShift on Docker
  • status: Show OpenShift on Docker status
  • up: Start OpenShift on Docker with reasonable defaults

使用 oc <命令> --help 获取有关给定命令的更多信息。使用 oc options 获取全局命令行选项列表(这适用于所有命令)。

我们不会深入研究所有复合命令;我们将只解释我们将在旅途中使用的那些。如果您需要更多信息,请查看 https://docs.okd 上的文档。 io/latest/welcome/index.html

要查看真正运行的是什么,我们可以先查看哪些容器正在运行,如下:

# docker ps

这将给出以下屏幕截图中描述的输出:

读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务
Output showing the containers that are running

在日志的最后,我们可以看到 web-console 的一些内容,这是 OKD 平台自动提供的另一个管理工具。

此外,该日志还提供了可在 https://127.0.0.1:8443 访问的 OKD 集群的坐标。

相同的 URL 对图形界面和命令行工具都有效,默认情况下 oc 会自动使用开发者帐户登录,如日志末尾所示:

You are logged in as:
User: developer
Password: <any value>

默认情况下,用户 admin 具有任何密码 创建。超级用户,即系统的真正管理员,是名为 super:admin 的用户,它仅在CLI 中可用,因为它使用证书来登录在。

我们将在本章后面回到 oc 命令,并切换到 Web 控制台。

要通过 UI 访问系统,请将浏览器指向前面描述的 URL,您应该会看到登录表单,如下所示:

读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务

developer 身份登录,您应该会看到以下页面:

读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务

从上面的截图可以看出,OKD 默认为不同的平台(如 WildFly、Node.js 和 Ruby)和数据库(如 MongoDB 和 MariaDB)提供了各种现成的模板供您部署您的应用程序作为容器。

当然,您可以为运行应用程序所需的技术提供自己的模板。

Templates

目前,我们将使用平台默认提供的模板,并在 章节8微服务模式,我们将看到如何为我们的云原生应用程序足球管理器创建模板——由三个数据库、三个后端微服务和两个前端 Angular 应用程序组成。

让我们试试 WildFly 模板:

  1. If you are not already logged in as developer, log in and from the catalog choose the WildFly icon.
  2. You should read through the following wizard; just go through and rely on the defaults:
读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务
  1. Click on the Try Sample Repository link, as follows:
读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务
  1. The template for the WildFly application will prepare the runtime environment in a few seconds, as follows:
读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务
  1. If you click on the Continue to the project overview link, you will see your project with an overview of all deployments (in this case, only this one), as shown in the following screenshot:
读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务
List of deployments in the project

正如您在前面的屏幕截图中看到的那样,构建已经到位,下载源代码并编译应用程序。构建完成后,OKD 平台应该部署一个 pod,其中包含一个运行我们应用程序的容器。一个正常运行的 pod 会显示一个蓝色的环,如下所示:

读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务

概述显示了许多不同的信息。

  1. At the top right, there is the URL to access the application; if you click on http://openshift-jee-sample-myproject.127.0.0.1.nip.io, the following page should be displayed:
读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务
The application after performing the set up

回到我们 WildFly 部署示例的概述,您还应该看到以下网络部分,这是任何应用程序最重要的方面之一。

Networking

OKD 提供了一个路由层来将应用程序暴露给外界。您可以在右侧的网络部分找到我们示例的路由信息​​,标记为 Routes - External Traffic。您可能还注意到左侧的另一个元素,称为 Service - Internal Traffic,OKD 使用该元素进行 pod 到 pod 通信。通过这种方式,不同的 pod 可以使用内部 OKD 网络相互通信。

Services

如果单击服务名称,应该会出现一个新页面,显示有关应用程序如何在内部可见和可访问的详细信息,如下所示:

读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务

服务页面本身也引用了系统用来暴露内部服务的路由。在这种情况下,内部流量绑定到 openshift-jee-sample.myproject.svc Hostname 在端口 8080 上,并映射到名为 openshift-jee-sample< 的 Route /span> 使用不同的 Hostname(显示应用程序的那个)在同一个端口上。

如果您点击 Route 名称上的链接,您应该会看到有关 Route 的详细信息,如下一节所述。

Routes

如前所述,Route 提供外部流量路由,即将应用程序暴露给世界。 WildFly 应用的 Route 应该如下:

读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务

Route 还引用了与服务的内部映射,该映射在 Services 部分中描述。

Monitoring

OKD 平台还为应用程序的工作流程提供基本监控,如下图所示:

读书笔记《hands-on-cloud-native-microservices-with-jakarta-ee》平台即服务

在本书后面,我们将设置 Prometheus 监控工具,以获取有关 OKD 集群状态和应用程序的更详细信息。

Summary

在本章中,我们了解了 OpenShift 所基于的社区项目 OKD。

我们还描述并了解了如何通过服务名称在内部调用应用程序,以及如何通过依赖 Route 组件从平台外部访问应用程序。

在下一章中,我们将描述使用容器设计和构建微服务时使用的常见模式;更具体地说,使用 OpenShift 作为 PaaS。我们还将通过实时示例来实施和测试这些模式的效率。