在集群控制层面上启用可选功能

本页面介绍如何在集群内控制平面上启用可选功能。如需了解代管式控制平面,请参阅配置代管式 Anthos Service Mesh

安装 Anthos Service Mesh 时,默认启用的功能因平台而异。您可以在安装(或升级)Anthos Service Mesh 时添加叠加文件,以启用可选功能。叠加文件是一个 YAML 文件,其中包含您用于配置控制平面的 IstioOperator 自定义资源 (CR)。您可以替换默认配置并启用可选功能,或在叠加文件中停用默认功能。请在每个叠加文件中指定一个功能。您可以叠加多个文件,每个叠加文件会覆盖之前各层的配置。

关于叠加文件

此页面中的叠加文件位于 GitHub 上的 anthos-service-mesh 软件包中。这些文件包含默认配置的常见自定义。您可以按原样使用这些文件,也可以根据需要对这些文件进行其他更改。

使用 Google 提供的 asmcli 脚本安装 Anthos Service Mesh 时,您可以使用 --option--custom_overlay 选项指定一个或多个叠加文件。如果您不需要对 anthos-service-mesh 代码库中的文件进行任何更改,则可以使用 --option,该脚本将从 GitHub 中提取文件。否则,您可以更改叠加文件,然后使用 --custom_overlay 选项将其传递给 asmcli

不要在一个叠加文件中包含多个 CR 为每个 CR 创建单独的叠加文件
一个 YAML 中的多个 CR 每个 CR 的单独 YAML 文件

如何启用可选功能

以下示例经过简化,仅显示自定义叠加层以启用可选功能。将 OTHER_FLAGS 替换为其他命令行选项

asmcli install 命令提供两种启用可选功能的方法。您使用的方法取决于您是否需要更改叠加层文件。

  • 如果不需要对叠加层文件进行任何更改,请使用 --option。使用 --option 时,asmcli 会从 GitHub 代码库中为您提取该文件,因此您必须连接到互联网。

    ./asmcli install \
      OTHER_FLAGS \
      --option OPTION_NAME
    

    OPTION_NAME 替换为您要启用的选项。如需查看选项列表,请参阅 anthos-service-mesh 软件包。

  • 如果您需要自定义叠加层文件,请使用 --custom_overlay

    ./asmcli install \
      OTHER_FLAGS \
      --custom_overlay PATH_TO_FILE
    

    PATH_TO_FILE 替换为您要使用的叠加层文件的路径。

用于可选功能的 YAML

以下几个部分提供用于启用可选功能和支持的功能的 YAML。

mTLS STRICT 模式

global.mtls.enabled 配置已从 IstioOperator CR 中移除,以避免升级出现问题并提供更灵活的安装。如需启用 STRICT mTLS,请改为配置对等身份验证政策

Distroless 代理映像

最佳做法是将容器运行时的内容限制为仅包含必要的软件包。此方法可提高常见漏洞和披露 (CVE) 扫描程序的安全性和信噪比。Istio 提供基于 Distroless 基础映像的代理映像。

以下配置可为整个 Anthos Service Mesh 启用 Distroless 映像。映像类型更改要求每个 pod 重启并重新注入才能生效。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    defaultConfig:
      image:
        imageType: distroless

Distroless 映像不包含代理以外的任何二进制文件。因此,无法使用 exec shell 或使用容器中的 curlping 或其他调试实用程序。如果您尝试执行 shell,则会看到以下错误。

error: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "<container-id>"
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "sh": executable file not found in $PATH: unknown

如果您需要为特定 Pod 访问这些工具,则可以使用以下 Pod 注解替换 imageType

sidecar.istio.io/proxyImageType: debug

通过注解更改部署的映像类型后,部署应重启。

kubectl rollout restart deployment -n NAMESPACE DEPLOYMENT_NAME

对于大多数代理调试类型,应使用 istioctl proxy-cmd,它无需调试基础映像。

为自定义注册表使用自定义叠加层

例如,如果您需要从自定义容器注册表安装 Anthos Service Mesh,那么您可以为自定义注册表使用自定义叠加层。例如:

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  hub: {private_registry_url}

下面是您需要镜像到自定义容器存储库的 Anthos Service Mesh 映像的列表:

  • Install-cni - gcr.io/gke-release/asm/install-cni:1.14.6-asm.16
  • Managed Data Plane - gcr.io/gke-release/asm/mdp:1.14.6-asm.16
  • Pilot - gcr.io/gke-release/asm/pilot:1.14.6-asm.16
  • Proxyv2 - gcr.io/gke-release/asm/proxyv2:1.14.6-asm.16

将映像添加到私有存储库

如需将 Anthos Service Mesh 映像推送到私有注册表,请完成以下步骤。

  1. 拉取 Anthos Service Mesh 映像:
    docker pull gcr.io/gke-release/asm/install-cni:1.14.6-asm.16
    docker pull gcr.io/gke-release/asm/mdp:1.14.6-asm.16
    docker pull gcr.io/gke-release/asm/pilot:1.14.6-asm.16
    docker pull gcr.io/gke-release/asm/proxyv2:1.14.6-asm.16
    
  2. 为私有注册表网址创建变量:
    export PRIVATE_REGISTRY_URL=PRIVATE_REGISTRY_URL
    
    PRIVATE_REGISTRY_URL 替换为您的私有注册表网址。
  3. 使用您的私有注册表网址标记映像:
    docker tag gcr.io/gke-release/asm/install-cni:1.14.6-asm.16 \
     ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/install-cni:1.14.6-asm.16
    docker tag gcr.io/gke-release/asm/mdp:1.14.6-asm.16 \
     ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/mdp:1.14.6-asm.16
    docker tag gcr.io/gke-release/asm/pilot:1.14.6-asm.16 \
     ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/pilot:1.14.6-asm.16
    docker tag gcr.io/gke-release/asm/proxyv2:1.14.6-asm.16 \
     ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/proxyv2:1.14.6-asm.16
    
  4. 将带有标记的映像推送到您的私有注册表:
    docker push ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/install-cni:1.14.6-asm.16
    docker push ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/mdp:1.14.6-asm.16
    docker push ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/pilot:1.14.6-asm.16
    docker push ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/proxyv2:1.14.6-asm.16
    
  5. (可选)如果您使用规范服务,请将规范服务映像添加到您的私有注册表。
    1. 拉取 Anthos Service Mesh 规范服务映像:
              docker pull gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0
              docker pull gcr.io/gke-release/asm/canonical-service-controller:1.10.3-asm.16
              
    2. 使用您的私有注册表网址标记映像:
              docker tag gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0 \
              ${PRIVATE_REGISTRY_URL}/gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0
              docker tag gcr.io/gke-release/asm/canonical-service-controller:1.10.3-asm.16 \
              ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/canonical-service-controller:1.10.3-asm.16
              
    3. 将带有标记的映像推送到您的私有注册表:
              docker push ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/kube-rbac-proxy:v0.5.0
              docker push ${PRIVATE_REGISTRY_URL}/gcr.io/gke-release/asm/canonical-service-controller:1.10.3-asm.16
              

如果您可以从私有存储库中拉取标记的映像,则过程已成功。

将 Envoy 定向到 stdout

---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    accessLogFile: "/dev/stdout"

如需了解详情,请参阅启用 Envoy 的访问日志记录

Cloud Trace

可以在以下平台上安装的 Anthos Service Mesh 使用 Cloud Trace:

  • GKE on Google Cloud
  • 本地 GKE Enterprise 集群(如果您使用 Anthos Service Mesh 证书授权机构 [Mesh CA] 进行安装)

如需详细了解价格信息,请参阅 Cloud Trace 价格页面

---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
  values:
    global:
      proxy:
        tracer: stackdriver

默认采样率为 1%,但您可以通过指定 tracing.sampling 值来替换默认值。值必须在 0.0 到 100.0 的范围内,且精确率为 0.01。例如,如需跟踪每 10000 个请求中的 5 个,请使用 0.05。

以下示例展示了 100% 的采样率(仅用于演示或问题排查目的)。

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
    defaultConfig:
      tracing:
        sampling: 100
  values:
    global:
      proxy:
        tracer: stackdriver

请注意,跟踪器配置目前是代理引导配置的一部分,因此 pod 需要重启并重新注入才能获取跟踪器更新。例如,您可以使用以下命令“重启 pod 属于部署”:

kubectl rollout restart deployment -n NAMESPACE DEPLOYMENT_NAME

跟踪上下文传播

虽然 Sidecar 代理可以自动发送跟踪记录 span,但它们需要一些提示来将整个跟踪记录关联在一起。应用需要传播适当的 HTTP 标头,以便在代理发送 span 信息时,span 可以正确地关联到单个跟踪记录中。

为此,应用需要从传入请求中收集相应标头并将其传播到任何传出请求:Anthos Service Mesh Stackdriver 跟踪配置将接受以下任意标头格式,并传播以下所有格式:

  • B3(x-b3-traceidx-b3-spanidx-b3parentspanidx-b3-sampledx-b3-flags
  • W3C TraceContext (traceparent)
  • Google Cloud Trace (x-cloud-trace-context)
  • gRPC TraceBin (grpc-trace-bin)

这意味着您的应用可以使用其中任何一种格式来传播跟踪上下文,生成跟踪记录,并设置为适当的 Stackdriver。

示例

以下是原始请求带有 traceparent 标头的示例 HTTP-Get 请求。请注意代理添加的其他跟踪记录上下文标头。

$ kubectl exec -it sleep-557747455f-n6flv -- curl "httpbin:8000/anything?freeform=" -H "accept: application/json" -H "Traceparent: 00-7543d15e09e5d61801d4f74cde1269b8-604ef051d35c5b3f-01" -vv
*   Trying 10.12.3.52:8000...
* Connected to httpbin (10.12.3.52) port 8000 (#0)
> GET /anything?freeform= HTTP/1.1
> Host: httpbin:8000
> User-Agent: curl/7.80.0-DEV
> accept: application/json
> Traceparent: 00-7543d15e09e5d61801d4f74cde1269b8-604ef051d35c5b3f-01
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< server: envoy
< date: Wed, 10 Nov 2021 20:36:04 GMT
< content-type: application/json
< content-length: 1032
< access-control-allow-origin: *
< access-control-allow-credentials: true
< x-envoy-upstream-service-time: 5
<
{
  "args": {
    "freeform": ""
  },
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Grpc-Trace-Bin": "AAB1Q9FeCeXWGAHU90zeEmm4AaDHmGRtdM7wAgE",
    "Host": "httpbin:8000",
    "Traceparent": "00-7543d15e09e5d61801d4f74cde1269b8-a0c798646d74cef0-01",
    "User-Agent": "curl/7.80.0-DEV",
    "X-B3-Sampled": "1",
    "X-B3-Spanid": "a0c798646d74cef0",
    "X-B3-Traceid": "7543d15e09e5d61801d4f74cde1269b8",
    "X-Cloud-Trace-Context": "7543d15e09e5d61801d4f74cde1269b8/11585396123534413552;o=1",
    "X-Envoy-Attempt-Count": "1",
    "X-Forwarded-Client-Cert": "<REDACTED>"
  },
  "json": null,
  "method": "GET",
  "origin": "127.0.0.6",
  "url": "http://httpbin:8000/anything?freeform="
}

请注意,在返回的请求标头集中,存在完整的跟踪上下文标头集。

如需查看更多传播标头的示例,请参阅跟踪上下文传播

使用自定义 ID 从客户端创建跟踪记录

如要从具有自定义 ID 的客户端创建跟踪记录,请使用 curl 命令创建包含外部客户端的请求,并强制其显示跟踪记录。例如:

curl $URL --header "x-client-trace-id: 105445aa7843bc8bf206b12000100000"

如需详细了解 x-client-trace-id,请参阅 Envoy 文档

通过出站流量网关出站

我们建议您按照安装和升级网关中的说明安装注入的网关

Istio 容器网络接口

如何启用 Istio 容器网络接口 (CNI) 取决于安装 Anthos Service Mesh 的环境。

  1. 启用网络政策

  2. 选择与您的平台相匹配的叠加文件。

在 GKE 上启用 CNI

---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    cni:
      enabled: true
      namespace: kube-system
  values:
    cni:
      cniBinDir: /home/kubernetes/bin
      excludeNamespaces:
        - istio-system
        - kube-system

在本地启用 CNI

---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    cni:
      enabled: true
      namespace: kube-system
  values:
    cni:
      cniBinDir: /opt/cni/bin
      excludeNamespaces:
        - istio-system
        - kube-system
        - gke-system

为 Google Cloud 外部启用 Google Cloud 可观测性

默认情况下,在 Google Cloud 外部使用 Istio CA 安装 Anthos Service Mesh 会向 Prometheus 报告指标。使用此选项可改为向 Google Cloud Observability 或同时启用 Prometheus 和 Stackdriver 报告指标,这样您便可以使用 Anthos Service Mesh 信息中心。

仅 Stackdriver

---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  values:
    telemetry:
      enabled: true
      v2:
        enabled: true
        prometheus:
          enabled: false
        stackdriver:
          enabled: true

Stackdriver 和 Prometheus

---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  values:
    telemetry:
      enabled: true
      v2:
        enabled: true
        prometheus:
          enabled: true
        stackdriver:
          enabled: true

启用内部负载均衡器

我们建议您按照安装和升级网关中的说明安装注入的网关,以在 GKE 上设置内部负载均衡器。配置网关服务时,请添加注解:networking.gke.io/load-balancer-type: "Internal"

入站流量网关上的外部证书管理

如需了解如何使用 Envoy SDS 在入站流量网关上启用外部证书管理,请参阅安全网关