许多组织都有安全策略,规定如何存储敏感信息。 当您为云开发应用程序时,您可能需要遵循这些策略,为此您通常必须外部化您的数据存储。 Kubernetes 有一个内置系统来访问外部密钥,学习使用它对于安全的云原生应用至关重要。
在本文中,我将演示如何使用 Kubernetes Secrets 构建具有外部化敏感信息的 Quarkus 响应式应用程序——例如,密码或令牌。 密钥是如何通过从静态代码中删除敏感数据来保护云平台上的应用程序的一个很好的例子。 请注意,您可以在 此 GitHub 存储库中找到本教程的解决方案。
[ 阅读下一篇:用通俗易懂的语言解释 Kubernetes Secrets ]
1. 搭建一个新的响应式 Quarkus 项目
使用 Quarkus 命令行界面 (CLI) 搭建一个新项目。 如果您尚未安装 Quarkus CLI,请根据您的操作系统按照这些 说明进行安装。
在您的项目目录中运行以下 Quarkus CLI 来添加 kubernetes-config
、resteasy-reactive
和 openshift
扩展
$ quarkus create app quarkus-secret-example \
-x resteasy-reactive,kubernetes-config,openshift
输出应如下所示
Looking for the newly published extensions in registry.quarkus.io
selected extensions:
- io.quarkus:quarkus-kubernetes-config
- io.quarkus:quarkus-resteasy-reactive
- io.quarkus:quarkus-openshift
applying codestarts...
📚 java
🔨 maven
📦 quarkus
📝 config-properties
🔧 dockerfiles
🔧 maven-wrapper
🚀 resteasy-reactive-codestart
-----------
[SUCCESS] ✅ quarkus project has been successfully generated in:
--> /tmp/quarkus-secret-example
-----------
Navigate into this directory and get started: quarkus dev
2. 在 Kubernetes 中创建一个 Secret
要管理 Kubernetes Secrets,您有三个选择
- 使用 kubectl
- 使用配置文件
- 节点 Kustomize
使用 kubectl
命令创建一个新的数据库凭证(用户名和密码)。 运行以下命令
$ kubectl create secret generic db-credentials \
--from-literal=username=admin \
--from-literal=password=secret
如果您尚未在本地安装 Kubernetes 集群,或者您没有远程集群,您可以登录 开发者沙盒,这是一个免费的 Red Hat OpenShift 和 CodeReady Workspaces 沙盒环境。
您可以使用以下命令确认 Secret 是否已正确创建
$ kubectl get secret/db-credentials -o yaml
输出应如下所示
apiVersion: v1
data:
password: c2VjcmV0
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-05-02T13:46:18Z"
name: db-credentials
namespace: doh-dev
resourceVersion: "1190920736"
uid: 936abd44-1097-4c1f-a9d8-8008a01c0add
type: Opaque
默认情况下,用户名和密码会被编码。
3. 创建一个新的 RESTful API 来访问 Secret
现在您可以添加一个新的 RESTful(用于 Representational State Transfer)API 来打印存储在 Kubernetes Secret 中的用户名和密码。 Quarkus 使开发人员能够使用 @ConfigureProperty
注释将 secret 视为普通配置。
打开 src/main/java/org/acme
中的 GreetingResource.java
文件。 然后,添加以下方法和配置
@ConfigProperty(name = "username")
String username;
@ConfigProperty(name = "password")
String password;
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/securty")
public Map securty() {
HashMap<String, String> map = new HashMap<>();
map.put("db.username", username);
map.put("db.password", password);
return map;
}
保存文件。
4. 设置 Kubernetes 部署的配置
打开 src/main/resources
目录中的 application.properties
文件。 为 Kubernetes 部署添加以下配置。 在本教程中,我将演示如何使用开发者沙盒,因此这些配置与 OpenShift 集群相关联。
如果您想将其部署到 Kubernetes 集群,您可以直接通过 Docker 容器打包应用程序。 然后,您需要将容器镜像推送到外部容器注册表(例如,Docker Hub、quay.io 或 Google 容器注册表)。
# Kubernetes Deployment
quarkus.kubernetes.deploy=true
quarkus.kubernetes.deployment-target=openshift
openshift.expose=true
quarkus.openshift.build-strategy=docker
quarkus.kubernetes-client.trust-certs=true
# Kubernetes Secret
quarkus.kubernetes-config.secrets.enabled=true
quarkus.kubernetes-config.secrets=db-credentials
保存文件。
5. 构建并将应用程序部署到 Kubernetes
要构建和部署响应式应用程序,您还可以使用以下 Quarkus CLI
$ quarkus build
此命令触发应用程序构建以生成一个 fast-jar
文件。 然后使用 Dockerfile 将应用程序 Jar
文件容器化,该 Dockerfile 在您创建项目时已经在 src/main/docker
目录中生成。 最后,应用程序镜像被推送到 OpenShift 集群内部的集成容器注册表中。
输出应以 BUILD SUCCESS
消息结束。
当您将应用程序部署到开发者沙盒或普通 OpenShift 集群时,您可以在开发者透视图的拓扑视图中找到该应用程序,如下图所示。

(Daniel Oh, CC BY-SA 4.0)
6. 验证敏感信息
要验证您的 Quarkus 应用程序是否可以引用 Kubernetes Secret 中的敏感信息,请使用以下 kubectl
命令获取路由 URL
$ kubectl get route
输出类似于这样
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
quarkus-secret-example quarkus-secret-example-doh-dev.apps.sandbox.x8i5.p1.openshiftapps.com quarkus-secret-example 8080 None
使用 curl
命令 访问 RESTful API
$ curl http://YOUR_ROUTE_URL/hello/security
输出
{db.password=secret, db.username=admin}
太棒了! 上面的 username
和 password
与您存储在 db-credentials
secret 中的相同。
从哪里了解更多
本指南展示了 Quarkus 如何使开发人员能够使用 Kubernetes Secrets 外部化敏感信息。 在这里查找更多资源,以使用 Kubernetes 上的 Quarkus 开发云原生微服务
- 使用 Quarkus 在云上开发应用程序的 7 个指南
- 使用 Stork 和 Quarkus 扩展 Kubernetes 服务发现
- 使用 Helm chart 将 Quarkus 应用程序部署到 Kubernetes
您还可以观看这个关于如何使用 Quarkus 管理 Kubernetes Secrets 的逐步 教程视频。
评论已关闭。