应用程序要求
作为 Istio 服务网格中的一部分,Kubernetes 集群中的 Pod 和 Service 必须满足以下要求:
应用 UID:确保您的 Pod 不会被 ID(UID)为 的用户运行应用,因为
1337
是为 Sidecar 代理保留的。NET_ADMIN
和NET_RAW
权限:如果您的集群了 Pod 安全策略,必须给 Pod 配置NET_ADMIN
和NET_RAW
权限。如果您使用 ,可以不配置。要检查您的 Pod 是否有
NET_ADMIN
和NET_RAW
权限,您需要检查这些 Pod 的服务账户是否有NET_ADMIN
和NET_RAW
权限的 Pod 安全策略。如果您没有在 Pod 部署中指定服务账户,Pod 会使用其命名空间中的默认服务账户运行。要列出服务账户的权限,请在下面的命令中用你的值替换
<your namespace>
和<your service account>
。例如,要检查
default
命名空间中的 服务账户,运行以下命令:$ for psp in $(kubectl get psp -o jsonpath="{range .items[*]}{@.metadata.name}{'\n'}{end}"); do if [ $(kubectl auth can-i use psp/$psp --as=system:serviceaccount:default:default) = yes ]; then kubectl get psp/$psp --no-headers -o=custom-columns=NAME:.metadata.name,CAPS:.spec.allowedCapabilities; fi; done
带有 app 和 version 标签(label)的 pod:我们建议显式地给 Deployment 加上
app
和version
标签。给使用 KubernetesDeployment
部署的 Pod 部署配置中增加这些标签,可以给 Istio 收集的指标和遥测信息中增加上下文信息。version
标签:这个标签用于在特定方式部署的应用中表示版本。
Istio sidecar 代理(Envoy)使用以下端口和协议。
为避免与 sidecar 发生端口冲突,应用程序不应使用 Envoy 使用的任何端口。
Istio 控制平面(istiod)使用以下端口和协议。
一些协议是 “服务器优先” 协议,这意味着服务器将发送第一个字节。这可能会对 mTLS 和自动协议选择产生影响。
为了支持这些情况,请按照步骤将应用程序的协议声明为 TCP
。
已知以下端口通常承载服务器优先协议,并自动假定为 :
因为 TLS 通信不是服务器优先的,所以 TLS 加密的服务器优先流量将与自动协议检测一起使用,只要您确保所有经过 TLS 嗅探的流量都已加密:
- 将服务器的
mTLS
模式设置为STRICT
。这将对所有请求强制执行 TLS 加密。 - 将服务器的
mTLS
模式设置为DISABLE
。这将禁用 TLS 嗅探,允许使用服务器优先协议。 - 配置所有客户端发送
TLS
流量,通常通过 DestinationRule 或依赖自动 mTLS。
为了支持 Istio 的流量路由功能,离开 Pod 的流量可能与未部署 sidecar 时的流量不同。
对于 HTTP 流量,流量根据 Host
标头进行路由。如果目标 IP 和 Host
标头未对齐,这可能会导致意外行为。例如,curl 1.2.3.4 -H "Host: httpbin.default"
请求将被路由到 httpbin
服务,而不是 1.2.3.4
。
对于非 HTTP 流量(包括 HTTPS),Istio 无法访问 Host
标头,因此路由决策基于服务 IP 地址。
这意味着直接调用 Pod(例如,curl <POD_IP>
),而不匹配 Service。虽然流量可以通过,但它不会获得完整的 Istio 功能,包括 mTLS 加密、流量路由和遥测。