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.crt 및 server.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.crt 및 api.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.crt 및 client.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
다음 단계
- 클라이언트 라이브러리 및 JDBC 드라이버를 사용하여 애플리케이션을 배포에 연결합니다.
- 사용자 및 역할을 관리합니다.