Google Distributed Cloud (GDC) air-gapped 提供內建的第 4 層 (L4) 負載平衡器,但許多企業應用程式需要第 7 層 (L7) 的進階功能,例如以主機為基礎的路由、集中式 TLS 管理和複雜的流量分割。過去,這項作業是透過 Ingress API 完成,但 Kubernetes 社群現在認為這項功能已凍結。
這項參考架構提供自行管理的第 7 層負載平衡解決方案。在 GDC Standard 叢集上部署熱門的 NGINX Gateway Fabric 開放原始碼控制器,客戶就能順暢地將 L7 流量轉送至混合式環境。這個架構使用 TLS 終止 (HTTPRoute),根據伺服器名稱指示 (SNI) 將流量轉送至內建容器化 Pod,以及外部虛擬機器上託管的應用程式。
架構

這項解決方案的主要元件包括:
- 用戶端:啟動 HTTPS 要求以與應用程式互動的實體。
- GDC 標準叢集: GDC 提供內建方式,可建立 Kubernetes Vanilla 叢集。在本解決方案中,叢集將代管 L7 LB 和其控制器,以及外部 VM 的工作負載和無標頭服務。
- GDC L4 負載平衡器:內建的 L4 負載平衡器做為進入點,直接將 TCP/443 流量分配給執行 Gateway 控制器的 Kubernetes Pod。
- 閘道控制器:在標準叢集中執行的 NGINX 運算子。
這類控制器會監控 Gateway API 資源 (例如
Gateway和HTTPRoute),並動態更新基礎 Proxy。Nginx Gateway Fabric 將用於解決方案。 - 閘道 (含 HTTPRoute):標準化 Kubernetes 資源,定義實體接聽埠 (443) 和以 SNI 為準的主機轉送規則,並終止 TLS。
- 容器化工作負載 (Pod):標準 Kubernetes 部署作業,透過一般 Kubernetes
Service在內部公開。 - 以 VM 為基礎的工作負載 (外部):工作負載託管於專案網路的外部 VM,透過無標題 Kubernetes
Service和包含 VM 直接 IP 的自訂端點,向 Proxy 公開。 - Harbor Registry:用於儲存及提供無網路環境中 Proxy 和應用程式映像檔的私人容器登錄檔。
在標準叢集中,您會建立四個命名空間:
主機 Nginx Gateway Fabric 資源的
nginx-gateway命名空間:
主機
Gateway資源的load-balancer命名空間:
vm-app命名空間會代管外部 VM IPvm-app、無標頭服務、指向外部 IP 的EndpointSlice,以及Gateway的HTTPRoute:
hello-app命名空間會代管Deployment、Service、HTTPRoute和Gateway,用於示範容器工作負載:
事前準備
部署這項解決方案前,請確認您已符合下列先決條件:
- 所需軟體:helm、docker、kubectl
CLI 登入和本機設定:從 GDC 控制台下載 gdcloud CLI,並在本機設定環境。
export USER_NAME="USER_NAME" export PROJECT_ID="PROJECT_ID" export ZONE="ZONE" export ORG_NAME="ORG_NAME" export GDCH_URL="GDC_URL" gdcloud components install gdcloud-k8s-auth-plugin gdcloud config set core/organization_console_url \ https://console.$ORG_NAME.$ZONE.$GDC_URL gdcloud config set core/zone $ZONE gdcloud config set core/project ${PROJECT_ID} gdcloud auth login # use --login-config-cert option in case of TLS error專案設定:在 GDC 氣隙環境中建立專案,用於存放資源。
gdcloud projects create $PROJECT_IDIAM 角色:授予使用者「叢集管理員」和「標準叢集管理員」角色,以便管理 Kubernetes 資源,並授予「Harbor 執行個體管理員」角色,以便推送映像檔。
# Grant standard cluster and cluster admin roles gdcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="user:${USER_NAME}" \ --role=cluster-admin gdcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="user:${USER_NAME}" \ --role=standard-cluster-admin # Grant Harbor instance admin role gdcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="user:${USER_NAME}" \ --role=harbor-instance-admin
建立標準叢集
本節將引導您在 GDC 氣隙環境中設定標準 Kubernetes 叢集。標準叢集提供彈性且穩固的基礎,可部署各種工作負載,包括 Nginx Gateway Controller 和自訂應用程式。請按照下列步驟操作,確保叢集設定正確,且可供後續部署作業存取。
執行下列指令,找出可用的虛擬機器映像檔類型:
gdcloud compute machine-types list為叢集 worker 節點選取適當的機型。在本教學課程中,建議使用至少有 4 個 vCPU 的機型。
export MACHINE_TYPE="MACHINE_TYPE"取得管理 API 伺服器 kubeconfig 並設定別名:
export CLUSTER_NAME="CLUSTER_NAME" KUBECONFIG=kubeconfig-admin.yaml gdcloud clusters \ get-credentials ${ORG_NAME}-admin alias km="kubectl --kubeconfig kubeconfig-admin.yaml"建立含有 2 個 worker 節點的標準叢集:
km create -f - <<EOF apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: ${CLUSTER_NAME} namespace: ${PROJECT_ID} spec: nodePools: - machineTypeName: ${MACHINE_TYPE} nodeCount: 2 name: ${CLUSTER_NAME}-node-pool EOF如要進一步瞭解可用選項,請參閱說明文件。
建立標準叢集最多可能需要 60 分鐘。如要檢查狀態,請使用下列指令:
km get clusters/${CLUSTER_NAME} \ -n ${PROJECT_ID} \ --watch叢集準備就緒後,輸出內容應會顯示「Running」狀態,如下所示:
NAME STATE K8S VERSION my-cluster Running 1.30.12-gke.300叢集準備就緒後,請擷取憑證:
KUBECONFIG=kubeconfig-${CLUSTER_NAME}.yaml gdcloud clusters \ get-credentials ${CLUSTER_NAME} \ --standard \ --project ${PROJECT_ID} \ --zone ${ZONE}建立別名,讓本指南其餘部分的
kubectl指令更簡潔。這個別名將用於與標準叢集互動:alias kk="kubectl --kubeconfig kubeconfig-${CLUSTER_NAME}.yaml"為控制器、「hello-app」示範容器化應用程式和 VM 型試用版應用程式建立命名空間:
kk create namespace load-balancer kk create namespace hello-app kk create namespace vm-app
建立及整合 Harbor 登錄檔
Harbor 是容器映像檔登錄檔,在 GDC 氣隙環境中內建支援。本節將逐步說明如何將 Harbor 登錄檔與標準叢集整合,包括設定憑證和密鑰,以安全地提取及推送映像檔。
- 在專案中建立 Harbor 執行個體。
- 在 Harbor 執行個體中建立 Harbor 專案。
設定環境變數:
export HARBOR_INSTANCE_NAME="HARBOR_INSTANCE_NAME" export HARBOR_INSTANCE_URL="HARBOR_INSTANCE_URL" export HARBOR_PROJECT="HARBOR_INSTANCE_PROJECT" export IMAGE_PULL_SECRET_NAME="harbor-secret"使用機器人帳戶登入 Harbor 執行個體:
docker --config=./docker login ${HARBOR_INSTANCE_URL}在標準叢集中建立密鑰:
kk create secret docker-registry ${IMAGE_PULL_SECRET_NAME} \ --from-file=.dockerconfigjson=./docker/config.json \ -n load-balancer kk create secret docker-registry ${IMAGE_PULL_SECRET_NAME} \ --from-file=.dockerconfigjson=./docker/config.json \ -n hello-app
部署示範容器化應用程式
本節詳細說明如何在 GDC 氣隙 Kubernetes 叢集中部署範例容器化應用程式 (hello-app)。您將建立必要的 Kubernetes Deployment 和 Service 資源,以執行 hello-app 並在叢集內部公開,準備透過 L7 負載平衡器存取。
將範例圖片上傳至 Harbor,供示範容器化應用程式使用:
docker pull gcr.io/google-samples/hello-app:1.0 \ --platform linux/amd64 docker tag gcr.io/google-samples/hello-app:1.0 \ ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/hello-app:1.0 docker --config=./docker push \ ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/hello-app:1.0在標準叢集中部署下列資訊清單:
cat << EOF > hello-app.yaml apiVersion: apps/v1 kind: Deployment metadata: name: hello-app namespace: hello-app spec: replicas: 2 selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-server image: ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/hello-app:1.0 ports: - containerPort: 8080 imagePullSecrets: - name: ${IMAGE_PULL_SECRET_NAME} --- apiVersion: v1 kind: Service metadata: name: hello-app namespace: hello-app spec: type: ClusterIP selector: app: hello-app ports: - protocol: TCP port: 80 targetPort: 8080 EOF kk apply -f hello-app.yaml
然後確認部署作業和服務是否已完成:
kk get svc,deploy -n hello-app
在 VM 中部署示範應用程式
本節詳細說明如何在 Kubernetes 叢集外的虛擬機器 (VM) 中部署範例應用程式。在 VM 上設定 HTTP 伺服器,模擬負載平衡器可公開的外部應用程式,展示負載平衡器管理叢集內外資源流量的能力。
首先,為試用版應用程式建立 VM
- 在網路瀏覽器中開啟 GDC 控制台。
- 選取與您建立標準 Kubernetes 叢集時相同的專案。
- 開啟選單,然後按一下「虛擬機器」。
- 點選「建立執行個體」。
- 將 VM 命名為
vm-workload。2 個 vCPU 的映像檔就足以應付這個範例。 - 選取 Ubuntu 22.04 發行版本做為開機磁碟映像檔,這個版本已預先安裝 Python。
- 點選「建立」。
- 請稍候幾分鐘,等待 VM 準備就緒。
- 與 VM 建立 SSH 連線:
- 在 GDC 控制台中,按一下 VM。
- 按一下「Connect with SSH」。
連線至 SSH 控制台後,請執行下列指令:
mkdir ~/simple-server
cd ~/simple-server
echo 'Welcome to my VM!' > index.html
python3 -m http.server --bind 0.0.0.0 8080 &
如要將流量轉送至 VM,請建立無標頭的 Service (不含選取器)。這會使用 EndpointSlice 資源手動對應至 VM 的內部 IP 位址。
kk apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: vm-app-svc
namespace: vm-app
spec:
ports:
- protocol: TCP
port: 443
targetPort: 443
EOF
執行下列指令,取得 vm-workload VM 的 IP 位址:
gdcloud compute instances list --project ${PROJECT_ID} \
| grep workload-vm | awk '{print $3}'
輸出內容是 VM 的 IP 位址,設定 EndpointSlice 資源時需要用到這個位址。
建立將連線至 VM 應用程式的資源 EndpointSlice,並指定流量應路由傳送至的 VM IP 位址。
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: vm-app-endpoints
namespace: vm-app
labels:
kubernetes.io/service-name: vm-app-svc
addressType: IPv4
ports:
- port: 8080
endpoints:
- addresses:
- "VM_IP"
conditions:
ready: true
建立自行簽署的憑證
本節將逐步說明如何為應用程式產生自行簽署的 TLS 憑證。為方便起見,本指南使用自行簽署的憑證,但在正式環境中,您必須使用正式級別的憑證,如「選用:使用正式版憑證」一節所述。這些憑證對於在 Nginx 閘道啟用 HTTPS 終止功能至關重要,可確保用戶端與負載平衡器之間的通訊經過加密,適用於以容器為基礎和以 VM 為基礎的工作負載。
為容器化應用程式建立憑證:
openssl req -x509 -newkey rsa:2048 -nodes \ -keyout tls-containerized.key \ -out tls-containerized.crt \ -subj "/CN=k8s-app.example.com" \ -days 365 kk create secret tls tls-containerized \ --namespace load-balancer \ --key tls-containerized.key \ --cert tls-containerized.crt kk create secret tls tls-containerized \ --namespace hello-app \ --key tls-containerized.key \ --cert tls-containerized.crt為 VM 應用程式建立憑證:
openssl req -x509 -newkey rsa:2048 -nodes \ -keyout tls-vm.key \ -out tls-vm.crt \ -subj "/CN=vm-app.example.com" \ -days 365 kk create secret tls tls-vm \ --namespace load-balancer \ --key tls-vm.key \ --cert tls-vm.crt kk create secret tls tls-vm \ --namespace vm-app \ --key tls-vm.key \ --cert tls-vm.crt
部署 NGINX
本節將說明如何部署 Nginx Gateway Controller,包括安裝 Gateway API 自訂資源定義 (CRD)、使用 Helm 設定 Nginx Gateway Fabric,以及在標準叢集中驗證安裝作業。這項操作會準備基礎架構,以進行進階的第 7 層路由。
安裝 Gateway API CRD
部署控制器前,必須先在叢集中安裝 Gateway API 的自訂資源定義 (CRD)。我們會使用 Gateway API 專案的官方實驗性自訂資源定義 (CRD),本指南使用 1.2.0 版。
安裝實驗性 CRD:
kk apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/experimental-install.yaml執行
kk get crd gateways.gateway.networking.k8s.io,確認 CRD 是否安裝成功。
安裝 NGINX Gateway Fabric
使用 Helm 部署 NGINX Gateway Fabric 控制器。這個控制器會監控 Gateway API 資源,並設定 NGINX 來處理流量。
設定 NGINX 映像檔標記:
helm template nfg oci://ghcr.io/nginx/charts/nginx-gateway-fabric | grep "image:" # get the tag of the nginx-gateway-fabric (in following case 2.4.2) export NGINX_TAG="2.4.2"提取 NGINX Gateway Fabric 和 NGINX 映像檔,然後推送至 Harbor 登錄檔:
docker pull ghcr.io/nginx/nginx-gateway-fabric:${NGINX_TAG} docker tag ghcr.io/nginx/nginx-gateway-fabric:${NGINX_TAG} \ ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/nginx-gateway-fabric:${NGINX_TAG} docker --config=./docker push \ ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/nginx-gateway-fabric:${NGINX_TAG} docker pull nginx:1.27.3 docker tag nginx:1.27.3 \ ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.27.3 docker --config=./docker push \ ${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.27.3建立
nginx-gateway命名空間,並新增 Harbor 映像檔提取密鑰:kk create namespace nginx-gateway kk create secret docker-registry ${IMAGE_PULL_SECRET_NAME} \ --from-file=.dockerconfigjson=./docker/config.json \ -n nginx-gateway使用 Helm 部署 NGINX Gateway Fabric,並指向 Harbor 登錄檔中的映像檔:
KUBECONFIG=kubeconfig-${CLUSTER_NAME}.yaml helm upgrade --install ngf \ oci://ghcr.io/nginx/charts/nginx-gateway-fabric \ --create-namespace -n nginx-gateway \ --set nginxGateway.image.tag="${NGINX_TAG}" \ --set nginxGateway.image.repository="${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/nginx-gateway-fabric" \ --set nginx.image.repository="${HARBOR_INSTANCE_URL}/${HARBOR_PROJECT}/nginx" \ --set nginxGateway.serviceAccount.imagePullSecret="${IMAGE_PULL_SECRET_NAME}" \ --set nginx.imagePullSecret="${IMAGE_PULL_SECRET_NAME}"Kubernetes 部署作業會使用提供的密鑰 (
${IMAGE_PULL_SECRET_NAME}) 從 Harbor 安全地提取映像檔,其中包含 Harbor 機器人帳戶的憑證。確認
GatewayClass資源已接受:kk get gatewayclass您應該會看到「
nginx」列在「ACCEPTED = True」下方。
建立 Gateway 執行個體
定義監聽通訊埠 443 的邏輯負載平衡器執行個體。我們會將其設定為 Terminate 模式,也就是說,閘道會執行 TLS 終止作業並解密流量,然後再傳送流量。
建立及套用 gateway.yaml:
cat << EOF > gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: my-gateway
namespace: load-balancer
spec:
gatewayClassName: nginx
listeners:
- name: https-k8s-workload
hostname: "k8s-app.example.com"
port: 443
protocol: HTTPS
allowedRoutes:
namespaces:
from: All
tls:
mode: Terminate
certificateRefs:
- kind: Secret
name: tls-containerized
- name: https-vm-workload
hostname: "vm-app.example.com"
port: 443
protocol: HTTPS
allowedRoutes:
namespaces:
from: All
tls:
mode: Terminate
certificateRefs:
- kind: Secret
name: tls-vm
EOF
kk apply -f gateway.yaml
檢查是否顯示以下訊息,確認閘道已成功部署:PROGRAMMEDTrue
kk get gateway my-gateway --n load-balancer
確認已將代管 GDC L4 負載平衡器部署為 Service,與閘道並行
kk get services -n load-balancer
檢查 Nginx 服務是否已建立及設定,輸出內容應如下所示:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-gateway-nginx LoadBalancer 10.252.19.148 10.200.32.43 443:30649/TCP 45h
定義第 7 層路由邏輯 (HTTPRoute)
將 HTTPRoute 繫結至 Gateway,根據要求的主機名稱 (SNI) 定義流量分配方式。
建立及套用 routing.yaml:
cat << EOF > routing.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: k8s-http-route
namespace: hello-app
spec:
parentRefs:
- name: my-gateway
namespace: load-balancer
hostnames:
- "k8s-app.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: hello-app
namespace: hello-app
port: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: vm-http-route
namespace: vm-app
spec:
parentRefs:
- name: my-gateway
namespace: load-balancer
hostnames:
- "vm-app.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: vm-app-svc
namespace: vm-app
port: 443
EOF
kk apply -f routing.yaml
擷取負載平衡器 IP
執行指令來取得 Nginx 負載平衡器的 IP
kk get services/my-gateway-nginx \
-n load-balancer \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}'
驗證應用程式存取權時,您需要提供這項資訊。這個值稍後會稱為 LOAD_BALANCER_IP。
建立用戶端 VM
按照步驟建立用戶端 VM
- 在網路瀏覽器中開啟 GDC 控制台。
- 開啟選單,然後按一下「虛擬機器」。
- 點選「建立執行個體」。
- 建立名為
client的 VM,選取小型機型,然後選取 Rocky Linux 或 Ubuntu,這些作業系統已預先安裝curl。 - 點選「建立」。
- 請稍候幾分鐘,等待 VM 準備就緒。
- VM 準備就緒後,請建立 VM 的 SSH 連線:
- 在 GDC 控制台中,按一下 VM。
- 按一下「Connect with SSH」。
驗證存取權和路徑
如要測試路由,請從用戶端 VM 執行 curl 指令。您可以使用定義的主機名稱和負載平衡器的 IP 位址,連線至這兩個應用程式。
在 curl 中傳遞 --resolve 標記,即可強制網域名稱解析為 GDC 無網路連線 L4 負載平衡器的 IP 位址。請注意,我們會傳遞 -k 旗標,以信任自行簽署的憑證。
測試 Kubernetes 容器化應用程式:
curl -k --resolve k8s-app.example.com:443:$LOAD_BALANCER_IP https://k8s-app.example.com -v
測試外部 VM 應用程式:
curl -k --resolve vm-app.example.com:443:$LOAD_BALANCER_IP https://vm-app.example.com -v
如果設定正確,Gateway 控制器會順暢地充當 TLS 終止程式,並將流量傳遞至目的地。
選用:使用可用於正式環境的憑證
本節說明如何運用 GDC 氣隙 CA 服務建立私人根憑證授權單位 (CA)、為工作負載核發已簽署的憑證,以及安全地更新 GDC 氣隙標準叢集和用戶端 VM。
本節說明如何使用 GDC 氣隙 CA 服務建立私人根憑證授權單位 (CA),並為應用程式核發有效憑證。在用戶端 VM 上安裝這個根 CA 後,您就能驗證 TLS 終止作業是否能順暢地使用信任的憑證,不必略過 SSL 警告 (例如使用 curl -k)。
授予必要權限並取得憑證
如要管理 CA 服務及核發憑證,使用者必須在專案中具備適當的 IAM 角色。
授予
certificate-authority-service-admin和certificate-requester角色:gdcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member=user:${USER_NAME} \ --role=certificate-authority-service-admin gdcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member=user:${USER_NAME} \ --role=certificate-requester取得管理 API 伺服器的憑證:
gdcloud clusters get-credentials ${ORG_NAME}-admin
建立根 CA
您會在專案命名空間的管理 API 伺服器中建立憑證授權單位。
套用
CertificateAuthority資源:km apply -f - <<EOF apiVersion: pki.security.gdc.goog/v1 kind: CertificateAuthority metadata: name: my-root-ca namespace: ${PROJECT_ID} spec: caProfile: commonName: "My Root CA" duration: 87600h # 10 years keyAlgorithm: RSA_2048 maxChainLength: 1 caType: ROOT keyLocation: HSM rotationPolicy: cronTime: 0 0 1 1 * EOFkm -n ${PROJECT_ID} get \ certificateauthority.pki.security.gdc.goog/my-root-ca -ojson \ | jq -r ' .status.conditions[] | select( .type as $id | "Ready" | index($id)) .status'
核發及部署憑證
準備好 CA 後,您會為容器化應用程式和 VM 型應用程式要求憑證。這些要求會在管理 API 伺服器中發生,產生的金鑰必須移至標準叢集。
為兩個網域建立要求:
km apply -f - <<EOF
apiVersion: pki.security.gdc.goog/v1
kind: CertificateRequest
metadata:
name: tls-containerized-req
namespace: ${PROJECT_ID}
spec:
certificateAuthorityRef:
name: my-root-ca
namespace: ${PROJECT_ID}
certificateConfig:
subjectConfig:
commonName: "k8s-app.example.com"
dnsNames:
- "k8s-app.example.com"
signedCertificateSecret: tls-containerized-signed
---
apiVersion: pki.security.gdc.goog/v1
kind: CertificateRequest
metadata:
name: tls-vm-req
namespace: ${PROJECT_ID}
spec:
certificateAuthorityRef:
name: my-root-ca
namespace: ${PROJECT_ID}
certificateConfig:
subjectConfig:
commonName: "vm-app.example.com"
dnsNames:
- "vm-app.example.com"
signedCertificateSecret: tls-vm-signed
EOF
稍待片刻,系統就會核發憑證。當「Ready」條件為 True 時,即可確認是否已準備就緒:
km get certificaterequests -n ${PROJECT_ID}
更新標準叢集
如果您已按照本指南先前的章節操作,標準叢集應已包含自行簽署的密鑰。您必須先刪除這些版本,才能建立新的簽署版本:
kk delete secret tls-containerized -n load-balancer
kk delete secret tls-vm -n load-balancer
kk delete secret tls-containerized -n hello-app
kk delete secret tls-vm -n vm-app
現在,請從管理 API 伺服器中擷取已簽署的憑證,並在標準叢集中建立新的密鑰。
km get secret -n ${PROJECT_ID} tls-containerized-signed \
-o jsonpath='{.data.tls\.crt}' \
| base64 -d > tls-containerized.crt
km get secret -n ${PROJECT_ID} tls-containerized-signed \
-o jsonpath='{.data.tls\.key}' \
| base64 -d > tls-containerized.key
kk create secret tls tls-containerized \
--namespace load-balancer \
--key tls-containerized.key \
--cert tls-containerized.crt
kk create secret tls tls-containerized \
--namespace hello-app \
--key tls-containerized.key \
--cert tls-containerized.crt
km get secret -n ${PROJECT_ID} tls-vm-signed \
-o jsonpath='{.data.tls\.crt}' \
| base64 -d > tls-vm.crt
km get secret -n ${PROJECT_ID} tls-vm-signed \
-o jsonpath='{.data.tls\.key}' \
| base64 -d > tls-vm.key
kk create secret tls tls-vm \
--namespace load-balancer \
--key tls-vm.key \
--cert tls-vm.crt
kk create secret tls tls-vm \
--namespace vm-app \
--key tls-vm.key \
--cert tls-vm.crt
負載平衡器會自動取得並重新整理新密鑰。
設定用戶端信任
如要驗證設定,您需要告知用戶端 VM 信任新的根 CA。
將根 CA 憑證擷取至檔案:
km get secret -n ${PROJECT_ID} my-root-ca-secret \
-o jsonpath='{.data.tls\.crt}' \
| base64 -d > my-root-ca.crt
將憑證轉移至用戶端 VM。(您可以複製 my-root-ca.crt 的內容,然後貼到用戶端 VM 的檔案中)。
在用戶端 VM 上更新信任存放區。
如果 client VM 是 Ubuntu:
sudo cp my-root-ca.crt /usr/local/share/ca-certificates/
sudo chmod 644 /usr/local/share/ca-certificates/my-root-ca.crt
sudo update-ca-certificates
如果 client VM 是 Rocky Linux:
sudo cp my-root-ca.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
驗證存取權
您現在可以使用 curl 存取應用程式,不必使用 -k 標記。系統會完全信任該連線。
測試 Kubernetes 容器化應用程式:
curl -v --resolve k8s-app.example.com:443:LOAD_BALANDER_IP https://k8s-app.example.com
測試 VM 應用程式:
curl -v --resolve vm.example.com:443:LOAD_BALANDER_IP https://vm-app.example.com
如果成功,您會立即看到應用程式輸出內容,且不會收到任何 SSL 憑證警告。