HSM 및 Vault를 사용하여 온프레미스에 Anthos Service Mesh 설치

이 가이드에서는 VMware용 GKE에 Anthos Service Mesh 버전 1.7.8-asm.10을 새로 설치하고 Thales Luna HSM 7+Hashicorp Vault를 사용하여 Istiod의 CA 서명 키를 안전하게 생성하고 CA 서명 키를 보호하는 방법을 설명합니다.

이전 버전의 Anthos Service Mesh가 설치되어 있는 경우 Anthos Service Mesh VMware용 GKE 업그레이드를 참조하세요. 설치 시 클러스터에서 asm-multicloud 구성 프로필에 지원되는 기능이 사용 설정됩니다.

시작하기 전에

설정을 시작하기 전에 다음 요구사항을 검토하세요.

요구사항

  • 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 설치 프로세스를 제어하는 머신에 다음 도구를 설치합니다.

기본 요건 도구를 설치한 후 다음 단계를 수행합니다.

  1. Google Cloud CLI로 인증합니다.

    gcloud auth login
    
  2. 구성요소를 업데이트합니다.

    gcloud components update
    
  3. kubectl을 설치합니다.

    gcloud components install kubectl
    
  4. Online Boutique 샘플 애플리케이션으로 설치를 배포하고 테스트하려면 kpt를 설치합니다.

    gcloud components install kpt
    
  5. 필요한 경우 컨텍스트를 사용자 클러스터로 전환합니다.

    kubectl config use-context CLUSTER_NAME
  6. 클러스터 관리자 권한을 사용자 계정(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 Service Mesh를 설치할 Vault 서버, HSM 및 Kubernetes 클러스터에 액세스할 수 있는 워크스테이션이 있어야 합니다.

하드웨어 보안 모듈(HSM) 설정

이 섹션에는 하드웨어 보안 모듈(HSM)을 설정하고 암호화 키를 생성하는 단계가 나와 있습니다.

HSM 사용자 인증 정보 및 슬롯 프로비저닝

HSM 설치 가이드에 따라 다음 단계를 수행합니다.

  1. HSM을 네트워크 HSM으로 설정합니다.

  2. 클라이언트 키 파일, 클라이언트 인증서 파일, 서버 인증서 파일을 포함하여 HSM과의 mTLS 연결을 위한 PEM 파일을 프로비저닝합니다.

  3. Anthos Service Mesh용 HSM 슬롯을 프로비저닝하고 슬롯 라벨과 PIN을 기록합니다.

HSM 키 암호화 키(KEK)를 생성합니다.

  1. HSM 액세스 권한이 있는 머신에서 HSM 도구를 다운로드합니다(Linux amd-64에만 사용 가능).

    gsutil cp gs://artifacts.thalescpl-io-k8s-kms-plugin.appspot.com/binary/k8s-kms-plugin .
  2. 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"
  3. HSM에 키 암호화 키(KEK)가 없으면 다음 단계에 따라 생성합니다. k8s-kms-plugin을 클라이언트로 사용하여 HSM 도구 서버와 통신합니다. KEK ID를 명시적으로 지정하려면 명령어에 --kek-id 플래그를 전달하면 됩니다. 그렇지 않으면 무작위 KEK ID가 자동으로 생성됩니다.

    ./k8s-kms-plugin generate-kek --kek-id KEK ID

    KEK ID를 기록합니다. 이 ID는 다음 단계에서 사용됩니다.

  4. HSM은 가져온 루트 인증서를 사용하여 서명된 Istiod CA 인증서를 확인합니다. 이 단계에 따라 루트 인증서를 HSM으로 가져옵니다. k8s-kms-plugin을 클라이언트로 사용하여 HSM 도구 서버에 연결합니다. 다음 명령어를 사용하여 루트 인증서를 가져옵니다.

    ./k8s-kms-plugin import-ca -f root cert PEM file

Vault 인증을 위한 Kubernetes 설정

  1. Kubernetes 클러스터에서 TokenReview API를 호출하는 Vault에 대한 전용 서비스 계정과 RBAC 정책을 만듭니다. 이 용도를 위한 전용 네임스페이스를 만듭니다.

  2. vault 네임스페이스에서 기본 서비스 계정을 만들고, 권한을 설정하고, Vault 서버에서 Kubernetes TokenReview API를 호출할 수 있도록 연결된 JSON 웹 토큰(JWT)을 추출합니다. 참고: 충분한 권한이 있는 경우 Kubernetes 서비스 계정 및 네임스페이스를 사용할 수 있습니다.

  3. 설정하려는 클러스터에 대해 클러스터 서픽스를 구성합니다. 해당 구성에 전용 디렉터리를 사용합니다.

    export CLUSTER_SUFFIX="c1"
    mkdir ${CLUSTER_SUFFIX}
    cd ${CLUSTER_SUFFIX}
    
  4. 관리할 클러스터로 전환하고 vault 네임스페이스를 만듭니다. kubectl이 자동으로 기본 서비스 계정을 만듭니다.

    kubectl create ns vault
    
  5. 권한을 부여하려면 서비스 계정 default.vaultauth-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
    
  6. 토큰 사용자 인증 정보를 포함할 보안 비밀을 만듭니다.

    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
    
  7. 서비스 계정 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
    
  8. Kubernetes API 서버의 주소 및 CA 인증서를 검색합니다. 나중에 Kubernetes API 서버를 호출하도록 Vault 서버를 구성합니다.

  9. 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
    
  10. 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"
    
  11. 인증서 파일을 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
    
  12. 인증서가 유효한지 확인합니다.

    openssl x509 -in ${CLUSTER_SUFFIX}-k8s_cert -noout -text
    
  13. 이전 디렉터리로 돌아갑니다.

    cd ..
    

이제 클러스터 디렉터리에 있는 3개의 파일을 사용하여 다음 단계에서 Vault를 구성합니다.

HSM 사용자 인증 정보를 저장하도록 Vault 설정

Vault 서버가 유효한 인증서로 TLS 트래픽을 제공하면 Vault PKI와 Kubernetes 인증을 구성합니다. 다음은 단일 루트 CA와 클러스터별 중간 CA를 설정하는 예시입니다.

  1. 루트로 Vault에 로그인합니다.

    vault login
    
  2. 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}
    
  3. PKI 경로 권한이 있는 정책을 만듭니다.

    vault policy write asm-$CLUSTER_SUFFIX-hsm-policy -<< EOF
    path "${HSM_SECRET_PATH}" {
    capabilities = ["read"]
    }
    EOF
    
  4. 클러스터에 Kubernetes 인증을 추가합니다.

    vault auth enable --path="${HSM_SECRET_PATH}"  kubernetes
    
  5. 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
    
  6. 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
    
  7. 상위 폴더로 돌아갑니다.

    cd ..
    

설치 파일 다운로드

    Linux

  1. Anthos Service Mesh 설치 파일을 현재 작업 디렉터리에 다운로드합니다.
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-linux-amd64.tar.gz
  2. 서명 파일을 다운로드하고 openssl을 사용하여 서명을 확인합니다.
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-linux-amd64.tar.gz.1.sig
    openssl dgst -verify /dev/stdin -signature istio-1.7.8-asm.10-linux-amd64.tar.gz.1.sig istio-1.7.8-asm.10-linux-amd64.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    예상되는 출력은 Verified OK입니다.

  3. 원하는 파일 시스템 위치에 파일 콘텐츠 압축을 풉니다. 예를 들어 콘텐츠를 현재 작업 디렉터리에 추출하려면 다음을 사용하세요.
    tar xzf istio-1.7.8-asm.10-linux-amd64.tar.gz

    이 명령어는 다음을 포함하는 현재 작업 디렉터리에 istio-1.7.8-asm.10이라는 설치 디렉터리를 만듭니다.

    • 샘플 애플리케이션은 samples 디렉터리에 있습니다.
    • Anthos Service Mesh를 설치하는 데 사용하는 istioctl 명령줄 도구는 bin 디렉터리에 있습니다.
    • Anthos Service Mesh 구성 프로필은 install/kubernetes/operator/profiles 디렉터리에 있습니다.

  4. MacOS

  5. Anthos Service Mesh 설치 파일을 현재 작업 디렉터리에 다운로드합니다.
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-osx.tar.gz
  6. 서명 파일을 다운로드하고 openssl을 사용하여 서명을 확인합니다.
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-osx.tar.gz.1.sig
    openssl dgst -sha256 -verify /dev/stdin -signature istio-1.7.8-asm.10-osx.tar.gz.1.sig istio-1.7.8-asm.10-osx.tar.gz <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    예상되는 출력은 Verified OK입니다.

  7. 원하는 파일 시스템 위치에 파일 콘텐츠 압축을 풉니다. 예를 들어 콘텐츠를 현재 작업 디렉터리에 추출하려면 다음을 사용하세요.
    tar xzf istio-1.7.8-asm.10-osx.tar.gz

    이 명령어는 다음을 포함하는 현재 작업 디렉터리에 istio-1.7.8-asm.10이라는 설치 디렉터리를 만듭니다.

    • 샘플 애플리케이션은 samples 디렉터리에 있습니다.
    • Anthos Service Mesh를 설치하는 데 사용하는 istioctl 명령줄 도구는 bin 디렉터리에 있습니다.
    • Anthos Service Mesh 구성 프로필은 install/kubernetes/operator/profiles 디렉터리에 있습니다.

  8. Windows

  9. Anthos Service Mesh 설치 파일을 현재 작업 디렉터리에 다운로드합니다.
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-win.zip
  10. 서명 파일을 다운로드하고 openssl을 사용하여 서명을 확인합니다.
    curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.7.8-asm.10-win.zip.1.sig
    openssl dgst -verify - -signature istio-1.7.8-asm.10-win.zip.1.sig istio-1.7.8-asm.10-win.zip <<'EOF'
    -----BEGIN PUBLIC KEY-----
    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ
    wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw==
    -----END PUBLIC KEY-----
    EOF

    예상되는 출력은 Verified OK입니다.

  11. 원하는 파일 시스템 위치에 파일 콘텐츠 압축을 풉니다. 예를 들어 콘텐츠를 현재 작업 디렉터리에 추출하려면 다음을 사용하세요.
    tar xzf istio-1.7.8-asm.10-win.zip

    이 명령어는 다음을 포함하는 현재 작업 디렉터리에 istio-1.7.8-asm.10이라는 설치 디렉터리를 만듭니다.

    • 샘플 애플리케이션은 samples 디렉터리에 있습니다.
    • Anthos Service Mesh를 설치하는 데 사용하는 istioctl 명령줄 도구는 bin 디렉터리에 있습니다.
    • Anthos Service Mesh 구성 프로필은 install/kubernetes/operator/profiles 디렉터리에 있습니다.

  12. Anthos Service Mesh 설치 루트 디렉터리에 있는지 확인합니다.
    cd istio-1.7.8-asm.10
  13. 편의를 위해 /bin 디렉터리의 도구를 PATH에 추가합니다.
    export PATH=$PWD/bin:$PATH

제어 영역에서 리소스 설정

  1. 환경 변수를 설정합니다.

    export CLUSTER_SUFFIX="c1"
    export VAULT_ADDR="https://VAULT_IP:PORT"
    
  2. Vault 인증을 위한 인증서가 포함된 파일을 cert라는 파일에 복사합니다. 예를 들어 Vault 서버의 TLS 인증서는 ${VAULT_CACERT}입니다.

    cp ${VAULT_CACERT} ./cert
    
  3. 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-178-10
    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-178-10

Anthos Service Mesh 설치

  1. 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
  2. 다음 명령어를 실행하여 asm-multicloud 프로필로 Anthos Service Mesh를 설치합니다. 지원되는 선택 기능을 사용 설정하려면 다음 명령줄에 -f와 YAML 파일 이름을 포함합니다. 자세한 내용은 선택 기능 사용 설정을 참조하세요.

    istioctl install --set profile=asm-multicloud \
       --set revision=asm-178-10 \
       --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"
    
  3. 버전 라벨이 있는 istiod 서비스를 찾을 수 있도록 유효성 검증 웹훅을 구성합니다.

    kubectl apply -f istiod-service.yaml
    

    이 명령어는 유효성 검증 웹훅이 구성을 적용하기 전에 구성을 자동으로 확인할 수 있는 서비스 항목을 만듭니다.

  4. 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가 완전히 준비되지 않았는지 확인합니다.

  5. 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용 서명 인증서

  1. Kubernetes 보안 비밀에서 암호화된 CSR을 다운로드합니다.

    kubectl get secret istio-ca-cert-csr -n istio-system -o jsonpath={.data} > encrypted_csr.json
    
  2. 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
    
  3. 보안 관리자는 csr.pem 파일을 가져와 루트 CA를 사용하여 서명해야 합니다.

  4. 인증서 체인을 cert-chain.pem이라는 파일의 루트에 넣고 다음 명령어를 실행합니다.

    kubectl create secret generic istio-ca-cert --from-file=cert-chain.pem -n istio-system
    
  5. 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 설치가 올바르게 작동하는지 확인합니다.

제어 영역 구성요소 확인

  1. 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
  2. 사이드카에서 서비스에 대한 TLS 호출을 트리거하고 서비스에서 사용한 인증서를 검사합니다(예: bookinfo 사용).

    kubectl exec POD -c istio-proxy -- openssl s_client -alpn istio -showcerts -connect details:9080
    

    출력에서 인증서를 검사하고 출력에 서버 측 인증서 체인이 표시될 것으로 예상합니다.

사이드카 프록시 삽입

Anthos Service Mesh는 사이드카 프록시를 사용하여 네트워크 보안, 안정성, 관측 가능성을 개선합니다. Anthos Service Mesh를 사용하면 이러한 함수가 애플리케이션의 기본 컨테이너에서 추상화되고 동일한 pod에서 별도의 컨테이너로 제공되는 공용 프로세스 외부 프록시로 구현됩니다. 사이드카 프록시로 pod를 삽입하려면 Anthos Service Mesh 설치 시 istiod에 설정한 것과 동일한 버전 라벨을 네임스페이스에 지정하여 자동 사이드카 프록시 삽입(자동 삽입)을 구성합니다.

  • Anthos Service Mesh를 설치하기 전에 클러스터에서 실행 중인 워크로드가 있는 모든 네임스페이스에서 자동 삽입을 사용 설정해야 합니다.

  • 새 워크로드를 배포하기 전에 자동 삽입을 구성하여 Anthos Service Mesh가 트래픽을 모니터링하고 보호할 수 있는지 확인합니다.

자동 삽입을 사용 설정하려면 다음을 실행하세요.

  1. 다음 명령어를 사용하여 istiod에서 버전 라벨을 찾습니다.

    kubectl -n istio-system get pods -l app=istiod --show-labels
    

    출력은 다음과 유사합니다.

    NAME                                READY   STATUS    RESTARTS   AGE   LABELS
    istiod-asm-178-10-5788d57586-bljj4   1/1     Running   0          23h   app=istiod,istio.io/rev=asm-178-10,istio=istiod,pod-template-hash=5788d57586
    istiod-asm-178-10-5788d57586-vsklm   1/1     Running   1          23h   app=istiod,istio.io/rev=asm-178-10,istio=istiod,pod-template-hash=5788d57586

    출력의 LABELS 열 아래에서 istio.io/rev= 프리픽스 다음에 있는 istiod 버전 라벨의 값을 확인합니다. 이 예시에서 값은 asm-178-10입니다.

  2. 버전 라벨을 적용하고 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 라벨 삭제가 포함됩니다.

  3. Anthos Service Mesh를 설치하기 전에 클러스터에서 워크로드를 실행 중인 경우 포드를 다시 시작하여 재삽입을 트리거합니다.

    포드를 다시 시작하는 방법은 애플리케이션과 클러스터가 있는 환경에 따라 달라집니다. 예를 들어 스테이징 환경에서 모든 포드를 간단히 삭제하면 다시 시작됩니다. 하지만 프로덕션 환경에서는 트래픽 중단을 방지하기 위해 포드를 안전하게 다시 시작할 수 있도록 블루-그린 배포를 구현하는 프로세스가 있을 수 있습니다.

    kubectl를 사용하여 순차적 재시작을 수행할 수 있습니다.

    kubectl rollout restart deployment -n NAMESPACE
    
  4. 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 주소를 구성하려면 클러스터의 부하 분산 모드에 따라 아래 섹션 중 하나를 수행합니다.

통합 부하 분산 모드 구성

  1. istio-ingressgateway 서비스 구성을 엽니다.

    kubectl edit svc -n istio-system istio-ingressgateway
    

    istio-ingressgateway 서비스의 구성은 셸의 기본 텍스트 편집기에서 열립니다.

  2. 파일에서 사양(spec) 블록 아래에 다음 줄을 추가합니다.

    loadBalancerIP: <your static external IP address>
    

    예를 들면 다음과 같습니다.

    spec:
     loadBalancerIP: 203.0.113.1
    
  3. 파일을 저장합니다.

수동 부하 분산 모드 구성

부하 분산기에서 가상 IP 주소(VIP)로 NodePort 유형의 서비스를 노출하려면 먼저 nodePort 값을 가져옵니다.

  1. 셸에서 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
     ...
    
  2. 부하 분산기를 통해 포트를 노출합니다.

    예를 들어 이름이 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에 노출할 서비스 포트를 선택할 수 있습니다.

다음 단계