Ambient 模式入门
Ambient 模式目前处于 Alpha 阶段。
请勿在生产环境中使用 Ambient 模式, 务必先行斟酌特性阶段定义再行使用 Ambient。
特别是,在 Alpha 版本中存在已知的性能、稳定性和安全问题。 还有计划中的重大变更,包括一些会阻止升级的变更。
这些限制将在 Ambient 模式转入 Beta 版之前得到解决。
本指南有助于您快速评估 Istio 的 Ambient 模式。 这些步骤要求您有一个运行受支持版本的 Kubernetes (1.26, 1.27, 1.28, 1.29) Cluster。 您可以在任何被支持的 Kubernetes 平台上安装 Istio Ambient 模式,但 为了简单起见,本指南将假设使用 kind。
请注意,Ambient 模式当前需要使用 istio-cni 来配置 Kubernetes 节点,该节点必须作为特权 Pod 运行。 Ambient 模式与之前支持 Sidecar 模式的所有主流 CNI 兼容。
请按照以下步骤开始使用 Istio 的 Ambient 模式:
下载和安装
安装 kind
下载对 Ambient 模式提供 Alpha 支持的最新 Istio 版本(v1.21.0 或更高)。
部署一个新的本地
kind
集群:$ kind create cluster --config=- <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: ambient
nodes:
- role: control-plane
- role: worker
- role: worker
EOF
安装大多数 Kubernetes 集群上默认并未安装的 Kubernetes Gateway API CRD:
$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
{ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=444631bfe06f3bcca5d0eadf1857eac1d369421d" | kubectl apply -f -; }
Istio 包括了对 Kubernetes Gateway API 的 Beta 支持, 打算未来使其成为流量管理的默认 API。 以下说明指导您在网格中配置流量管理时如何选择使用 Gateway API 或 Istio 配置 API。 请按照您的首选项遵循
Gateway API
或Istio APIs
页签中的指示说明。使用上面下载的
istioctl
版本, 在 Kubernetes 集群上安装带有ambient
配置文件的 Istio:
$ istioctl install --set profile=ambient --set "components.ingressGateways[0].enabled=true" --set "components.ingressGateways[0].name=istio-ingressgateway" --skip-confirmation
运行上一条命令后,您将看到以下输出, 表明(包括 ztunnel 在内的)五个组件已被成功安装!
✔ Istio core installed
✔ Istiod installed
✔ CNI installed
✔ Ingress gateways installed
✔ Ztunnel installed
✔ Installation complete
$ istioctl install --set profile=ambient --skip-confirmation
运行上一条命令后,您将看到以下输出, 表明(包括 ztunnel 在内的)五个组件已被成功安装!
✔ Istio core installed
✔ Istiod installed
✔ CNI installed
✔ Ztunnel installed
✔ Installation complete
- 使用以下命令确认已安装的组件:
$ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-cni-node-n9tcd 1/1 Running 0 57s
istio-ingressgateway-5b79b5bb88-897lp 1/1 Running 0 57s
istiod-69d4d646cd-26cth 1/1 Running 0 67s
ztunnel-lr7lz 1/1 Running 0 69s
$ kubectl get daemonset -n istio-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
istio-cni-node 1 1 1 1 1 kubernetes.io/os=linux 70s
ztunnel 1 1 1 1 1 kubernetes.io/os=linux 82s
$ kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
istio-cni-node-n9tcd 1/1 Running 0 57s
istiod-69d4d646cd-26cth 1/1 Running 0 67s
ztunnel-lr7lz 1/1 Running 0 69s
$ kubectl get daemonset -n istio-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
istio-cni-node 1 1 1 1 1 kubernetes.io/os=linux 70s
ztunnel 1 1 1 1 1 kubernetes.io/os=linux 82s
部署样例应用
您将使用样例 bookinfo 应用,这是刚下载的 Istio 发行版默认包含的应用。 在 Ambient 模式中,您将这些应用部署到 Kubernetes 集群的方式与没有 Istio 时的部署方式完全相同。 这意味着您可以先让这些应用在集群中运行,再启用 Ambient 模式, 最后将这些应用接入到网格,无需重启,也无需重新配置这些应用。
使用 Ambient 模式时,请确保 default 命名空间不包含标签 istio-injection=enabled
,因为您不需要 Istio 将 Sidecar 注入应用程序 Pod。
启动样例服务:
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo.yaml@
$ kubectl apply -f @samples/sleep/sleep.yaml@
$ kubectl apply -f @samples/sleep/notsleep.yaml@
sleep
和notsleep
是可以用作 curl 客户端的两个简单应用。部署一个 Ingress Gateway,这样您可以从集群外访问 bookinfo 应用:
要在
kind
中获取服务类型为Loadbalancer
的 IP 地址, 您可能需要安装 MetalLB 这类工具。更多细节请参阅此指南。
创建 Istio Gateway 和 VirtualService, 这样您可以通过 Istio Ingress Gateway 访问 bookinfo 应用。
$ kubectl apply -f @samples/bookinfo/networking/bookinfo-gateway.yaml@
为 Istio Ingress Gateway 设置环境变量:
$ export GATEWAY_HOST=istio-ingressgateway.istio-system
$ export GATEWAY_SERVICE_ACCOUNT=ns/istio-system/sa/istio-ingressgateway-service-account
创建 Kubernetes Gateway 和 HTTPRoute, 这样您可以从集群外访问 bookinfo 应用:
$ sed -e 's/from: Same/from: All/'\
-e '/^ name: bookinfo-gateway/a\
namespace: istio-system\
' -e '/^ - name: bookinfo-gateway/a\
namespace: istio-system\
' @samples/bookinfo/gateway-api/bookinfo-gateway.yaml@ | kubectl apply -f -
为 Kubernetes Gateway 设置环境变量:
$ kubectl wait --for=condition=programmed gtw/bookinfo-gateway -n istio-system
$ export GATEWAY_HOST=bookinfo-gateway-istio.istio-system
$ export GATEWAY_SERVICE_ACCOUNT=ns/istio-system/sa/bookinfo-gateway-istio
测试您的 bookinfo 应用。无论是否有网关都应该能够正常工作。
$ kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
$ kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
$ kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
添加应用到 Ambient 网格
您只需给命名空间打标签,就可以作为 Ambient 网格的一部分,在给定的命名空间启用所有 Pod:
$ kubectl label namespace default istio.io/dataplane-mode=ambient
恭喜!您已成功将 default 命名空间中的所有 Pod 添加到网格中。 请注意,您不必重新启动或重新部署任何内容!
现在,发送一些测试流量:
$ kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
$ kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
$ kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
您将在 Ambient Mesh 的应用之间立即达成 mTLS 通信和 L4 遥测。 如果按照指示说明安装 Prometheus 和 Kiali, 您将能够在 Kiali 的应用中直观地查看自己的应用:
Kiali 仪表盘
确保应用访问安全
将您的应用添加到 Ambient 模式网格之后,可以使用 Layer 4 鉴权策略确保应用访问的安全。 该功能允许您基于客户端负载身份来控制到服务的访问或源于服务的访问, 但类似 GET
和 POST
的这些 HTTP 方法并不在 Layer 7 级别。
Layer 4 鉴权策略
显式允许 sleep
服务账号和 istio-ingressgateway
服务账号调用 productpage
服务:
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: productpage-viewer
namespace: default
spec:
selector:
matchLabels:
app: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/sleep
- cluster.local/$GATEWAY_SERVICE_ACCOUNT
EOF
确认上述鉴权策略正在工作:
$ # 这条命令应成功
$ kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
$ # 这条命令应成功
$ kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
$ # 这条命令应失败且返回连接重置错误码 56
$ kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
command terminated with exit code 56
Layer 7 鉴权策略
使用 Kubernetes Gateway API,您可以为使用 bookinfo-productpage
服务账号的 productpage
服务来部署 waypoint proxy。 转到 productpage
服务的所有流量都将通过 L7 代理被协调、执行和观测。
为 productpage
服务部署 waypoint proxy:
$ istioctl x waypoint apply --service-account bookinfo-productpage --wait
waypoint default/bookinfo-productpage applied
查看 productpage
waypoint proxy 状态;您应看到处于 Programmed
状态的网关资源详情:
$ kubectl get gtw bookinfo-productpage -o yaml
...
status:
conditions:
- lastTransitionTime: "2023-02-24T03:22:43Z"
message: Resource programmed, assigned to service(s) bookinfo-productpage-istio-waypoint.default.svc.cluster.local:15008
observedGeneration: 1
reason: Programmed
status: "True"
type: Programmed
更新您的 AuthorizationPolicy
以显式允许 sleep
和 Gateway 服务账号以 GET
productpage
服务,但不执行其他操作:
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: productpage-viewer
namespace: default
spec:
targetRef:
kind: Gateway
group: gateway.networking.k8s.io
name: bookinfo-productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/sleep
- cluster.local/$GATEWAY_SERVICE_ACCOUNT
to:
- operation:
methods: ["GET"]
EOF
$ # 这条命令应失败且返回 RBAC 错误,这是因为它不是 GET 操作
$ kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" -X DELETE
RBAC: access denied
$ # 这条命令应失败且返回 RBAC 错误,这是因为此身份不被允许
$ kubectl exec deploy/notsleep -- curl -s http://productpage:9080/
RBAC: access denied
$ # 这条命令应继续工作
$ kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
控制流量
使用 bookinfo-review
服务账号为 ‘review’ 服务部署一个 waypoint proxy, 因此转到 ‘review’ 服务的所有流量都将通过 waypoint proxy 进行协调。
$ istioctl x waypoint apply --service-account bookinfo-reviews --wait
waypoint default/bookinfo-reviews applied
控制 90% 请求流量到 reviews
v1,控制 10% 流量到 reviews
v2:
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-90-10.yaml@
$ kubectl apply -f @samples/bookinfo/networking/destination-rule-reviews.yaml@
$ kubectl apply -f @samples/bookinfo/platform/kube/bookinfo-versions.yaml@
$ kubectl apply -f @samples/bookinfo/gateway-api/route-reviews-90-10.yaml@
确认 100 个请求中大约有 10% 流量转到 reviews-v2:
$ kubectl exec deploy/sleep -- sh -c "for i in \$(seq 1 100); do curl -s http://$GATEWAY_HOST/productpage | grep reviews-v.-; done"
卸载
要删除 waypoint 代理、已安装的策略并卸载 Istio:
$ istioctl x waypoint delete --all
$ istioctl uninstall -y --purge
$ kubectl delete namespace istio-system
指示 Istio 自动在 default
命名空间中包括应用程序的标签在 Ambient 网格中默认不会被移除。 如果不再需要此标签,请使用以下命令来移除:
$ kubectl label namespace default istio.io/dataplane-mode-
若要删除 Bookinfo 样例应用及其配置,请参阅 Bookinfo 清理。
移除 sleep
和 notsleep
应用:
$ kubectl delete -f @samples/sleep/sleep.yaml@
$ kubectl delete -f @samples/sleep/notsleep.yaml@
如果您安装了 Gateway API CRD,执行以下命令移除:
$ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=444631bfe06f3bcca5d0eadf1857eac1d369421d" | kubectl delete -f -