gpt4 book ai didi

azure - 引用 AKS 的 Ingress 使用的来自 Azure Key Vault 的 TLS 证书

转载 作者:行者123 更新时间:2023-12-02 06:54:54 32 4
gpt4 key购买 nike

我正在为驻留在 AKS 中的应用程序设置入口。但是在将证书绑定(bind)到入口时遇到了问题。

正如您在下面看到的,我尝试从 KV 引用 ingress-cert 并通过 SecretProviderClass 在入口中使用它

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: {{ include "secretProvider.name" . }}
spec:
provider: azure
secretObjects:
- secretName: ingress-tls-csi
type: kubernetes.io/tls
data:
- objectName: ingress-cert
key: tls.key
- objectName: ingress-cert
key: tls.crt
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "true"
userAssignedIdentityID: {{ .Values.keyVault.identity }}
keyvaultName: {{ .Values.keyVault.name }}
objects: |
array:
- |
objectName: ingress-cert
objectType: secret
tenantId: {{ .Values.keyVault.tenant }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "ingress.name" . }}
annotations:
kubernetes.io/ingress.class: azure/application-gateway
kubernetes.io/ingress.allow-http: "false"
appgw.ingress.kubernetes.io/override-frontend-port: "443"
spec:
tls:
- hosts:
- {{ .Values.ingress.host }}
secretName: ingress-tls-csi
# Property `rules` is omitted

通过 env 从 pod 访问其他 secret 时工作正常,但对于入口,这是描述它的输出:

Name:             my-ingress
Namespace: my-namespace
Address: x.x.x.x
Default backend: default-http-backend:80
TLS:
ingress-tls-csi terminates my.example.com
Rules:
Host Path Backends
---- ---- --------
Annotations: appgw.ingress.kubernetes.io/override-frontend-port: 443
kubernetes.io/ingress.allow-http: false
kubernetes.io/ingress.class: azure/application-gateway
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning SecretNotFound 3m3s (x2 over 3m10s) azure/application-gateway Unable to find the secret associated to secretId: [my-namespace/ingress-tls-csi]
<小时/>

我已经按照 Use the Azure Key Vault Provider for Secrets Store CSI Driver in an AKS cluster 设置了 KV 集成文档。

但遵循 Set up Secrets Store CSI Driver to enable NGINX Ingress Controller with TLS作为关于如何使用 AGIC 实现相同功能的提示。我注意到该证书作为 secret 添加到 AKS 内,然后在入口内使用 secretName: ingress-tls-csi 进行引用。

kubectl get secret -n $NAMESPACE

NAME TYPE DATA AGE
ingress-tls-csi kubernetes.io/tls 2 1m34s

我假设 ingress 无法直接从 SecretProviderClass 引用 secret ,因为文档中的示例需要使用 ingress-tls-csi 作为 secret 对象,我假设(再次)由 ingress-nginx 图表创建。

我的问题是如何使用 AGIC 实现与 ingress-nginx 示例相同的功能?

<小时/>

其他信息:

  • 我将 AGIC 与 Azure CNI 网络结合使用。
  • Ingress 目前正在使用 kubectl 命令手动添加证书。我需要使用 KV 中的 key 的原因是 AKS 也将被部署在同一域但不同命名空间下的其他人使用,我认为直接访问证书的私钥是一个坏主意。

最佳答案

由于我找不到将 Ingress 与 Azure Key Vault 集成的方法,因此我使用 GitHub Actions 实现了一种解决方法来检索证书并将其添加到 AKS。由于其中大多数是 bash 命令,因此解决方法并非 GitHub Actions 独有。

name: Assign Cerfiticate from KV to AKS

on:
workflow_dispatch:

jobs:
build-push:
name: Assign Cerfiticate from KV to AKS
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2

# Azure Authentication
- uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}

- name: Authenticate and set context to AKS cluster
run: az aks get-credentials --name "my-aks-cluster" --resource-group "my-rg" --admin

- uses: azure/setup-helm@v3
with:
token: ${{ secrets.PAT }}

# Retrieve certificate and private key from Azure Key Vault
- name: Download certificate and private key in PKCS#12 format
run: |
az keyvault secret download --name my-certificate \
--vault-name my-kv \
--encoding base64 \
-f certificate.pfx

- name: Extract private key in RSA format
run: |
openssl pkcs12 -in certificate.pfx -nocerts -nodes -passin pass: | openssl rsa -out private.key

- name: Extract certificate
run: |
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -passin pass: -out certificate.crt

- name: Deploy Kubernetes Configuration
run: |
helm upgrade --install release-name chart-name \
-n my-namespace \
--set-file mychart.ingress.key=private.key \
--set-file mychart.ingress.certificate=certificate.crt

对上述内容的简要说明:

  1. 下载 .pfx 格式的证书和私钥
  2. 使用 OpenSSL 提取到 .crt.key
  3. 使用 --set-file 将提取的文件传递到 helm install/upgrade

这是 secret 和入口配置:

apiVersion: v1
kind: Secret
metadata:
name: ingress-tls
type: kubernetes.io/tls
data:
tls.crt: {{ .Values.ingress.certificate | b64enc }}
tls.key: {{ .Values.ingress.key | b64enc }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "ingress.name" . }}
annotations:
kubernetes.io/ingress.class: azure/application-gateway
kubernetes.io/ingress.allow-http: "false"
appgw.ingress.kubernetes.io/override-frontend-port: "443"
spec:
tls:
- hosts:
- {{ .Values.ingress.host }}
secretName: ingress-tls
# Property `rules` is omitted

无需对 SecretProviderClass 进行任何额外修改。

我希望这只是一个解决方法,因为如果 Ingress 可以直接与 Azure Key Vault 集成,那就更好了。

关于azure - 引用 AKS 的 Ingress 使用的来自 Azure Key Vault 的 TLS 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73292839/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com