5.4. 从 OpenShift 集群内部配置 HTTPS 连接 Apicurio Registry

以下步骤演示了如何配置 Apicurio Registry 部署,以便从 OpenShift 集群内部为 HTTPS 连接公开端口。

警告

这类连接不能在集群外部直接提供。路由基于主机名,在 HTTPS 连接时进行编码。因此,仍然需要使用边缘终止或其他配置。请参阅 第 5.5 节 “从 OpenShift 集群外部配置 HTTPS 连接到 Apicurio Registry”

前提条件

  • 您必须已安装了 Service Registry Operator。

流程

  1. 生成带有自签名证书的 密钥存储。如果您使用自己的证书,可以跳过这一步。

    keytool -genkey -trustcacerts -keyalg RSA -keystore registry-keystore.jks -storepass password
  2. 创建新机密,以存放密钥存储和密钥存储的密码。

    1. 在 OpenShift Web 控制台的左侧导航菜单中,点 Workloads > Secrets > Create Key/Value Secret
    2. 使用以下值:
      Name: registry-keystore
      Key 1: keystore.jks
      Value 1: registry-keystore.jks (上传的文件)
      Key 2: password
      Value 2: password

      注意

      如果您遇到 java.io.IOException: Invalid keystore format,二进制文件的上传无法正常工作。作为替代方案,使用 cat registry-keystore.jks | base64 -w0 > data.txt 将文件编码为 base64 字符串,并以 yaml 用户身份手动编辑 Secret 资源以手动添加编码的文件。

  3. 编辑 Apicurio Registry 实例的 Deployment 资源。您可以在 Service Registry Operator 的 status 字段中找到正确的名称。

    1. 将密钥存储 secret 添加为卷:

      template:
        spec:
          volumes:
          - name: registry-keystore-secret-volume
            secret:
            secretName: registry-keystore
    2. 添加卷挂载:

      volumeMounts:
        - name: registry-keystore-secret-volume
          mountPath: /etc/registry-keystore
          readOnly: true
    3. 添加 JAVA_OPTIONSKEYSTORE_PASSWORD 环境变量:

      - name: KEYSTORE_PASSWORD
        valueFrom:
          secretKeyRef:
            name: registry-keystore
            key: password
      - name: JAVA_OPTIONS
          value: >-
           -Dquarkus.http.ssl.certificate.key-store-file=/etc/registry-keystore/keystore.jks
           -Dquarkus.http.ssl.certificate.key-store-file-type=jks
           -Dquarkus.http.ssl.certificate.key-store-password=$(KEYSTORE_PASSWORD)
      注意

      在使用字符串插入时顺序非常重要。

    4. 启用 HTTPS 端口:

      ports:
        - containerPort: 8080
          protocol: TCP
        - containerPort: 8443
          protocol: TCP
  4. 编辑 Apicurio Registry 实例的 Service 资源。您可以在 Service Registry Operator 的 status 字段中找到正确的名称。

    ports:
      - name: http
        protocol: TCP
        port: 8080
        targetPort: 8080
      - name: https
        protocol: TCP
        port: 8443
        targetPort: 8443
  5. 验证连接是否正常工作:

    1. 使用 SSH 连接到集群中的 pod (您可以使用 Apicurio Registry pod):

      oc rsh -n default example-apicurioregistry-deployment-vx28s-4-lmtqb
    2. Service 资源查找 Apicurio Registry pod 的集群 IP (请参阅 web 控制台中的 Location 列)。之后,执行测试请求(我们使用自签名证书,因此需要不安全标记):

      curl -k https://172.30.209.198:8443/health
      [...]