Istio 서비스 메시 추가 기능 플러그 인 CA 인증서 문제 해결
이 문서에서는 Istio CA(추가 기능 인증 기관) 인증서 기능과 관련된 일반적인 문제 해결 문제를 설명하고 이러한 문제를 해결하기 위한 솔루션을 제공합니다. 또한 이 문서에서는 서비스 메시 추가 기능에 대한 플러그 인 CA 인증서를 설정하는 일반적인 프로세스를 검토합니다.
참고 항목
이 문서에서는 Istio 수정 버전 asm-1-21
이 클러스터에 배포된다고 가정합니다.
필수 조건
Kubernetes kubectl 도구 또는 유사한 도구를 사용하여 클러스터에 연결합니다. Azure CLI를 사용하여 kubectl을 설치하려면 az aks install-cli 명령을 실행합니다.
다음 Linux 스타일 표준 셸 도구:
grep
sort
tail
awk
xargs
JSON 데이터를 쿼리하기 위한 jq 도구입니다.
일반 설정 프로세스
Istio 추가 기능이 플러그 인 CA 인증서 기능을 사용하도록 설정하기 전에 클러스터에서 비밀 저장소 추가 기능에 대한 Azure Key Vault 공급자를 사용하도록 설정해야 합니다. Azure Key Vault와 클러스터가 동일한 Azure 테넌트에 있는지 확인합니다.
Azure Key Vault 비밀 공급자 추가 기능을 사용하도록 설정한 후에는 추가 기능이 만드는 사용자 할당 관리 ID에 대한 Azure Key Vault에 대한 액세스를 설정해야 합니다.
사용자가 할당한 관리 ID가 Azure Key Vault에 액세스할 수 있는 권한을 부여한 후에는 Istio 추가 기능과 함께 플러그 인 CA 인증서 기능을 사용할 수 있습니다. 자세한 내용은 플러그 인 CA 인증서 를 사용하도록 Istio 추가 기능 사용 섹션을 참조하세요.
클러스터가 Azure Key Vault 비밀의 변경 내용을 자동으로 검색하려면 Azure Key Vault 비밀 공급자 추가 기능에 대해 자동 회전을 사용하도록 설정해야 합니다.
중간 인증서에 대한 변경 내용은 자동으로 적용되지만 배포된 리소스 섹션에 설명된 대로 추가 기능이 배포하는 cronjob에 의해 배포를 다시 시작한 후에
istiod
만 루트 인증서에 대한 변경 내용이 컨트롤 플레인에서 선택됩니다 . 이 cronjob은 10분 간격으로 실행됩니다.
Istio 추가 기능이 플러그 인 CA 인증서를 사용하도록 설정
Istio 추가 기능 플러그 인 CA 인증서 기능을 사용하면 메시에 대한 플러그 인 루트 및 중간 인증서를 구성할 수 있습니다. 추가 기능을 사용하도록 설정할 때 플러그 인 인증서 정보를 제공하려면 Azure CLI에서 az aks mesh enable 명령에 대해 다음 매개 변수를 지정합니다.
매개 변수 | 설명 |
---|---|
--key-vault-id <resource-id> |
Azure Key Vault 리소스 ID입니다. 이 리소스는 관리되는 클러스터와 동일한 테넌트에 있어야 합니다. 이 리소스 ID는 ARM 템플릿(Azure Resource Manager 템플릿) 리소스 ID 형식이어야 합니다. |
--root-cert-object-name <root-cert-obj-name> |
Azure Key Vault의 루트 인증서 개체 이름입니다. |
--ca-cert-object-name <inter-cert-obj-name> |
Azure Key Vault의 중간 인증서 개체 이름입니다. |
--ca-key-object-name <inter-key-obj-name> |
Azure Key Vault의 중간 인증서 프라이빗 키 개체 이름입니다. |
--cert-chain-object-name <cert-chain-obj-name> |
Azure Key Vault의 인증서 체인 개체 이름입니다. |
플러그 인 CA 인증서 기능을 사용하려면 5개의 매개 변수를 모두 지정해야 합니다. 모든 Azure Key Vault 개체는 Secret 형식이어야 합니다.
자세한 내용은 Azure Kubernetes Service에서 Istio 기반 서비스 메시 추가 기능에 대한 CA 인증서 플러그 인을 참조 하세요.
배포된 리소스
플러그 인 인증서 기능에 대한 추가 기능 배포의 일부로 다음 리소스가 클러스터에 배포됩니다.
cacerts
Kubernetes 비밀은 추가 기능 배포 시 네임스페이스에 만들어집니다aks-istio-system
. 이 비밀에는 동기화된 Azure Key Vault 비밀이 포함됩니다.kubectl describe secret cacerts --namespace aks-istio-system
Name: cacerts Namespace: aks-istio-system Labels: secrets-store.csi.k8s.io/managed=true Annotations: <none> Type: opaque Data ==== ca-cert.pem: 1968 bytes ca-key.pem: 3272 bytes cert-chain.pem: 3786 bytes root-cert.pem: 3636 bytes
istio-spc-asm-1-21
SecretProviderClass 개체는 추가 기능 배포 시 네임스페이스에 만들어집니다aks-istio-system
. 이 리소스에는 비밀 저장소 CSI(컨테이너 스토리지 인터페이스) 드라이버에 대한 Azure 관련 매개 변수가 포함되어 있습니다.kubectl get secretproviderclass --namespace aks-istio-system
NAME AGE istio-spc-asm-1-21 14h
istio-ca-root-cert
configmap은 네임스페이aks-istio-system
스 및 모든 사용자 관리 네임스페이스에 만들어집니다. 이 configmap에는 인증 기관에서 사용하는 루트 인증서가 포함되며, 다음과 같이 네임스페이스의 워크로드에서 워크로드 간 통신의 유효성을 검사하는 데 사용됩니다.kubectl describe configmap istio-ca-root-cert --namespace aks-istio-system
Name: istio-ca-root-cert Namespace: aks-istio-system Labels: istio.io/config=true Annotations: <none> Data ==== root-cert.pem: ---- -----BEGIN CERTIFICATE----- <certificate data> -----END CERTIFICATE-----
istio-cert-validator-cronjob-asm-1-21
cronjob 개체는 네임스페이aks-istio-system
스에 만들어집니다. 이 cronjob은 루트 인증서에 대한 업데이트를 확인하기 위해 10분마다 실행되도록 예약됩니다. Kubernetes 비밀에 있는cacerts
루트 인증서가 네임스페이스의 configmapaks-istio-system
과 일치하지istio-ca-root-cert
않으면 배포를istiod-asm-1-21
다시 시작합니다.kubectl get cronjob --namespace aks-istio-system
NAME SCHEDULE SUSPEND ACTIVE istio-cert-validator-cronjob-asm-1-21 */10 * * * * False 0
다음 명령을 실행하여 마지막 실행에 대한 cronjob 로그를 확인할 수 있습니다.
kubectl logs --namespace aks-istio-system $(kubectl get pods --namespace aks-istio-system | grep 'istio-cert-validator-cronjob-' | sort -k8 | tail -n 1 | awk '{print $1}')
이 명령은 루트 인증서 업데이트가 검색되었는지 여부에 따라 다음 출력 메시지 중 하나를 생성합니다.
Root certificate update not detected.
Root certificate update detected. Restarting deployment... deployment.apps/istiod-asm-1-21 restarted Deployment istiod-asm-1-21 restarted.
배포 로그에서 인증서 유형 확인
배포 로그를 istiod
확인하여 자체 서명된 CA 인증서 또는 플러그 인 CA 인증서가 있는지 확인할 수 있습니다. 로그를 보려면 다음 명령을 실행합니다.
kubectl logs deploy/istiod-asm-1-21 --container discovery --namespace aks-istio-system | grep -v validationController
각 인증서 로그 항목 바로 앞에 해당 종류의 인증서를 설명하는 또 다른 로그 항목이 있습니다. 자체 서명된 CA 인증서의 경우 항목에 "etc/cacerts/ca-key.pem에 플러그 인 인증서가 없습니다. 자체 서명된 인증서가 사용됩니다." 플러그 인 인증서의 경우 항목에 "etc/cacerts/ca-key.pem에서 플러그 인 인증서 사용"이 표시됩니다. 인증서와 관련된 샘플 로그 항목은 다음 표에 나와 있습니다.
자체 서명된 CA 인증서에 대한 로그 항목
Timestamp 로그 수준 메시지 2023-11-20T23:27:36.649019Z info ca 파일 서명에 istiod 파일 형식 사용 2023-11-20T23:27:36.649032Z info etc/cacerts/ca-key.pem에는 플러그 인 인증서가 없습니다. 자체 서명된 인증서 사용 2023-11-20T23:27:36.649536Z info x509 인증서 - <인증서 세부 정보> 2023-11-20T23:27:36.649552Z info Istiod 인증서가 다시 로드됨 2023-11-20T23:27:36.649613Z info spiffe 피어 인증서 검증 도구에서 domain cluster.local을 신뢰하는 인증서 1개 추가됨 플러그 인 CA 인증서에 대한 로그 항목
Timestamp 로그 수준 메시지 2023-11-21T00:20:25.808396Z info ca 파일 서명에 istiod 파일 형식 사용 2023-11-21T00:20:25.808412Z info etc/cacerts/ca-key.pem에서 플러그 인 인증서 사용 2023-11-21T00:20:25.808731Z info x509 인증서 - <인증서 세부 정보> 2023-11-21T00:20:25.808764Z info x509 인증서 - <인증서 세부 정보> 2023-11-21T00:20:25.808799Z info x509 인증서 - <인증서 세부 정보> 2023-11-21T00:20:25.808803Z info Istiod 인증서가 다시 로드됨 2023-11-21T00:20:25.808873Z info spiffe 피어 인증서 검증 도구에서 domain cluster.local을 신뢰하는 인증서 1개 추가됨
로그 항목의 인증서 세부 정보는 발급자, 주체, 일련 번호(SN- 긴 16진수 문자열) 및 인증서가 유효한 시기를 정의하는 시작 및 종료 타임스탬프 값에 대해 쉼표로 구분된 값으로 표시됩니다.
자체 서명된 CA 인증서의 경우 한 가지 세부 정보 항목이 있습니다. 이 인증서의 샘플 값은 다음 표에 나와 있습니다.
발급자 | 주제 | SN | NotBefore | NotAfter |
---|---|---|---|---|
"O=cluster.local" | "" | <32자리-16진수-값> | "2023-11-20T23:25:36Z" | "2033-11-17T23:27:36Z" |
플러그 인 CA 인증서의 경우 세 가지 세부 항목이 있습니다. 다른 두 항목은 루트 인증서 업데이트 및 중간 인증서 변경에 대한 것입니다. 이러한 항목에 대한 샘플 값은 다음 표에 나와 있습니다.
발급자 | 주제 | SN | NotBefore | NotAfter |
---|---|---|---|---|
CN=Intermediate CA - A1,O=Istio,L=cluster-A1" | "" | <32자리-16진수-값> | "2023-11-21T00:18:25Z" | "2033-11-18T00:20:25Z" |
CN=Root A,O=Istio" | "CN=Intermediate CA - A1,O=Istio,L=cluster-A1" | <40자리-16진수-값> | "2023-11-04T01:40:22Z" | "2033-11-01T01:40:22Z" |
CN=Root A,O=Istio" | "CN=Root A,O=Istio" | <40자리-16진수-값> | "2023-11-04T01:38:27Z" | "2033-11-01T01:38:27Z" |
일반 문제 해결
문제 1: Azure Key Vault에 대한 액세스가 잘못 설정됨
Azure Key Vault 비밀 공급자 추가 기능을 사용하도록 설정한 후에는 추가 기능의 사용자 할당 관리 ID에 대한 액세스 권한을 Azure Key Vault에 부여해야 합니다. Azure Key Vault에 대한 액세스를 잘못 설정하면 추가 기능 설치가 중단됩니다.
kubectl get pods --namespace aks-istio-system
Pod 목록에서 Pod가 istiod-asm-1-21
상태에 갇혀 Init:0/2
있음을 확인할 수 있습니다.
이름 | READY | 상태 | 다시 시작 | 나이 |
---|---|---|---|---|
istiod-asm-1-21-6fcfd88478-2x95b | 0/1 | 종료 | 0 | 5m55s |
istiod-asm-1-21-6fcfd88478-6x5hh | 0/1 | 종료 | 0 | 5m40s |
istiod-asm-1-21-6fcfd88478-c48f9 | 0/1 | Init:0/2 | 0 | 54s |
istiod-asm-1-21-6fcfd88478-wl8mw | 0/1 | Init:0/2 | 0 | 39s |
Azure Key Vault 액세스 문제를 확인하려면 명령을 실행 kubectl get pods
하여 네임스페이스에 레이블이 있는 secrets-store-provider-azure
Pod를 kube-system
찾습니다.
kubectl get pods --selector app=secrets-store-provider-azure --namespace kube-system --output name | xargs -I {} kubectl logs --namespace kube-system {}
다음 샘플 출력은 Key Vault에 대한 비밀에 대한 "가져오기" 권한이 없기 때문에 "403 사용할 수 없음" 오류가 발생했음을 보여 줍니다.
"탑재 요청을 처리하지 못했습니다." err="objectType:secret, objectName:<secret-object-name>, objectVersion:: keyvault를 가져오는 데 실패했습니다. BaseClient#GetSecret: 요청에 응답하지 않음: StatusCode=403 -- 원래 오류: autorest/azure: 서비스가 오류를 반환했습니다. Status=403 Code=\"Forbidden\" Message=\"User, group 또는 application 'appid=<appid>; oid=<oid>; iss=<iss>'에는 'MyAzureKeyVault; 키 자격 증명 모음에 대한 비밀 가져오기 권한이 없습니다. location=eastus'. 이 문제를 해결하는 데 도움이 되도록 \" InnerError={\"code\":\"AccessDenied\"}"를 참조 https://go.microsoft.com/fwlink/?linkid=2125287하세요.
이 문제를 해결하려면 Azure Key Vault 비밀에 대한 가져오기 및 목록 권한을 얻고 Istio 추가 기능을 다시 설치하여 Azure Key Vault 비밀 공급자 추가 기능에 대한 사용자 할당 관리 ID에 대한 액세스를 설정합니다. 먼저 az aks show 명령을 실행하여 Azure Key Vault 비밀 공급자 추가 기능에 대한 사용자 할당 관리 ID의 개체 ID를 가져옵니다.
OBJECT_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER --query 'addonProfiles.azureKeyvaultSecretsProvider.identity.objectId')
액세스 정책을 설정하려면 가져온 개체 ID를 지정하여 다음 az keyvault set-policy 명령을 실행합니다.
az keyvault set-policy --name $AKV_NAME --object-id $OBJECT_ID --secret-permissions get list
참고 항목
자격 증명 모음 액세스 정책 대신 권한 모델에 Azure RBAC 권한 부여를 사용하여 Key Vault를 만들셨나요? 이 경우 관리 ID에 대한 권한을 만들려면 Azure 역할 기반 액세스 제어를 사용하여 Key Vault 키, 인증서 및 비밀에 대한 액세스 제공을 참조하세요. 추가 기능의 사용자 할당 관리 ID에 대한 Key Vault 판독기용 Azure 역할 할당을 추가합니다.
문제 2: Key Vault 비밀 변경 내용 자동 검색이 설정되지 않음
클러스터가 Azure Key Vault 비밀의 변경 내용을 자동으로 검색하려면 Azure Key Vault 공급자 추가 기능에 대해 자동 회전을 사용하도록 설정해야 합니다. 자동 회전은 중간 및 루트 인증서의 변경 내용을 자동으로 검색할 수 있습니다. Azure Key Vault 공급자 추가 기능을 사용하도록 설정하는 클러스터의 경우 다음 az aks show
명령을 실행하여 자동 회전이 사용하도록 설정되어 있는지 확인합니다.
az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.enableSecretRotation'
클러스터에서 Azure Key Vault 공급자 추가 기능을 사용하도록 설정한 경우 다음 az aks show
명령을 실행하여 회전 폴링 간격을 확인합니다.
az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER | jq -r '.addonProfiles.azureKeyvaultSecretsProvider.config.rotationPollInterval'
Azure Key Vault 비밀은 이전 동기화 후 폴링 간격 시간이 경과하면 클러스터와 동기화됩니다. 기본 간격 값은 2분입니다.
문제 3: 인증서 값이 없거나 잘못 구성됨
Azure Key Vault에서 비밀 개체가 없거나 이러한 개체가 잘못 istiod-asm-1-21
구성된 경우 Pod가 상태가 중단 Init:0/2
되어 추가 기능 설치가 지연될 수 있습니다. 이 문제의 근본 원인을 찾으려면 배포에 대해 istiod
다음 kubectl describe
명령을 실행하고 출력을 확인합니다.
kubectl describe deploy/istiod-asm-1-21 --namespace aks-istio-system
이 명령은 다음 출력 테이블과 유사할 수 있는 이벤트를 표시합니다. 이 예제에서는 누락된 비밀이 문제의 원인입니다.
Type | 원인 | 나이 | 보낸 사람 | 메시지 |
---|---|---|---|---|
Normal | 예약됨 | 3m9s | default-scheduler | aks-userpool-24672518-vmss0000에 aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj 할당 |
Warning | FailedMount | 66s | kubelet | 볼륨을 연결하거나 탑재할 수 없음: 탑재되지 않은 볼륨=[cacerts], 연결되지 않은 볼륨=[], 볼륨을 처리하지 못했습니다=[]: 조건을 기다리는 시간이 초과되었습니다. |
Warning | FailedMount | 61s(x9 over 3m9s) | kubelet | 볼륨 "cacerts"에 대해 MountVolume.SetUp이 실패했습니다. rpc 오류: code = Unknown desc = Pod aks-istio-system/istiod-asm-1-21-6fcfd88478-hqdjj에 대한 비밀 저장소 개체를 탑재하지 못했습니다. err: rpc error: code = Unknown desc = failed to mount objects, error: failed to get objectType:secret, objectName:test-cert-chain, objectVersion:: keyvault. BaseClient#GetSecret: 요청에 응답하지 않음: StatusCode=404 -- 원래 오류: autorest/azure: 서비스가 오류를 반환했습니다. Status=404 Code="SecretNotFound" Message="(name/id) test-cert-chain이 있는 비밀을 이 키 자격 증명 모음에서 찾을 수 없습니다. 이 비밀을 최근에 삭제한 경우 올바른 복구 명령을 사용하여 복구할 수 있습니다. 이 문제를 해결하는 데 도움이 되도록 다음을 참조 https://go.microsoft.com/fwlink/?linkid=2125182하세요. |
리소스
타사 정보 고지 사항
이 문서에 나와 있는 다른 공급업체 제품은 Microsoft와 무관한 회사에서 제조한 것입니다. Microsoft는 이들 제품의 성능이나 안정성에 관하여 명시적이든 묵시적이든 어떠한 보증도 하지 않습니다.
타사 연락처 고지
이 문서에 포함된 타사의 연락처 정보는 이 항목에 대한 추가 정보를 찾는 데 도움을 주기 위한 것입니다. 이 연락처 정보는 공지 없이 변경될 수 있습니다. Microsoft는 타사 연락처 정보의 정확성을 보증하지 않습니다.
도움을 요청하십시오.
질문이 있거나 도움이 필요한 경우 지원 요청을 생성하거나Azure 커뮤니티 지원에 문의하세요. Azure 피드백 커뮤니티에 제품 피드백을 제출할 수도 있습니다.