使用 Kubernetes Secrets 构建 Quarkus 响应式应用

通过使用 Kubernetes Secrets,在为云开发应用程序时遵循安全策略。
2 位读者喜欢这篇文章。
Improve your DevOps security game with Ansible Vault

Opensource.com

许多组织都有安全策略,规定如何存储敏感信息。 当您为云开发应用程序时,您可能需要遵循这些策略,为此您通常必须外部化您的数据存储。 Kubernetes 有一个内置系统来访问外部密钥,学习使用它对于安全的云原生应用至关重要。

在本文中,我将演示如何使用 Kubernetes Secrets 构建具有外部化敏感信息的 Quarkus 响应式应用程序——例如,密码或令牌。 密钥是如何通过从静态代码中删除敏感数据来保护云平台上的应用程序的一个很好的例子。 请注意,您可以在 此 GitHub 存储库中找到本教程的解决方案。

[ 阅读下一篇:用通俗易懂的语言解释 Kubernetes Secrets ]

1. 搭建一个新的响应式 Quarkus 项目

使用 Quarkus 命令行界面 (CLI) 搭建一个新项目。 如果您尚未安装 Quarkus CLI,请根据您的操作系统按照这些 说明进行安装。

在您的项目目录中运行以下 Quarkus CLI 来添加 kubernetes-configresteasy-reactiveopenshift 扩展

$ 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 集群时,您可以在开发者透视图的拓扑视图中找到该应用程序,如下图所示。

A screenshot of Red Hat OpenShift Dedicated. In the left sidebar menu Topology is highlighted, and in the main screen there is a Quarkus icon

(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}

太棒了! 上面的 usernamepassword 与您存储在 db-credentials secret 中的相同。

从哪里了解更多

本指南展示了 Quarkus 如何使开发人员能够使用 Kubernetes Secrets 外部化敏感信息。 在这里查找更多资源,以使用 Kubernetes 上的 Quarkus 开发云原生微服务

您还可以观看这个关于如何使用 Quarkus 管理 Kubernetes Secrets 的逐步 教程视频

danieloh
技术营销、开发者倡导者、CNCF 大使、公共演讲者、已发表的作者、Quarkus、Red Hat Runtimes

评论已关闭。

Creative Commons License本作品基于 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.