本指南介绍如何在 GKE on VMware 和 GKE on Bare Metal 上进行 Anthos Service Mesh 版本 1.11.8-asm.4 的全新安装。如果您安装了先前版本的 Anthos Service Mesh,请参阅升级本地 Anthos Service Mesh。安装指南介绍了如何安装 Anthos Service Mesh 证书授权机构 (Mesh CA) 或 Istio 证书授权机构(以前称为 Citadel)。本指南将集群称为 cluster1
,但您可以重复以下步骤来设置多个集群。
关于控制平面组件
GKE on VMware 和 GKE on Bare Metal 预安装了以下 Istio 组件:
- Istio 证书授权机构(以前称为 Citadel)安装在
kube-system
命名空间中。 - Istio Ingress Gateway 和其他 Istio 组件安装在
gke-system
命名空间中。
GKE on VMware 和 GKE on Bare Metal 使用这些组件来启用入站流量,以及保护由 Google 控制的组件之间的通信。
安装 Anthos Service Mesh 时,其组件会安装在 istio-system
命名空间中。由于 Anthos Service Mesh 组件位于不同的命名空间中,因此不会与预安装的 Istio 组件发生冲突。
准备工作
在开始设置之前,请查看以下要求。
使用要求
您必须有 Anthos 订阅。或者,用户可以选择仅适用于 Google Cloud 上的 GKE Enterprise 的随用随付结算选项。如需了解详情,请参阅 GKE Enterprise 价格指南。
验证您安装 Anthos Service Mesh 的用户集群至少具有 4 个 vCPU、15 GB 内存和 4 个节点。
仅限 Mesh CA:您的用户集群节点需要互联网才能成功完成 Anthos Service Mesh 安装。无法通过 HTTP 代理访问互联网。
您必须使用以下语法命名服务端口:
name: protocol[-suffix]
,其中方括号表示必须以短划线开头的可选后缀。如需了解详情,请参阅为服务端口命名。验证是否已在支持的平台中列出集群版本。
设置您的环境
在控制安装过程的计算机上,您需要使用以下工具。请注意,您只能在用户集群上安装 Anthos Service Mesh,不能在管理员集群上安装。
curl
命令行工具。- Google Cloud CLI。
安装 Google Cloud CLI 后:
使用 Google Cloud CLI 进行身份验证:
gcloud auth login
更新组件:
gcloud components update
安装
kubectl
:gcloud components install kubectl
安装
kpt
:curl -L https://github.com/GoogleContainerTools/kpt/releases/download/v0.39.2/kpt_linux_amd64 > kpt_0_39_2 chmod +x kpt_0_39_2 alias kpt="$(readlink -f kpt_0_39_2)"
设置环境变量
使用此命令输出中
NAME
列下的值获取集群的上下文名称:kubectl config get-contexts
将环境变量设置为集群上下文名称,本指南后面将在许多步骤中用到这些环境变量:
export CTX_CLUSTER1=CLUSTER1_CONTEXT_NAME
授予集群管理员权限
向您的用户账号(您的 Google Cloud 登录电子邮件地址)授予集群管理员权限。您需要这些权限,以便为 Anthos Service Mesh 创建必要的基于角色的访问权限控制 (RBAC) 规则:
kubectl --context="${CTX_CLUSTER1}" create clusterrolebinding cluster-admin-binding \ --clusterrole=cluster-admin \ --user=USER_ACCOUNT
下载安装文件
Linux
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.11.8-asm.4-linux-amd64.tar.gz
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.11.8-asm.4-linux-amd64.tar.gz.1.sig openssl dgst -verify /dev/stdin -signature istio-1.11.8-asm.4-linux-amd64.tar.gz.1.sig istio-1.11.8-asm.4-linux-amd64.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
。将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.11.8-asm.4-linux-amd64.tar.gz
该命令会在当前工作目录中创建一个名为
istio-1.11.8-asm.4
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.11.8-asm.4
Mac OS
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.11.8-asm.4-osx.tar.gz
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.11.8-asm.4-osx.tar.gz.1.sig openssl dgst -sha256 -verify /dev/stdin -signature istio-1.11.8-asm.4-osx.tar.gz.1.sig istio-1.11.8-asm.4-osx.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
。将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.11.8-asm.4-osx.tar.gz
该命令会在当前工作目录中创建一个名为
istio-1.11.8-asm.4
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.11.8-asm.4
Windows
将 Anthos Service Mesh 安装文件下载到当前工作目录中:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.11.8-asm.4-win.zip
下载签名文件并使用
openssl
验证签名:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.11.8-asm.4-win.zip.1.sig openssl dgst -verify - -signature istio-1.11.8-asm.4-win.zip.1.sig istio-1.11.8-asm.4-win.zip <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
预期输出为
Verified OK
。将文件内容提取到文件系统上的任意位置。例如,如需将内容提取到当前工作目录,请运行以下命令:
tar xzf istio-1.11.8-asm.4-win.zip
该命令会在当前工作目录中创建一个名为
istio-1.11.8-asm.4
的安装目录,其中包含:samples
目录中的示例应用。- 用于安装 Anthos Service Mesh 的
istioctl
命令行工具位于bin
目录中。 - Anthos Service Mesh 配置文件位于
manifests/profiles
目录中。
确保您位于 Anthos Service Mesh 安装的根目录。
cd istio-1.11.8-asm.4
使用 Mesh CA 安装 Anthos Service Mesh
本部分介绍如何使用 Mesh CA 安装 Anthos Service Mesh 并将集群注册到队列。基于以下原因,我们通常建议您使用 Mesh CA:
- Mesh CA 是一项高度可靠的可扩缩服务,针对 Google Cloud 上和本地的动态扩缩的工作负载进行了优化。
- 通过 Mesh CA,Google 负责管理 CA 后端的安全性和可用性。
- Mesh CA 让您可在集群中依赖单个信任根。
如果您要将 Istio CA 与自己的根 CA 搭配使用,请参阅配置 Istio CA。
Mesh CA 功能取决于队列注册。默认情况下,您的集群会注册到队列中。如需验证集群的状态,请参阅查看已注册的集群。
启用以下 API:
gcloud services enable \ anthos.googleapis.com \ cloudtrace.googleapis.com \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ compute.googleapis.com \ gkeconnect.googleapis.com \ gkehub.googleapis.com \ iam.googleapis.com \ iamcredentials.googleapis.com \ logging.googleapis.com \ meshca.googleapis.com \ meshtelemetry.googleapis.com \ meshconfig.googleapis.com \ monitoring.googleapis.com \ stackdriver.googleapis.com \ sts.googleapis.com
初始化网格配置:
IDENTITY_PROVIDER="$(kubectl get memberships.hub.gke.io membership -o=jsonpath='{.spec.identity_provider}')" IDENTITY="$(echo "${IDENTITY_PROVIDER}" | sed 's/^https:\/\/gkehub.googleapis.com\/projects\/\(.*\)\/locations\/global\/memberships\/\(.*\)$/\1 \2/g')" read -r ENVIRON_PROJECT_ID HUB_MEMBERSHIP_ID <<EOF ${IDENTITY} EOF POST_DATA='{"workloadIdentityPools":["'${ENVIRON_PROJECT_ID}'.hub.id.goog","'${ENVIRON_PROJECT_ID}'.svc.id.goog"]}' curl --request POST \ --header "Content-Type: application/json" \ --header "Authorization: Bearer $(gcloud auth print-access-token)" \ --data "${POST_DATA}" \ https://meshconfig.googleapis.com/v1alpha1/projects/${ENVIRON_PROJECT_ID}:initialize
为安装进行配置:
kpt pkg get \ https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git/asm@release-1.11 asm ENVIRON_PROJECT_NUMBER=$(gcloud projects describe "${ENVIRON_PROJECT_ID}" --format="value(projectNumber)") CLUSTER_NAME="${HUB_MEMBERSHIP_ID}" CLUSTER_LOCATION="global" HUB_IDP_URL="$(kubectl get memberships.hub.gke.io membership -o=jsonpath='{.spec.identity_provider}')" kpt cfg set asm gcloud.core.project ${ENVIRON_PROJECT_ID} kpt cfg set asm gcloud.container.cluster ${CLUSTER_NAME} kpt cfg set asm gcloud.compute.location ${CLUSTER_LOCATION} kpt cfg set asm anthos.servicemesh.hub gcr.io/gke-release/asm kpt cfg set asm anthos.servicemesh.rev asm-1118-4 kpt cfg set asm anthos.servicemesh.tag 1.11.8-asm.4 kpt cfg set asm gcloud.project.environProjectNumber ${ENVIRON_PROJECT_NUMBER} kpt cfg set asm anthos.servicemesh.trustDomain ${ENVIRON_PROJECT_ID}.svc.id.goog kpt cfg set asm anthos.servicemesh.idp-url "${HUB_IDP_URL}"
如果需要,请切换到
istio-1.11.8-asm.4
目录。istioctl
客户端依赖于版本。请确保使用istio-1.11.8-asm.4/bin
目录中的版本。运行以下命令以安装 Anthos Service Mesh。
bin/istioctl install \ -f asm/istio/istio-operator.yaml \ -f asm/istio/options/hub-meshca.yaml --revision=asm-1118-4
如果您要启用受支持的可选功能,请在以下命令行的
-f cluster.yaml
后添加-f
和 YAML 文件名。如需了解详情,请参阅启用可选功能。
使用 Istio CA 安装 Anthos Service Mesh
本部分介绍如何为 Anthos Service Mesh On-Prem 用于对工作负载签名的 Istio CA 生成证书和密钥。如果您已使用 Mesh CA 安装 Anthos Service Mesh,则可以跳至设置默认网络。
为了获得最佳安全性,我们强烈建议您维护离线根 CA,并使用从属 CA 为每个集群颁发证书。如需了解详情,请参阅插入 CA 证书。在此配置中,服务网格中的所有工作负载都将使用相同的根证书授权机构 (CA)。每个 Anthos Service Mesh CA 使用中间 CA 签名密钥和证书(由根 CA 签名)。当网格中存在多个 CA 时,这会建立 CA 间的信任层次结构。您可以重复这些步骤,为任意数量的证书授权机构预配证书和密钥。
为证书和密钥创建一个目录:
mkdir -p certs && \ pushd certs
生成根证书和密钥:
make -f ../tools/certs/Makefile.selfsigned.mk root-ca
这会生成以下文件:
- root-cert.pem:根证书
- root-key.pem:根密钥
- root-ca.conf:openssl 用于生成根证书的配置
- root-cert.csr:根证书的 CSR
生成中间证书和密钥:
make -f ../tools/certs/Makefile.selfsigned.mk cluster1-cacerts
此操作会在名为
cluster1
的目录中生成以下文件:- ca-cert.pem:中间证书
- ca-key.pem:中间密钥
- cert-chain.pem:istiod 使用的证书链
- root-cert.pem:根证书
如果您使用离线计算机执行这些步骤,请将生成的目录复制到有权访问集群的计算机。
创建 Secret
cacerts
(包括所有输入文件ca-cert.pem
、ca- key.pem
、root-cert.pem
和cert-chain.pem
):kubectl --context="${CTX_CLUSTER1}" create namespace istio-system kubectl --context="${CTX_CLUSTER1}" create secret generic cacerts -n istio-system \ --from-file=cluster1/ca-cert.pem \ --from-file=cluster1/ca-key.pem \ --from-file=cluster1/root-cert.pem \ --from-file=cluster1/cert-chain.pem
Anthos Service Mesh On-Prem 将检测这些证书/密钥是否存在,并在安装过程的后续步骤中使用这些证书/密钥。
返回上一个目录:
popd
使用 Istio CA 配置和安装 Anthos Service Mesh
本部分介绍如何使用您之前生成的 Istio CA(以前称为 Citadel)证书安装 Anthos Service Mesh。如果您已使用 Mesh CA 安装 Anthos Service Mesh,则可以跳至设置默认网络。
为项目 ID 创建环境变量:
export PROJECT_ID=YOUR_PROJECT_ID
为项目编号创建环境变量:
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
为网格标识符创建环境变量:此标识符可以是任何字符串,但应采用在您的集群之间一致的格式。
export MESH_ID="proj-${PROJECT_NUMBER}"
为集群的控制层面创建配置,该配置将使用
asm-multicloud
配置文件安装 Anthos Service Mesh。如果您要启用受支持的可选功能,请在以下命令行中添加-f
和 YAML 文件名。如需了解详情,请参阅启用可选功能。在以下示例中:
使用前面步骤中定义的
MESH_ID
。NETWORK_ID
可以是标识集群网络的任何字符串。采用这种本地配置时,每个集群都有自己的网络,因此每个集群应具有不同的值。NETWORK_ID
与语法和字符集中介绍的 Kubernetes 标签具有相同的字符串限制。
cat <<EOF > cluster.yaml apiVersion: install.istio.io/v1alpha1 kind: IstioOperator spec: profile: asm-multicloud revision: asm-1118-4 values: global: meshID: ${MESH_ID} multiCluster: clusterName: CLUSTER_NAME network: NETWORK_ID EOF
如果需要,请切换到
istio-1.11.8-asm.4
目录。istioctl
客户端依赖于版本。请确保使用istio-1.11.8-asm.4/bin
目录中的版本。运行以下命令以安装 Anthos Service Mesh。如果您要启用受支持的可选功能,请在以下命令行中、
-f cluster.yaml
之后添加-f
和 YAML 文件名。如需了解详情,请参阅启用可选功能。bin/istioctl install \ --context="${CTX_CLUSTER1}" \ -f cluster.yaml
设置默认网络
在 istio-system
命名空间中设置默认网络。
kubectl --context="${CTX_CLUSTER1}" label \ namespace istio-system topology.istio.io/network=NETWORK_ID
配置验证网络钩子
安装 Anthos Service Mesh 时,您可以在 istiod
上设置修订版本标签。您需要在验证网络钩子上设置相同的修订版本。
将以下 YAML 复制到名为
istiod-service.yaml
的文件中:cat <<EOF > istiod-service.yaml apiVersion: v1 kind: Service metadata: name: istiod namespace: istio-system labels: istio.io/rev: asm-1118-4 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-1118-4 EOF
配置验证网络钩子,使其能够使用修订版本标签查找
istiod
服务:kubectl --context="${CTX_CLUSTER1}" apply -f istiod-service.yaml
此命令会创建一个服务条目,可让验证网络钩子在配置应用之前自动检查配置。
自动双向 TLS(自动 mTLS)默认情况下处于启用状态。通过自动 mTLS,客户端边车代理会自动检测服务器是否具有 Sidecar。客户端 Sidecar 会将 mTLS 发送到具有 Sidecar 的工作负载,并将纯文本流量发送到没有 Sidecar 的工作负载。
检查控制层面组件
检查 istio-system
中的控制平面 pod 是否正在运行,请运行以下命令:
kubectl --context="${CTX_CLUSTER1}" get pod -n istio-system
预期输出如下所示:
NAME READY STATUS RESTARTS AGE istio-ingressgateway-74cc894bfd-786rg 1/1 Running 0 7m19s istiod-78cdbbbdb-d7tps 1/1 Running 0 7m36s promsd-576b8db4d6-lqf64 2/2 Running 1 7m19s
注入边车代理
Anthos Service Mesh 使用边车代理来增强网络安全性、可靠性和可观测性。借助 Anthos Service Mesh,这些功能可以从应用的主容器中抽象出来,并在作为同一 Pod 中单独的容器提供的常见进程外代理中实现。
您需要启用自动边车代理注入(自动注入),并为在安装 Anthos Service Mesh 之前集群上运行的所有工作负载重启 Pod,才能完成安装。
要启用自动注入功能,请使用安装 Anthos Service Mesh 时在 istiod
上设置的修订版本标签来为您的命名空间添加标签。Sidecar 注入器网络钩子会使用修订版本标签将注入的 Sidecar 与特定 istiod
修订版本相关联。添加标签后,必须重启命名空间中的所有现有 Pod,才能注入 Sidecar。
在将新工作负载部署到新命名空间中之前,请先确保配置自动注入,以便 Anthos Service Mesh 能够监控和保护流量。
如需启用自动注入,请运行以下命令:
使用以下命令查找
istiod
的修订版本标签:kubectl --context=${CTX_CLUSTER1} \ -n istio-system get pods -l app=istiod --show-labels
输出类似于以下内容:
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-1118-4-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-1118-4,istio=istiod,pod-template-hash=5788d57586 istiod-asm-1118-4-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-1118-4,istio=istiod,pod-template-hash=5788d57586
在输出中的
LABELS
列下,记下istiod
修订版本标签的值,该值位于前缀istio.io/rev=
之后。在此示例中,该值为asm-1118-4
。应用修订版本标签并移除
istio-injection
标签(如果存在)。在以下命令中,NAMESPACE
是您要启用自动注入的命名空间的名称,REVISION
是您在上一步中记下的修订版本标签。kubectl --context=${CTX_CLUSTER1} \ 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 --context=${CTX_CLUSTER1} \ rollout restart deployment -n NAMESPACE
验证 pod 是否配置为指向新版
istiod
。kubectl --context=${CTX_CLUSTER1} \ get pods -n NAMESPACE -l istio.io/rev=REVISION
后续步骤
如果您计划为本地服务网格使用多个集群,请参阅在多个集群和网络的本地安装 Anthos Service Mesh。
否则,下一步将是配置外部 IP 地址。