Kubernetes에서 TLS 암호화로 배포 만들기

Spanner Omni는 TLS 1.3을 사용하여 클라이언트와 서버 간, 그리고 Spanner Omni 서버 간에 흐르는 데이터를 암호화합니다. Spanner Omni는 양 당사자가 데이터를 교환하기 전에 서로의 진위성을 확인하는 향상된 보안을 위해 mTLS를 제공합니다. 암호화를 사용하는 경우 서버는 mTLS를 통해 통신해야 합니다. 클라이언트와 서버가 mTLS도 사용할지 선택할 수 있습니다.

Spanner Omni의 미리보기 버전은 TLS 암호화를 지원하지 않습니다. TLS 암호화로 배포를 만들 수 있는 기능을 사용하려면 Google에 문의하여 Spanner Omni의 정식 버전에 대한 사전 액세스를 요청하세요.

시작하기 전에

다음 요구사항을 충족하는지 확인합니다.

  • Kubernetes 클러스터를 만듭니다. 이 구성은 Google Kubernetes Engine (GKE) 및 Amazon Elastic Kubernetes Service (Amazon EKS)를 지원합니다. 다른 환경에서 작동하도록 구성을 맞춤설정해야 할 수 있습니다.

  • Kubernetes 클러스터가 Spanner Omni 컨테이너를 호스팅하는 Artifact Registry 아티팩트에 액세스할 수 있는지 확인합니다.

  • kubectl 명령줄 도구Helm을 설치하고 구성합니다.

  • vSphere 가상화 플랫폼 머신에 Kubernetes 환경을 설정하는 경우 가상 머신의 .vmx 구성 파일에 monitor_control.virtual_rdtsc = FALSE를 추가하여 타임스탬프 카운터 (TSC) 가상화를 사용 중지합니다. 이렇게 하면 TrueTime이 올바르게 작동합니다.

  • 환경이 Spanner Omni 시스템 요구사항을 충족하는지 확인합니다.

1단계: 인증서 생성

세 가지 인증서 세트를 만들어야 합니다.

  • API 인증서: Spanner Omni API 서버를 보호하는 데 도움이 됩니다.

  • 서버 인증서: 서버 간 통신을 보호하는 데 도움이 됩니다.

  • 클라이언트 인증서: 최종 사용자 또는 애플리케이션은 이를 사용하여 Spanner Omni 서버와의 ID 및 신뢰를 설정합니다.

인증 기관 (CA)에서 이러한 인증서를 발급합니다. Spanner Omni는 자체 서명된 CA와 세 가지 유형의 인증서를 모두 만들 수 있는 도구를 제공합니다.

머신 중 하나에서 다음 단계를 수행합니다. 이 단계에서는 네임스페이스가 spanner-ns라고 가정합니다. 배포에서 사용하려는 네임스페이스로 변경합니다.

Spanner Omni CLI를 사용하여 워크스테이션에서 이러한 인증서를 만들 수 있습니다.

1. 인증 기관 (CA) 만들기

인증 기관 (CA)에서 모든 인증서를 발급합니다. 조직에 중앙 CA가 있을 수도 있고 공개 CA를 사용할 수도 있습니다. 모든 인증서에 동일한 CA를 사용할 수 있지만 API 인증서와 클라이언트 인증서는 동일한 CA를 사용해야 합니다.

Spanner Omni를 사용하면 비공개 CA를 만들 수 있습니다.

./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs

create-ca 명령어는 certs 디렉터리에 CA 인증서를 생성합니다. 이 인증서를 복사하여 API 인증서의 CA로 사용하거나 다른 CA를 만들 수 있습니다. 인증서를 만들 때 올바른 CA를 사용해야 합니다.

cp certs/ca.crt certs/ca-api.crt

$HOME/.spanner/private-keys 디렉터리에는 CA의 비공개 키가 포함되어 있습니다. 이 디렉터리를 백업하고 보호하는 것이 중요합니다. 비공개 키에 액세스할 수 있는 사용자는 자체 서명된 CA를 신뢰하는 클라이언트가 신뢰하는 임의의 인증서에 서명할 수 있습니다. 선택적으로 API 인증서에 추가 CA를 만들거나 외부에서 신뢰할 수 있는 CA를 사용할 수 있습니다. 이 문서에서는 모든 유형의 인증서에 동일한 CA를 사용합니다.

2. 서버 인증서 생성

두 가지 유형의 서버 인증서를 생성해야 합니다.

  • API 인증서: 이 인증서를 사용하여 배포와 상호작용하는 시스템의 통신을 암호화합니다.

  • Spanner 서버 인증서: Spanner Omni 서버는 이 인증서를 사용하여 서로 간의 통신을 암호화합니다.

이 구성은 이러한 인증서를 관리하는 데 유연성을 제공합니다. 예를 들어 인증서 순환을 사용할 수 있습니다.

Spanner 서버 인증서 만들기

서버 인증서를 만들려면 다음 명령어를 실행합니다.

# Comma-separate names of the Spanner servers; wildcards are supported.
SERVER_NAMES=*.pod.NAMESPACE
./google/spanner/bin/spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

이 명령어는 certs 디렉터리에 server.crtserver.key를 만듭니다.

API 인증서 만들기

API 인증서를 만들려면 다음 명령어를 실행합니다.

OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs

이 명령어는 certs 디렉터리에 api.crtapi.key를 만듭니다. 필요한 경우 API 인증서에 외부에서 신뢰할 수 있는 CA를 사용합니다.

3. 클라이언트 인증서 생성

클라이언트 인증서를 사용하여 사용자 및 애플리케이션을 인증할 수 있습니다. 클라이언트 인증서는 클라이언트와 서버 간에 mTLS를 사용 설정합니다. mTLS를 사용할 계획이 없다면 이 단계를 건너뛸 수 있습니다.

API 인증서에 서명하는 동일한 CA가 클라이언트 인증서에 서명해야 하며, 클라이언트 인증서에는 승인을 위한 사용자 이름도 포함되어야 합니다. 이 예시에서는 각 새 데이터베이스의 기본 사용자인 admin 사용자를 사용합니다. 자세한 내용은 Spanner Omni의 인증 및 승인을 참조하세요.

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

이 명령어는 clientcerts 디렉터리에 client.crtclient.key를 만듭니다. 배포에 연결되는 모든 머신에 이러한 파일을 보냅니다.

Java 클라이언트 라이브러리와 함께 클라이언트 인증서를 사용하려면 인증서 키를 PKCS#8 형식으로 생성해야 합니다. 다음 명령어를 사용합니다.

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key

2단계: Kubernetes 클러스터에 인증서 푸시

다음 명령어를 실행하여 Kubernetes 클러스터에 인증서를 푸시합니다.

kubectl create namespace NAMESPACE

kubectl create secret generic tls-certs \
  --from-file=ca.crt="certs/ca.crt" \
  --from-file=ca-api.crt="certs/ca-api.crt" \
  --from-file=server.crt="certs/server.crt" \
  --from-file=server.key="certs/server.key" \
  --from-file=api.crt="certs/api.crt" \
  --from-file=api.key="certs/api.key" \
  -n NAMESPACE

3단계: TLS 암호화로 배포 만들기

다음 단계에 따라 TLS 암호화로 배포를 만듭니다.

1. Helm 구성 준비

Helm 차트 구성 만들기 를 참조하고 환경의 배포 구성을 만듭니다.

TLS를 사용 설정하려면 Helm 차트 구성에서 다음 값을 설정합니다.

# Enables TLS
global:
  insecureMode: false

# Enables client certificate authentication (mTLS)
deployment:
  enableClientCertificateAuthentication: true

2. 배포 만들기

다음 명령어를 실행하여 배포를 만듭니다.

kubectl create ns monitoring

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
  --version VERSION \
  --set global.platform=gke \
  --set global.insecureMode=false \
  --set deployment.enableClientCertificateAuthentication=true \
  --namespace NAMESPACE \
  --set monitoring.enabled=true

이 명령어는 부트스트랩 작업을 트리거합니다. 이 작업의 로그를 보고 진행 상황을 추적할 수 있습니다.

kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f

출력에 진행 상황이 표시됩니다. 완료되면 '배포가 완료되었습니다'라는 메시지가 표시됩니다.

3. 포드 상태 확인

다음 명령어를 실행하여 포드 상태를 확인합니다.

kubectl get pods --watch --namespace NAMESPACE

모든 포드가 READY 상태입니다.

4. 부하 분산기 세부정보로 인증서 및 배포 업데이트

클라이언트가 Kubernetes 클러스터 외부에서 연결하도록 하려면 이 단계가 필요합니다.

# Get the service details
kubectl get service spanner -n NAMESPACE

# The EXTERNAL-IP:PORT is the API or deployment endpoint for your deployment.
# Update the API certificate with these details.
OMNI_ENDPOINT=EXTERNAL_IP,spanner.NAMESPACE.svc
./google/spanner/bin/spanner certificates update --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca_certificate_directory certs --output_directory certs --overwrite

# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"

4단계: Spanner Omni와 상호작용

Spanner Omni CLI를 사용하여 모든 VM에서 Spanner Omni 배포와 상호작용할 수 있습니다.

클라이언트에 mTLS를 사용 설정한 경우 각 명령어에 다음 플래그를 사용합니다.

  • --client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY

  • --ca-certificate-file=API_CA_CERT_FILE_PATH

1. Spanner Omni에 로그인

다음 명령어를 실행하여 로그인합니다.

./google/spanner/bin/spanner auth login admin --ca-certificate-file=certs/ca-api.crt \
--client-certificate_directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

기본 비밀번호는 admin입니다.

Successfully logged in as "admin"

2. 데이터베이스 만들기

다음 명령어를 실행하여 데이터베이스를 만듭니다.

./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

3. SQL 셸 열기

다음 명령어를 실행하여 셸을 엽니다.

./google/spanner/bin/spanner sql --database=DATABASE_NAME --deployment-endpoint=DEPLOYMENT_ENDPOINT --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

4. 테이블 만들기 및 데이터 추가

다음 SQL 명령어를 실행합니다.

spanner> CREATE TABLE names (nameId INT64 NOT NULL, name String(100)) PRIMARY KEY (nameId);
Query OK, 0 rows affected (4.62 sec)

spanner> INSERT names (nameId, name) VALUES (1, "Jack");
Query OK, 1 rows affected (0.18 sec)

5. 배포를 확인합니다.

데이터베이스를 나열하려면 다음 명령어를 실행합니다.

./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

결과는 다음과 유사합니다.

NAME 상태 VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME ENABLE_DROP_PROTECTION
DATABASE_NAME READY 1시간 2025-02-07T12:25:30Z 거짓

데이터를 쿼리하려면 다음 명령어를 실행합니다.

./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

다음 SQL 명령어를 실행합니다.

SHOW TABLES;
SELECT * FROM names;

또는 Spanner Omni와 함께 PGAdapter 사용의 안내에 따라 PGAdapter를 구성하고 `psql`과 같은 도구를 사용하여 상호작용할 수 있습니다.

5단계: 배포 모니터링

monitoring.enabled=true로 Spanner Omni를 설치한 경우 Prometheus가 측정항목을 스크래핑합니다. Grafana를 사용하여 이러한 측정항목을 시각화할 수 있습니다.

1. 서비스 세부정보 가져오기

다음 명령어를 실행하여 서비스 세부정보를 가져옵니다.

# Prometheus service details. Default port is 9090.
kubectl get service prometheus-service -n monitoring

# Grafana service details. Default port is 3000.
kubectl get service grafana -n monitoring

다음 단계