本指南介绍如何在现有 GKE on VMware 上安装 Anthos Service Mesh,以及如何使用 Thales Luna HSM 7+ 和 Hashicorp Vault 安全地生成 Istiod 的 CA 签名密钥并保护 CA 签名密钥。
如果您安装了先前版本的 Anthos Service Mesh,请参阅升级 Anthos Service Mesh GKE on VMware。此安装会在集群上启用支持的功能。
准备工作
在开始设置之前,请查看以下要求。
使用要求
您必须有 Anthos 订阅。或者,用户可以选择仅适用于 Google Cloud 上的 GKE Enterprise 的随用随付结算选项。如需了解详情,请参阅 GKE Enterprise 价格指南。
您必须联系支持团队,要求其授予您访问映像的权限。支持团队还会向您提供其他帮助。
验证安装 Anthos Service Mesh 的集群至少具有 4 个 vCPU、15 GB 内存和 4 个节点。
您必须使用以下语法命名服务端口:
name: protocol[-suffix]
,其中方括号表示必须以短划线开头的可选后缀。如需了解详情,请参阅为服务端口命名。验证是否已在支持的环境中列出了您的集群版本。如需检查集群版本,您可以使用
gkectl
命令行工具。 如果您未安装gkectl
,请参阅 GKE On-Prem 下载。gkectl version
您的基础架构中应具有 Thales Luna HSM 7+。HSM 应设置网络服务并且可以从 Anthos Service Mesh 集群访问。
您的基础架构中应具有 Hashicorp Vault 服务器,存储用于访问 HSM 的凭据。Vault 服务器应能通过网络从 Anthos Service Mesh 集群访问。
设置环境
在控制 Anthos Service Mesh 安装过程的机器上安装以下工具。
curl
命令行工具。- Google Cloud CLI。
安装必要的工具后,请执行以下步骤:
使用 gcloud CLI 进行身份验证:
gcloud auth login --project PROJECT_ID
更新组件:
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
部署依赖项
- 在基础架构中部署 Thales Luna HSM 7+,以安全管理 Istiod CA 签名密钥。确保 HSM 具有网络服务和与 Anthos Service Mesh 集群的连接。
- 在基础架构中部署 Hashicorp Vault 服务器,以存储用于访问 HSM 的凭据。确保 Vault 服务器与 Anthos Service Mesh 集群之间有网络连接。
- 拥有可访问 Vault 服务器、HSM 和安装 Anthos Service Mesh 的 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。您将在后续步骤中用到它。
HSM 使用导入的根证书来验证签名的 Istiod CA 证书。您可以按照此步骤将根证书导入 HSM。将
k8s-kms-plugin
用作客户端,以与 HSM 工具服务器通信。使用以下命令导入根证书。./k8s-kms-plugin import-ca -f root cert PEM file
为 Vault 身份验证设置 Kubernetes
在 Kubernetes 集群中,为 Vault 创建一个专用服务账号和 RBAC 政策,以调用
TokenReview
API。为此,请创建一个专用命名空间。在
vault
命名空间中创建默认服务账号,设置权限,然后提取关联的 JSON Web 令牌 (JWT),以便 Vault 服务器可以调用 KubernetesTokenReview
API。注意:您可以使用任何具有足够的权限的 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
创建一个 Secret 来存储令牌凭据。
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 证书。稍后,配置 Vault 服务器以调用 Kubernetes API 服务器。
获取 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 ..
现在,在下一步中使用集群的目录中的三个文件配置 Vault。
设置 Vault 以存储 HSM 凭据
当 Vault 服务器使用有效证书传送 TLS 流量时,请配置 Vault PKI 并配置 Kubernetes 身份验证。以下是设置单个根 CA 和每个集群的中间 CA 的示例。
以根用户身份登录 Vault。
vault login
存储 HSM 的 Secret。
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.10.6-asm.2-linux-amd64.tar.gz
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.6-asm.2-linux-amd64.tar.gz.1.sig openssl dgst -verify /dev/stdin -signature istio-1.10.6-asm.2-linux-amd64.tar.gz.1.sig istio-1.10.6-asm.2-linux-amd64.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
。将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.10.6-asm.2-linux-amd64.tar.gz
该命令会在当前工作目录中创建一个名为
istio-1.10.6-asm.2
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.10.6-asm.2
Mac OS
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.6-asm.2-osx.tar.gz
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.6-asm.2-osx.tar.gz.1.sig openssl dgst -sha256 -verify /dev/stdin -signature istio-1.10.6-asm.2-osx.tar.gz.1.sig istio-1.10.6-asm.2-osx.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
。将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.10.6-asm.2-osx.tar.gz
该命令会在当前工作目录中创建一个名为
istio-1.10.6-asm.2
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.10.6-asm.2
Windows
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.6-asm.2-win.zip
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.10.6-asm.2-win.zip.1.sig openssl dgst -verify - -signature istio-1.10.6-asm.2-win.zip.1.sig istio-1.10.6-asm.2-win.zip <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
。将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.10.6-asm.2-win.zip
该命令会在当前工作目录中创建一个名为
istio-1.10.6-asm.2
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.10.6-asm.2
在控制层面中设置资源
设置环境变量。
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-1106-2
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-1106-2
安装 Anthos Service Mesh
设置环境变量以将 ASM 配置为与 Vault 和 HSM 交互。以下命令可将等待时间缩短为 10 秒,这是因为由于操作者的待处理导入操作,Istiod 将无法完全准备就绪。
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-1106-2 \ --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
可以看到 Istiod 尚未完全就绪,因为
discovery
容器被阻止并正在等待证书。检查 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 Secret 下载加密的 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
从 Sidecar 触发对服务的 TLS 调用,并使用 bookinfo 作为示例来检查服务使用的证书。
kubectl exec POD -c istio-proxy -- openssl s_client -alpn istio -showcerts -connect details:9080
检查输出中的证书,应在输出中看到服务器端证书链。
注入边车代理
Anthos Service Mesh 使用 Sidecar 代理来增强网络安全性、可靠性和可观测性。借助 Anthos Service Mesh,这些功能可以从应用的主容器中抽象出来,并在作为同一 Pod 中单独的容器提供的常见进程外代理中实现。
您需要启用自动边车代理注入(自动注入),并为在安装 Anthos Service Mesh 之前集群上运行的所有工作负载重启 Pod,才能完成安装。
要启用自动注入功能,请使用安装 Anthos Service Mesh 时在 istiod
上设置的修订版本标签来为您的命名空间添加标签。Sidecar 注入器网络钩子会使用修订版本标签将注入的 Sidecar 与特定 istiod
修订版本相关联。添加标签后,必须重启命名空间中的所有现有 Pod,才能注入 Sidecar。
在将新工作负载部署到新命名空间中之前,请先确保配置自动注入,以便 Anthos Service Mesh 能够监控和保护流量。
如需启用自动注入,请运行以下命令:
使用以下命令查找
istiod
的修订版本标签:kubectl -n istio-system get pods -l app=istiod --show-labels
输出类似于以下内容:
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-1106-2-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-1106-2,istio=istiod,pod-template-hash=5788d57586 istiod-asm-1106-2-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-1106-2,istio=istiod,pod-template-hash=5788d57586
在输出中的
LABELS
列下,记下istiod
修订版本标签的值,该值位于前缀istio.io/rev=
之后。在此示例中,该值为asm-1106-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
标签。如果在安装 Anthos Service Mesh 之前集群上已运行工作负载,请重启 pod 以触发重新注入。
如何重启 pod 取决于您的应用和集群所在的环境。例如,在预演环境中,您可能只需删除所有 pod 即可使其重启。但是,在生产环境中,您可能需要通过实现蓝绿部署流程来安全地重启 pod,以避免流量中断。
您可以使用
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 地址。在 GKE on VMware 上并非如此。因此,您需要为 Anthos Service Mesh 入站流量网关资源手动分配 IP 地址。
要配置外部 IP 地址,请根据集群的负载均衡模式,按照以下某一部分的说明执行操作:
配置集成式负载均衡模式
打开
istio-ingressgateway
Service 的配置:kubectl edit svc -n istio-system istio-ingressgateway
istio-ingressgateway
Service 的配置会在 shell 的默认文本编辑器中打开。在文件中的规范 (
spec
) 块下添加以下行:loadBalancerIP: <your static external IP address>
例如:
spec: loadBalancerIP: 203.0.113.1
保存文件。
配置手动负载均衡模式
要在负载均衡器上使用虚拟 IP 地址 (VIP) 公开 NodePort
类型的服务,请先获取 nodePort
值:
在 shell 中查看
istio-ingressgateway
Service 的配置: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 地址上公开的服务端口。