이 가이드에서는 기존 VMware용 GKE에 Anthos Service Mesh를 설치하고, Thales Luna HSM 7+ 및 Hashicorp Vault를 사용하여 Istiod의 CA 서명 키를 생성하고 CA 서명 키를 보호하는 방법을 설명합니다.
이전 버전의 Anthos Service Mesh가 설치되어 있는 경우 Anthos Service Mesh VMware용 GKE 업그레이드를 참조하세요. 이 설치는 클러스터에 지원되는 기능을 사용 설정합니다.
시작하기 전에
설정을 시작하기 전에 다음 요구사항을 검토하세요.
요구사항
Anthos 구독이 필요하며 또는 Google Cloud 기반 GKE Enterprise에 한해 사용한 만큼만 지불하는 결제 옵션을 사용할 수 있습니다. 자세한 내용은 GKE Enterprise 가격 책정 가이드를 참조하세요.
이미지 액세스 권한을 받으려면 지원팀에 문의하시기 바랍니다. 지원팀에서 추가 지원도 제공해 드립니다.
Anthos Service Mesh를 설치하는 클러스터에 최소 4개의 vCPU, 15GB 메모리, 4개의 노드가 있는지 확인합니다.
name: protocol[-suffix]
구문을 사용하여 서비스 포트의 이름을 지정해야 합니다. 여기서 대괄호는 대시로 시작해야 하는 선택적 서픽스를 나타냅니다. 자세한 내용은 서비스 포트 이름 지정을 참조하세요.클러스터 버전이 지원되는 환경에 나열되어 있는지 확인합니다. 클러스터 버전을 확인하려면
gkectl
명령줄 도구를 사용합니다.gkectl
이 설치되어 있지 않으면 GKE On-Prem 다운로드를 참조하세요.gkectl version
인프라에는 Thales Luna HSM 7+가 있어야 합니다. HSM에는 네트워크 서비스가 설정되어야 하며 Anthos Service Mesh 클러스터에서 연결할 수 있어야 합니다.
HSM에 액세스하기 위해 사용자 인증 정보를 저장하기 위한 Hashicorp Vault 서버가 인프라에 있어야 합니다. Anthos Service Mesh 클러스터에서 네트워크를 통해 Vault 서버에 연결할 수 있어야 합니다.
환경 설정
Anthos Service Mesh 설치 프로세스를 제어하는 머신에 다음 도구를 설치합니다.
curl
명령줄 도구- Google Cloud CLI
기본 요건 도구를 설치한 후 다음 단계를 수행합니다.
Google Cloud CLI로 인증합니다.
gcloud auth login
구성요소를 업데이트합니다.
gcloud components update
kubectl
을 설치합니다.gcloud components install kubectl
Online Boutique 샘플 애플리케이션으로 설치를 배포하고 테스트하려면
kpt
를 설치합니다.gcloud components install kpt
필요한 경우 컨텍스트를 사용자 클러스터로 전환합니다.
kubectl config use-context CLUSTER_NAME
클러스터 관리자 권한을 사용자 계정(Google Cloud 로그인 이메일 주소)에 부여합니다. Anthos Service Mesh에 필요한 역할 기반 액세스 제어(RBAC) 규칙을 만들려면 이러한 권한이 필요합니다.
kubectl create clusterrolebinding cluster-admin-binding \ --clusterrole=cluster-admin \ --user=USER_ACCOUNT
종속 항목 배포
- Istiod CA 서명 키를 안전하게 관리하기 위해 인프라에 Thales Luna HSM 7+를 배포합니다. HSM에 네트워크 서비스가 있고 Anthos Service Mesh 클러스터에 연결할 수 있는지 확인합니다.
- HSM에 액세스하기 위해 사용자 인증 정보를 저장할 수 있도록 인프라에 Hashicorp Vault 서버를 배포합니다. Vault 서버에 Anthos Service Mesh 클러스터와의 네트워크 연결이 있는지 확인합니다.
- Anthos Server Mesh를 설치할 Vault 서버, HSM 및 Kubernetes 클러스터에 액세스할 수 있는 워크스테이션이 있어야 합니다.
하드웨어 보안 모듈(HSM) 설정
이 섹션에는 하드웨어 보안 모듈(HSM)을 설정하고 암호화 키를 생성하는 단계가 나와 있습니다.
HSM 사용자 인증 정보 및 슬롯 프로비저닝
HSM 설치 가이드에 따라 다음 단계를 수행합니다.
HSM을 네트워크 HSM으로 설정합니다.
클라이언트 키 파일, 클라이언트 인증서 파일, 서버 인증서 파일을 포함하여 HSM과의 mTLS 연결을 위한 PEM 파일을 프로비저닝합니다.
Anthos Service Mesh용 HSM 슬롯을 프로비저닝하고 슬롯 라벨과 PIN을 기록합니다.
HSM 키 암호화 키(KEK)를 생성합니다.
HSM 액세스 권한이 있는 머신에서 HSM 도구를 다운로드합니다(Linux amd-64에만 사용 가능).
gsutil cp gs://artifacts.thalescpl-io-k8s-kms-plugin.appspot.com/binary/k8s-kms-plugin .
HSM 도구를 로컬 서버로 실행하기 전에 환경 변수를 설정합니다. 이 서버는 HSM에 연결되어 로컬 Unix 도메인 소켓(UDS)에 제공됩니다.
export P11_TOKEN=HSM slot label export ChrystokiConfigurationPath=path to the Thales HSM Chrystoki configuration file export P11_LIB=path to the libCryptoki2.so file for accessing the Thales HSM export P11_PIN_FILE=path to the file that stores the HSM slot PIN export SOCKET=/tmp/.hsm-sock ./k8s-kms-plugin serve &
다음과 비슷한 출력이 예상됩니다.
The token has been initialized and is reassigned to slot 412789065 INFO Loaded P11 PIN from file: /home/hsm/hsm-credential/pin line="cmd/serve.go:93" INFO KMS Plugin Listening on : /var/.hsm-sock line="cmd/serve.go:119" INFO Serving on socket: /tmp/.hsm-sock line="cmd/serve.go:198"
HSM에 키 암호화 키(KEK)가 없으면 다음 단계에 따라 생성합니다.
k8s-kms-plugin
을 클라이언트로 사용하여 HSM 도구 서버와 통신합니다. KEK ID를 명시적으로 지정하려면 명령어에--kek-id
플래그를 전달하면 됩니다. 그렇지 않으면 무작위 KEK ID가 자동으로 생성됩니다../k8s-kms-plugin generate-kek --kek-id KEK ID
KEK ID를 기록합니다. 이 ID는 다음 단계에서 사용됩니다.
HSM은 가져온 루트 인증서를 사용하여 서명된 Istiod CA 인증서를 확인합니다. 이 단계에 따라 루트 인증서를 HSM으로 가져옵니다.
k8s-kms-plugin
을 클라이언트로 사용하여 HSM 도구 서버에 연결합니다. 다음 명령어를 사용하여 루트 인증서를 가져옵니다../k8s-kms-plugin import-ca -f root cert PEM file
Vault 인증을 위한 Kubernetes 설정
Kubernetes 클러스터에서
TokenReview
API를 호출하는 Vault에 대한 전용 서비스 계정과 RBAC 정책을 만듭니다. 이 용도를 위한 전용 네임스페이스를 만듭니다.vault
네임스페이스에서 기본 서비스 계정을 만들고, 권한을 설정하고, Vault 서버에서 KubernetesTokenReview
API를 호출할 수 있도록 연결된 JSON 웹 토큰(JWT)을 추출합니다. 참고: 충분한 권한이 있는 경우 Kubernetes 서비스 계정 및 네임스페이스를 사용할 수 있습니다.설정하려는 클러스터에 대해 클러스터 서픽스를 구성합니다. 해당 구성에 전용 디렉터리를 사용합니다.
export CLUSTER_SUFFIX="c1" mkdir ${CLUSTER_SUFFIX} cd ${CLUSTER_SUFFIX}
관리할 클러스터로 전환하고
vault
네임스페이스를 만듭니다.kubectl
이 자동으로 기본 서비스 계정을 만듭니다.kubectl create ns vault
권한을 부여하려면 서비스 계정
default.vault
를auth-delegator
역할에 결합합니다.kubectl apply -f -<< EOF apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: role-tokenreview-binding namespace: vault roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:auth-delegator subjects: - kind: ServiceAccount name: default namespace: vault EOF
토큰 사용자 인증 정보를 포함할 보안 비밀을 만듭니다.
VAULT_SA_SECRET=default-token kubectl apply -n vault -f - << EOF apiVersion: v1 kind: Secret metadata: name: "${VAULT_SA_SECRET}" annotations: kubernetes.io/service-account.name: default type: kubernetes.io/service-account-token EOF
서비스 계정
default.vault
의 JWT를 가져옵니다.VAULT_SA_JWT_TOKEN=$(kubectl get -n vault secret $VAULT_SA_SECRET -o jsonpath="{.data.token}" | base64 --decode) echo $VAULT_SA_JWT_TOKEN > ${CLUSTER_SUFFIX}-tokenreview_jwt cat ${CLUSTER_SUFFIX}-tokenreview_jwt
Kubernetes API 서버의 주소 및 CA 인증서를 검색합니다. 나중에 Kubernetes API 서버를 호출하도록 Vault 서버를 구성합니다.
Kubernetes 공개
IP:Port
값을 가져옵니다.K8S_ADDR=$(kubectl config view -o jsonpath="{.clusters[?(@.name == '$(kubectl config current-context)')].cluster.server}") echo $K8S_ADDR > ${CLUSTER_SUFFIX}-k8s_addr cat ${CLUSTER_SUFFIX}-k8s_addr
Kubernetes API 서버 인증을 위한 인증서를 가져옵니다.
VAULT_SA_CA_CRT=$(kubectl get -n vault secret $VAULT_SA_SECRET -o jsonpath="{.data['ca\.crt']}" | base64 --decode) echo $VAULT_SA_CA_CRT > "${CLUSTER_SUFFIX}-k8s_cert" cat "${CLUSTER_SUFFIX}-k8s_cert"
인증서 파일을 PEM 파일 형식으로 변환하고 검증합니다.
sed -i 's/ CERTIFICATE/CERTIFICATE/g' ${CLUSTER_SUFFIX}-k8s_cert sed -i 's/ /\n/g' ${CLUSTER_SUFFIX}-k8s_cert sed -i 's/CERTIFICATE/ CERTIFICATE/g' ${CLUSTER_SUFFIX}-k8s_cert
인증서가 유효한지 확인합니다.
openssl x509 -in ${CLUSTER_SUFFIX}-k8s_cert -noout -text
이전 디렉터리로 돌아갑니다.
cd ..
이제 클러스터 디렉터리에 있는 3개의 파일을 사용하여 다음 단계에서 Vault를 구성합니다.
HSM 사용자 인증 정보를 저장하도록 Vault 설정
Vault 서버가 유효한 인증서로 TLS 트래픽을 제공하면 Vault PKI와 Kubernetes 인증을 구성합니다. 다음은 단일 루트 CA와 클러스터별 중간 CA를 설정하는 예시입니다.
루트로 Vault에 로그인합니다.
vault login
HSM의 보안 비밀을 저장합니다.
SECRET_PATH=asm-$CLUSTER_SUFFIX vault secrets enable -path=$SECRET_PATH kv vault secrets tune -max-lease-ttl=87600h $SECRET_PATH export HSM_SECRET_PATH="$SECRET_PATH/hsm" vault kv put ${HSM_SECRET_PATH} clientcert=HSM_CLIENT_CERT clientkey=HSM_CLIENT_KEY servercert=HSM_SERVER_CERT PIN=HSM_PIN vault kv get ${HSM_SECRET_PATH}
PKI 경로 권한이 있는 정책을 만듭니다.
vault policy write asm-$CLUSTER_SUFFIX-hsm-policy -<< EOF path "${HSM_SECRET_PATH}" { capabilities = ["read"] } EOF
클러스터에 Kubernetes 인증을 추가합니다.
vault auth enable --path="${HSM_SECRET_PATH}" kubernetes
Kubernetes JWT, Kubernetes 주소, Kubernetes CA 인증서를 Vault 인증 경로에 설정합니다.
vault write auth/${HSM_SECRET_PATH}/config \ token_reviewer_jwt=cat "${CLUSTER_SUFFIX}"-tokenreview_jwt \ kubernetes_host=cat "${CLUSTER_SUFFIX}"-k8s_addr \ kubernetes_ca_cert=@"${CLUSTER_SUFFIX}"-k8s_cert
istiod-service-account.istio-system
이 역할demo
를 인증하도록 허용하고 생성된 정책을 사용합니다.vault write auth/${HSM_SECRET_PATH}/role/istiod \ bound_service_account_names=istiod-service-account \ bound_service_account_namespaces=istio-system \ policies=asm-$CLUSTER_SUFFIX-hsm-policy \ ttl=768h
상위 폴더로 돌아갑니다.
cd ..
설치 파일 다운로드
Linux
Anthos Service Mesh 설치 파일을 현재 작업 디렉터리에 다운로드합니다.
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-linux-amd64.tar.gz
서명 파일을 다운로드하고
openssl
을 사용하여 서명을 확인합니다.curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-linux-amd64.tar.gz.1.sig openssl dgst -verify /dev/stdin -signature istio-1.9.8-asm.6-linux-amd64.tar.gz.1.sig istio-1.9.8-asm.6-linux-amd64.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
예상되는 출력은
Verified OK
입니다.원하는 파일 시스템 위치에 파일 콘텐츠 압축을 풉니다. 예를 들어 콘텐츠를 현재 작업 디렉터리에 추출하려면 다음을 사용하세요.
tar xzf istio-1.9.8-asm.6-linux-amd64.tar.gz
이 명령어는 다음을 포함하는 현재 작업 디렉터리에
istio-1.9.8-asm.6
이라는 설치 디렉터리를 만듭니다.- 샘플 애플리케이션은
samples
디렉터리에 있습니다. - Anthos Service Mesh를 설치하는 데 사용하는
istioctl
명령줄 도구는bin
디렉터리에 있습니다. - Anthos Service Mesh 구성 프로필은
manifests/profiles
디렉터리에 있습니다.
- 샘플 애플리케이션은
Anthos Service Mesh 설치 루트 디렉터리에 있는지 확인합니다.
cd istio-1.9.8-asm.6
MacOS
Anthos Service Mesh 설치 파일을 현재 작업 디렉터리에 다운로드합니다.
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-osx.tar.gz
서명 파일을 다운로드하고
openssl
을 사용하여 서명을 확인합니다.curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-osx.tar.gz.1.sig openssl dgst -sha256 -verify /dev/stdin -signature istio-1.9.8-asm.6-osx.tar.gz.1.sig istio-1.9.8-asm.6-osx.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
예상되는 출력은
Verified OK
입니다.원하는 파일 시스템 위치에 파일 콘텐츠 압축을 풉니다. 예를 들어 콘텐츠를 현재 작업 디렉터리에 추출하려면 다음을 사용하세요.
tar xzf istio-1.9.8-asm.6-osx.tar.gz
이 명령어는 다음을 포함하는 현재 작업 디렉터리에
istio-1.9.8-asm.6
이라는 설치 디렉터리를 만듭니다.- 샘플 애플리케이션은
samples
디렉터리에 있습니다. - Anthos Service Mesh를 설치하는 데 사용하는
istioctl
명령줄 도구는bin
디렉터리에 있습니다. - Anthos Service Mesh 구성 프로필은
manifests/profiles
디렉터리에 있습니다.
- 샘플 애플리케이션은
Anthos Service Mesh 설치 루트 디렉터리에 있는지 확인합니다.
cd istio-1.9.8-asm.6
Windows
Anthos Service Mesh 설치 파일을 현재 작업 디렉터리에 다운로드합니다.
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-win.zip
서명 파일을 다운로드하고
openssl
을 사용하여 서명을 확인합니다.curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.9.8-asm.6-win.zip.1.sig openssl dgst -verify - -signature istio-1.9.8-asm.6-win.zip.1.sig istio-1.9.8-asm.6-win.zip <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
예상되는 출력은
Verified OK
입니다.원하는 파일 시스템 위치에 파일 콘텐츠 압축을 풉니다. 예를 들어 콘텐츠를 현재 작업 디렉터리에 추출하려면 다음을 사용하세요.
tar xzf istio-1.9.8-asm.6-win.zip
이 명령어는 다음을 포함하는 현재 작업 디렉터리에
istio-1.9.8-asm.6
이라는 설치 디렉터리를 만듭니다.- 샘플 애플리케이션은
samples
디렉터리에 있습니다. - Anthos Service Mesh를 설치하는 데 사용하는
istioctl
명령줄 도구는bin
디렉터리에 있습니다. - Anthos Service Mesh 구성 프로필은
manifests/profiles
디렉터리에 있습니다.
- 샘플 애플리케이션은
Anthos Service Mesh 설치 루트 디렉터리에 있는지 확인합니다.
cd istio-1.9.8-asm.6
제어 영역에서 리소스 설정
환경 변수를 설정합니다.
export CLUSTER_SUFFIX="c1" export VAULT_ADDR="https://VAULT_IP:PORT"
Vault 인증을 위한 인증서가 포함된 파일을
cert
라는 파일에 복사합니다. 예를 들어 Vault 서버의 TLS 인증서는${VAULT_CACERT}
입니다.cp ${VAULT_CACERT} ./cert
istio-system
네임스페이스의 파일에서ConfigMap
을 만듭니다.kubectl create ns istio-system kubectl delete configmap vault-tls-cert -n istio-system kubectl create configmap vault-tls-cert -n istio-system --from-file=./cert
유효성 검증 웹훅 구성
Anthos Service Mesh를 설치할 때 istiod
에 버전 라벨을 설정합니다. 유효성 검증 웹훅에 동일한 버전을 설정해야 합니다.
다음 YAML을 istiod-service.yaml
파일에 복사합니다.
apiVersion: v1
kind: Service
metadata:
name: istiod
namespace: istio-system
labels:
istio.io/rev: asm-198-6
app: istiod
istio: pilot
release: istio
spec:
ports:
- port: 15010
name: grpc-xds # plaintext
protocol: TCP
- port: 15012
name: https-dns # mTLS with k8s-signed cert
protocol: TCP
- port: 443
name: https-webhook # validation and injection
targetPort: 15017
protocol: TCP
- port: 15014
name: http-monitoring # prometheus stats
protocol: TCP
selector:
app: istiod
istio.io/rev: asm-198-6
Anthos Service Mesh 설치
Vault 및 HSM과 상호작용하도록 ASM을 구성하는 환경 변수를 설정합니다. 다음 명령어는 운영자의 대기 중인 가져오기 작업으로 인해 Istiod가 완전히 준비되지 않았으므로 대기 시간을 10초로 단축합니다.
export HSM_SLOT_LABEL=the HSM slot label export VAULT_ADDR=address of the vault server export HSM_SECRET_PATH=the path to the HSM secret on Vault export KEK_ID=the HSM slot KEK ID export HSM_PLUGIN_IMAGE=gcr.io/thalescpl-io-k8s-kms-plugin/hsm-plugin:asm-1.7-1 export VAULT_CLIENT_IMAGE=gcr.io/gke-release/asm/vaultclient:latest export WAIT_FOR_RESOURCES_TIMEOUT=10s
다음 명령어를 실행하여
asm-multicloud
프로필로 Anthos Service Mesh를 설치합니다. 지원되는 선택 기능을 사용 설정하려면 다음 명령줄에-f
와 YAML 파일 이름을 포함합니다. 자세한 내용은 선택 기능 사용 설정을 참조하세요.istioctl install --set profile=asm-multicloud \ --set revision=asm-198-6 \ --set values.hsm.enabled=true \ --set values.hsm.hsmKEKID=${KEK_ID} \ --set values.hsm.hsmPluginImage=${HSM_PLUGIN_IMAGE} \ --set values.hsm.hsmSlotLabel=${HSM_SLOT_LABEL} \ --set values.hsm.vaultClientImage=${VAULT_CLIENT_IMAGE} \ --set values.hsm.vaultAddr=${VAULT_ADDR} \ --set values.hsm.vaultAuthPath=auth/${HSM_SECRET_PATH}/login \ --set values.hsm.vaultAuthRole=istiod \ --set values.hsm.vaultAuthJwtPath="/var/run/secrets/kubernetes.io/serviceaccount/token" \ --set values.hsm.vaultSecretPath=${HSM_SECRET_PATH} \ --set values.global.jwtPolicy="first-party-jwt"
버전 라벨이 있는
istiod
서비스를 찾을 수 있도록 유효성 검증 웹훅을 구성합니다.kubectl apply -f istiod-service.yaml
이 명령어는 유효성 검증 웹훅이 구성을 적용하기 전에 구성을 자동으로 확인할 수 있는 서비스 항목을 만듭니다.
Istiod가 올바르게 초기화되었고 대기 상태인지 확인합니다.
kubectl get pod -l app=istiod -n istio-system
예상 출력은 다음과 같습니다.
NAME READY STATUS RESTARTS AGE istiod-66ff56d76c-f9p5l 2/3 Running 2 1m27s
discovery
컨테이너가 차단되어 인증서를 대기 중이므로 Istiod가 완전히 준비되지 않았는지 확인합니다.Istiod 컨테이너의 로그를 확인하여 올바른 상태인지 확인합니다.
kubectl logs -c hsm-plugin -l app=istiod -n istio-system
예상 출력은 다음과 같습니다.
The token has been initialized and is reassigned to slot 412789065 INFO Loaded P11 PIN from file: /var/run/hsm-credential/pin line="cmd/serve.go:93" INFO KMS Plugin Listening on : /var/run/hsm-socket/.sock line="cmd/serve.go:119" INFO Serving on socket: /var/run/hsm-socket/.sock line="cmd/serve.go:198" KEK ID: 7651a4ea-eeb7-4c1f-927b-8c871c2127aa
kubectl logs -c discovery -l app=istiod -n istio-system
출력의 마지막 줄은 다음과 같이 예상됩니다.
... 2020-10-15T21:56:56.918931Z info pkica Wait until the CA certificate secret istio-system.istio-ca-cert can be loaded...
Istiod용 서명 인증서
Kubernetes 보안 비밀에서 암호화된 CSR을 다운로드합니다.
kubectl get secret istio-ca-cert-csr -n istio-system -o jsonpath={.data} > encrypted_csr.json
CSR을 복호화합니다.
kubectl get secret istio-ca-cert-csr -n istio-system -o jsonpath={.data} > encrypted_csr.json ./k8s-kms-plugin decrypt-csr -f encrypted_csr.json -o csr.pem
보안 관리자는
csr.pem
파일을 가져와 루트 CA를 사용하여 서명해야 합니다.인증서 체인을
cert-chain.pem
이라는 파일의 루트에 넣고 다음 명령어를 실행합니다.kubectl create secret generic istio-ca-cert --from-file=cert-chain.pem -n istio-system
Istiod 로그를 검사하여 Istiod에 새 인증서 체인이 성공적으로 로드되는지 확인합니다.
kubectl logs ISTIOD_POD -c discovery -n istio-system | grep "CA cert\:" -A 60
다음과 비슷한 출력이 예상됩니다.
2020-10-24T18:58:14.354254Z info pkica CA cert: -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
중간 인증서: -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
루트 인증서: -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----
설치 확인
다음 단계에 따라 Anthos Service Mesh 설치가 올바르게 작동하는지 확인합니다.
제어 영역 구성요소 확인
istio-system
의 제어 영역 pod가 실행 중인지 확인합니다.kubectl get pod -n istio-system
예상 출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE istio-ingressgateway-74cc894bfd-786rg 1/1 Running 0 7m19s istiod-78cdbbbdb-d7tps 3/3 Running 0 7m36s promsd-576b8db4d6-lqf64 2/2 Running 1 7m19s
사이드카에서 서비스에 대한 TLS 호출을 트리거하고 서비스에서 사용한 인증서를 검사합니다(예: bookinfo 사용).
kubectl exec POD -c istio-proxy -- openssl s_client -alpn istio -showcerts -connect details:9080
출력에서 인증서를 검사하고 출력에 서버 측 인증서 체인이 표시될 것으로 예상합니다.
사이드카 프록시 삽입
Anthos Service Mesh는 사이드카 프록시를 사용하여 네트워크 보안, 안정성, 관측 가능성을 개선합니다. Anthos Service Mesh를 사용하면 이러한 함수가 애플리케이션의 기본 컨테이너에서 추상화되고 동일한 포드에서 별도의 컨테이너로 제공되는 공용 프로세스 외부 프록시로 구현됩니다.
자동 사이드카 프록시 삽입(자동 삽입)을 사용 설정하고 Anthos Service Mesh를 설치하기 전에 클러스터에서 실행 중이었던 모든 워크로드의 포드를 다시 시작해야 설치가 완료됩니다.
자동 삽입을 사용 설정하려면 Anthos Service Mesh를 설치할 때 istiod
에 설정한 버전 라벨을 네임스페이스에 지정합니다. 버전 라벨은 사이드카 인젝터 웹훅에서 삽입된 사이드카를 특정 istiod
버전과 연결하는 데 사용됩니다. 라벨을 추가한 후 사이드카를 삽입하려면 네임스페이스의 기존 포드를 다시 시작해야 합니다.
새 네임스페이스에 새 워크로드를 배포하기 전에 자동 삽입을 구성해야 Anthos Service Mesh가 트래픽을 모니터링하고 보호할 수 있습니다.
자동 삽입을 사용 설정하려면 다음을 실행하세요.
다음 명령어를 사용하여
istiod
에서 버전 라벨을 찾습니다.kubectl -n istio-system get pods -l app=istiod --show-labels
출력은 다음과 유사합니다.
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-198-6-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-198-6,istio=istiod,pod-template-hash=5788d57586 istiod-asm-198-6-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-198-6,istio=istiod,pod-template-hash=5788d57586
출력의
LABELS
열 아래에서istio.io/rev=
프리픽스 다음에 있는istiod
버전 라벨의 값을 확인합니다. 이 예시에서 값은asm-198-6
입니다.버전 라벨을 적용하고
istio-injection
라벨이 있는 경우 삭제합니다. 다음 명령어에서NAMESPACE
는 자동 삽입을 사용 설정할 네임스페이스의 이름이며REVISION
은 이전 단계에서 표시된 버전 라벨입니다.kubectl label namespace NAMESPACE istio-injection- istio.io/rev=REVISION --overwrite
출력에서
"istio-injection not found"
메시지는 무시해도 됩니다. 즉, 네임스페이스에 이전에istio-injection
라벨이 사용되지 않았으며, Anthos Service Mesh를 새로 설치하거나 새로 배포해야 합니다. 네임스페이스에istio-injection
및 버전 라벨이 모두 포함된 경우 자동 삽입이 실패하기 때문에 Anthos Service Mesh 문서에서 모든kubectl label
명령어에는istio-injection
라벨 삭제가 포함됩니다.Anthos Service Mesh를 설치하기 전에 클러스터에서 워크로드를 실행 중인 경우 포드를 다시 시작하여 재삽입을 트리거합니다.
포드를 다시 시작하는 방법은 애플리케이션과 클러스터가 있는 환경에 따라 달라집니다. 예를 들어 스테이징 환경에서 모든 포드를 간단히 삭제하면 다시 시작됩니다. 하지만 프로덕션 환경에서는 트래픽 중단을 방지하기 위해 포드를 안전하게 다시 시작할 수 있도록 블루-그린 배포를 구현하는 프로세스가 있을 수 있습니다.
kubectl
를 사용하여 순차적 재시작을 수행할 수 있습니다.kubectl rollout restart deployment -n NAMESPACE
pod가 새 버전의
istiod
를 가리키도록 구성되었는지 확인합니다.kubectl get pods -n NAMESPACE -l istio.io/rev=REVISION
외부 IP 주소 구성
기본 Anthos Service Mesh 설치에서는 LoadBalancer
서비스에 외부 IP 주소가 자동으로 할당된다고 가정합니다. VMware용 GKE에는 해당하지 않습니다. 따라서 Anthos Service Mesh 인그레스 게이트웨이 리소스에 IP 주소를 수동으로 할당해야 합니다.
외부 IP 주소를 구성하려면 클러스터의 부하 분산 모드에 따라 아래 섹션 중 하나를 수행합니다.
통합 부하 분산 모드 구성
istio-ingressgateway
서비스 구성을 엽니다.kubectl edit svc -n istio-system istio-ingressgateway
istio-ingressgateway
서비스의 구성은 셸의 기본 텍스트 편집기에서 열립니다.파일에서 사양(
spec
) 블록 아래에 다음 줄을 추가합니다.loadBalancerIP: <your static external IP address>
예를 들면 다음과 같습니다.
spec: loadBalancerIP: 203.0.113.1
파일을 저장합니다.
수동 부하 분산 모드 구성
부하 분산기에서 가상 IP 주소(VIP)로 NodePort
유형의 서비스를 노출하려면 먼저 nodePort
값을 가져옵니다.
셸에서
istio-ingressgateway
서비스의 구성을 확인합니다.kubectl get svc -n istio-system istio-ingressgateway -o yaml
Anthos Service Mesh 게이트웨이의 각 포트가 표시됩니다. 명령어 결과는 다음과 비슷합니다.
... ports: - name: status-port nodePort: 30391 port: 15020 protocol: TCP targetPort: 15020 - name: http2 nodePort: 31380 port: 80 protocol: TCP targetPort: 80 - name: https nodePort: 31390 port: 443 protocol: TCP targetPort: 443 - name: tcp nodePort: 31400 port: 31400 protocol: TCP targetPort: 31400 - name: https-kiali nodePort: 31073 port: 15029 protocol: TCP targetPort: 15029 - name: https-prometheus nodePort: 30253 port: 15030 protocol: TCP targetPort: 15030 - name: https-grafana nodePort: 30050 port: 15031 protocol: TCP targetPort: 15031 - name: https-tracing nodePort: 31204 port: 15032 protocol: TCP targetPort: 15032 - name: tls nodePort: 30158 port: 15443 protocol: TCP targetPort: 15443 ...
부하 분산기를 통해 포트를 노출합니다.
예를 들어 이름이
http2
인 서비스 포트에는port
80 및nodePort
31380이 있습니다. 사용자 클러스터의 노드 주소가192.168.0.10
,192.168.0.11
,192.168.0.12
이고 부하 분산기의 VIP가203.0.113.1
이라고 가정합니다.203.0.113.1:80
로 전송된 트래픽이192.168.0.10:31380
,192.168.0.11:31380
또는192.168.0.12:31380
로 전달되도록 부하 분산기를 구성합니다. 이 주어진 VIP에 노출할 서비스 포트를 선택할 수 있습니다.