Ambient Mesh 入门
Ambient 目前处于 Alpha 状态。
请勿在生产环境中使用 Ambient 模式, 务必先行斟酌特性阶段定义再行使用 Ambient。 具体而言,alpha
版本意味着存在已知的性能、稳定性和安全性问题, 还存在一些计划中的破坏性变更,其中某些变更可能会令升级失败。 这些是进阶至 beta
之前需要解决的问题。
本指南有助于您快速评估 Istio ambient service mesh。 以下操作步骤需要您有一个 cluster 运行了 Istio 支持的 Kubernetes 版本 (1.25, 1.26, 1.27, 1.28)。 您可以使用 Minikube 或特定平台搭建指南中指定的所有受支持的平台。
参照以下步骤开始使用 Ambient:
下载和安装
下载对 Ambient Mesh 提供
alpha
支持的最新 Istio 版本。如果您没有 Kubernetes 集群,可以参照以下命令使用
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 CRD:
$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
{ kubectl kustomize "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v1.0.0" | kubectl apply -f -; }
Istio 包括了对 Kubernetes Gateway API 的 Beta 支持, 打算未来使其成为流量管理的默认 API。 以下说明指导您在网格中配置流量管理时如何选择使用 Gateway API 或 Istio 配置 API。 请按照您的首选项遵循
Gateway API
或Istio APIs
页签中的指示说明。ambient
配置文件设计用于帮助您开始使用 Ambient Mesh。 使用刚下载的istioctl
命令,在您的 Kubernetes 集群上安装附带ambient
配置文件的 Istio:
请注意,如果您正在使用 Minikube (或在节点上为容器配置了非标准 netns
路径的任何其他平台), 您可能需要在 istioctl install
命令后面追加 --set values.cni.cniNetnsDir="/var/run/docker/netns"
, 以便 Istio CNI DaemonSet 能够正确管理和捕获节点上的 Pod。
有关详细信息,请参阅您的平台文档。
$ 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 Mesh, 最后将这些应用接入到网格,无需重启,也无需重新配置这些应用。
确保 default 命名空间未包括标签 istio-injection=enabled
, 因为使用 Ambient 时,您不会想要 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 Mesh 的一部分,在给定的命名空间启用所有 Pod:
$ kubectl label namespace default istio.io/dataplane-mode=ambient
恭喜!您已成功将 default 命名空间中的所有 Pod 添加到 Ambient Mesh。 体验最佳的地方在于无需重启,也无需重新部署任何组件!
发送一些测试流量:
$ 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 Mesh 之后,可以使用 L4 鉴权策略确保应用访问的安全。 这允许您基于客户端负载身份来控制到服务的访问或源于服务的访问, 但类似 GET
和 POST
的这些 HTTP 方法并不在 L7 级别。
L4 鉴权策略
显式允许 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
L7 鉴权策略
使用 Kubernetes Gateway API,您可以为使用 bookinfo-productpage
服务账号的 productpage
服务来部署 waypoint proxy。 转到 productpage
服务的所有流量都将通过 L7 代理被协调、执行和观测。
为 productpage
服务部署 waypoint proxy:
$ istioctl x waypoint apply --service-account bookinfo-productpage
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:
selector:
matchLabels:
istio.io/gateway-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
服务账号为评审服务部署一个 waypoint proxy, 因此转到评审服务的所有流量都将通过 waypoint proxy 进行协调。
$ istioctl x waypoint apply --service-account bookinfo-reviews
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"
卸载
若要移除 productpage-viewer
鉴权策略、waypoint proxy 并卸载 Istio:
$ kubectl delete authorizationpolicy productpage-viewer
$ istioctl x waypoint delete --service-account bookinfo-reviews
$ istioctl x waypoint delete --service-account bookinfo-productpage
$ istioctl uninstall -y --purge
$ kubectl delete namespace istio-system
指示 Istio 自动在 default
命名空间中包括应用程序的标签默认不会被移除。 如果不再需要此标签,请使用以下命令来移除:
$ 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=v1.0.0" | kubectl delete -f -