Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Tillägget för programroutning stöder synkronisering av hemligheter från Azure Key Vault (AKV) för att skydda gateway-API:ets inkommande trafik med TLS-avslutning. Följ stegen nedan för att skapa certifikat och nycklar för att avsluta TLS-trafik på gatewayen.
Förutsättningar
- Aktivera implementeringen av gateway-API:et för programroutning
- Aktivera API-installationen för Managed Gateway
- Ange miljövariabler:
export CLUSTER=<cluster-name> export RESOURCE_GROUP=<resource-group-name> export LOCATION=<location>
Nödvändiga klient-/servercertifikat och nycklar
- Skapa ett rotcertifikat och en privat nyckel för signering av certifikaten för exempeltjänster:
mkdir httpbin_certs
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=example Inc./CN=example.com' -keyout httpbin_certs/example.com.key -out httpbin_certs/example.com.crt
- Generera ett certifikat och en privat nyckel för
httpbin.example.com:
openssl req -out httpbin_certs/httpbin.example.com.csr -newkey rsa:2048 -nodes -keyout httpbin_certs/httpbin.example.com.key -subj "/CN=httpbin.example.com/O=httpbin organization"
openssl x509 -req -sha256 -days 365 -CA httpbin_certs/example.com.crt -CAkey httpbin_certs/example.com.key -set_serial 0 -in httpbin_certs/httpbin.example.com.csr -out httpbin_certs/httpbin.example.com.crt
Konfigurera en TLS-ingressgateway
Konfigurera Azure Key Vault och synkronisera hemligheter till klustret
Skapa Azure Key Vault
Du behöver en Azure Key Vault-resurs för att ange certifikat- och nyckelindata till tillägget för programdirigering.
export AKV_NAME=<azure-key-vault-resource-name> az keyvault create --name $AKV_NAME --resource-group $RESOURCE_GROUP --location $LOCATIONAktivera tillägget Azure Key Vault provider för Secret Store CSI Driver i ditt kluster.
az aks enable-addons --addons azure-keyvault-secrets-provider --resource-group $RESOURCE_GROUP --name $CLUSTEROm ditt Key Vault använder Azure RBAC för behörighetsmodellen följer du anvisningarna här för att tilldela en Azure-roll för Key Vault Secrets User för tilläggets användartilldelade hanterade identitet. Alternativt, om ditt nyckelvalv använder behörighetsmodellen för valvåtkomstprincip kan du auktorisera den användartilldelade hanterade identiteten för tillägget för att få åtkomst till Azure Key Vault-resursen med hjälp av åtkomstprinciper:
OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId' -o tsv | tr -d '\r') CLIENT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.clientId') TENANT_ID=$(az keyvault show --resource-group $RESOURCE_GROUP --name $AKV_NAME --query 'properties.tenantId') az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get listSkapa hemligheter i Azure Key Vault med hjälp av certifikat och nycklar.
az keyvault secret set --vault-name $AKV_NAME --name test-httpbin-key --file httpbin_certs/httpbin.example.com.key az keyvault secret set --vault-name $AKV_NAME --name test-httpbin-crt --file httpbin_certs/httpbin.example.com.crtAnvänd följande manifest för att distribuera SecretProviderClass för att tillhandahålla Azure Key Vault-specifika parametrar till CSI-drivrutinen.
cat <<EOF | kubectl apply -f - apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: httpbin-credential-spc spec: provider: azure secretObjects: - secretName: httpbin-credential type: kubernetes.io/tls data: - objectName: test-httpbin-key key: tls.key - objectName: test-httpbin-crt key: tls.crt parameters: useVMManagedIdentity: "true" userAssignedIdentityID: $CLIENT_ID keyvaultName: $AKV_NAME cloudName: "" objects: | array: - | objectName: test-httpbin-key objectType: secret objectAlias: "test-httpbin-key" - | objectName: test-httpbin-crt objectType: secret objectAlias: "test-httpbin-crt" tenantId: $TENANT_ID EOFOm du vill referera till en certifikatobjekttyp direkt från Azure Key Vault använder du följande manifest för att distribuera SecretProviderClass. I det här exemplet
test-httpbin-cert-pfxär namnet på certifikatobjektet i Azure Key Vault. Mer information finns i avsnittet hämta certifikat och nycklar .cat <<EOF | kubectl apply -f - apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: httpbin-credential-spc spec: provider: azure secretObjects: - secretName: httpbin-credential type: kubernetes.io/tls data: - objectName: test-httpbin-key key: tls.key - objectName: test-httpbin-crt key: tls.crt parameters: useVMManagedIdentity: "true" userAssignedIdentityID: $CLIENT_ID keyvaultName: $AKV_NAME cloudName: "" objects: | array: - | objectName: test-httpbin-cert-pfx #certificate object name from keyvault objectType: secret objectAlias: "test-httpbin-key" - | objectName: test-httpbin-cert-pfx #certificate object name from keyvault objectType: cert objectAlias: "test-httpbin-crt" tenantId: $TENANT_ID EOFAnvänd följande manifest för att distribuera en exempelpodd. CSI-drivrutinen för det hemliga arkivet kräver att en podd refererar till SecretProviderClass-resursen för att säkerställa att hemligheter synkroniseras från Azure Key Vault till klustret.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: secrets-store-sync-httpbin spec: containers: - name: busybox image: mcr.microsoft.com/oss/busybox/busybox:1.33.1 command: - "/bin/sleep" - "10" volumeMounts: - name: secrets-store01-inline mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store01-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "httpbin-credential-spc" EOFKontrollera att hemligheten
httpbin-credentialhar skapats idefaultnamnområdet enligt definitionen i SecretProviderClass-resursen.kubectl describe secret/httpbin-credentialExempel på utdata:
Name: httpbin-credential Namespace: default Labels: secrets-store.csi.k8s.io/managed=true Annotations: <none> Type: kubernetes.io/tls Data ==== tls.crt: 1180 bytes tls.key: 1675 bytes
Distribuera TLS Gateway
Skapa en Kubernetes Gateway som refererar till hemligheten
httpbin-credentialunder TLS-konfigurationen:cat <<EOF | kubectl apply -f - apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: httpbin-gateway spec: gatewayClassName: approuting-istio listeners: - name: https hostname: "httpbin.example.com" port: 443 protocol: HTTPS tls: mode: Terminate certificateRefs: - name: httpbin-credential allowedRoutes: namespaces: from: Selector selector: matchLabels: kubernetes.io/metadata.name: default EOFSkapa sedan en motsvarande
HTTPRouteför att konfigurera gatewayens inkommande trafikvägar:cat <<EOF | kubectl apply -f - apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin spec: parentRefs: - name: httpbin-gateway hostnames: ["httpbin.example.com"] rules: - matches: - path: type: PathPrefix value: /status - path: type: PathPrefix value: /delay backendRefs: - name: httpbin port: 8000 EOFHämta gatewayadressen och porten:
kubectl wait --for=condition=programmed gateways.gateway.networking.k8s.io httpbin-gateway export INGRESS_HOST=$(kubectl get gateways.gateway.networking.k8s.io httpbin-gateway -o jsonpath='{.status.addresses[0].value}') export SECURE_INGRESS_PORT=$(kubectl get gateways.gateway.networking.k8s.io httpbin-gateway -o jsonpath='{.spec.listeners[?(@.name=="https")].port}')Skicka en HTTPS-begäran för att få åtkomst till
httpbintjänsten:curl -v -HHost:httpbin.example.com --resolve "httpbin.example.com:$SECURE_INGRESS_PORT:$INGRESS_HOST" \ --cacert httpbin_certs/example.com.crt "https://httpbin.example.com:$SECURE_INGRESS_PORT/status/418"Du bör se httpbin-tjänsten returnera 418 I'm a Teapot code.