apiVersion: v1 kind: ServiceAccount metadata:name: web-frontend --- apiVersion: apps/v1 kind: Deployment metadata:name: web-frontendlabels:app: web-frontend spec:replicas: 1selector:matchLabels:app: web-frontendtemplate:metadata:labels:app: web-frontendversion: v1spec:serviceAccountName: web-frontendcontainers:- image: gcr.io/tetratelabs/web-frontend:1.0.0imagePullPolicy: Alwaysname: webports:- containerPort: 8080env:- name: CUSTOMER_SERVICE_URLvalue: 'http://customers.default.svc.cluster.local' --- kind: Service apiVersion: v1 metadata:name: web-frontendlabels:app: web-frontend spec:selector:app: web-frontendports:- port: 80name: httptargetPort: 8080 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:name: web-frontend spec:hosts:- '*'gateways:- gatewayhttp:- route:- destination:host: web-frontend.default.svc.cluster.localport:number: 80
将上述 YAML 保存为 web-frontend.yaml
,并使用 kubectl apply -f web-frontend.yaml
创建资源 。
最后,我们将部署 customers v1 服务 。
apiVersion: v1 kind: ServiceAccount metadata:name: customers-v1 --- apiVersion: apps/v1 kind: Deployment metadata:name: customers-v1labels:app: customersversion: v1 spec:replicas: 1selector:matchLabels:app: customersversion: v1template:metadata:labels:app: customersversion: v1spec:serviceAccountName: customers-v1containers:- image: gcr.io/tetratelabs/customers:1.0.0imagePullPolicy: Alwaysname: svcports:- containerPort: 3000 --- kind: Service apiVersion: v1 metadata:name: customerslabels:app: customers spec:selector:app: customersports:- port: 80name: httptargetPort: 3000 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata:name: customers spec:hosts:- 'customers.default.svc.cluster.local'http:- route:- destination:host: customers.default.svc.cluster.localport:number: 80
将上述内容保存为 customers-v1.yaml
,并使用 kubectl apply -f customers-v1.yaml
创建部署和服务 。如果我们打开 GATEWAY_URL
,应该会显示带有 customers v1 服务数据的 web 前端页面 。
让我们先创建一个授权策略 , 拒绝 default
命名空间的所有请求 。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata:name: deny-allnamespace: default spec:{}
将上述内容保存为 deny-all.yaml
,并使用 kubectl apply -f deny-all.yaml
创建该策略 。
如果我们尝试访问 GATEWAY_URL
, 我们将得到以下响应 。
RBAC: access denied
同样,如果我们试图在集群内运行一个 Pod,并从 default
命名空间内向 Web 前端或 customers 服务提出请求 , 我们会得到同样的错误 。
让我们试试吧 。
$ kubectl run curl --image=radial/busyboxplus:curl -i --tty If you don't see a command prompt, try pressing enter. [ root@curl:/ ]$ curl customers RBAC: access denied [ root@curl:/ ]$ curl web-frontend RBAC: access denied [ root@curl:/ ]$
在这两种情况下,我们都得到了拒绝访问的错误 。
我们要做的第一件事是使用 ALLOW
动作,允许从入口网关向 web-frontend
应用程序发送请求 。在规则中,我们指定了入口网关运行的源命名空间(istio-system
)和入口网关的服务账户名称 。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata:name: allow-ingress-frontendnamespace: default spec:selector:matchLabels:app: web-frontendaction: ALLOWrules:- from:- source:namespaces: ["istio-system"]- source:principals: ["cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"]
将上述内容保存为 allow-ingress-frontend.yaml
, 并使用 kubectl apply -f allow-ingress-frontend.yaml
创建策略 。
如果我们尝试从我们的主机向GATEWAY_URL
发出请求,这次我们会得到一个不同的错误 。
$ curl http://$GATEWAY_URL "Request failed with status code 403"
请注意,策略需要几秒钟才能分发到所有代理,所以你可能仍然会看到这个错误来自 customers 服务——记得我们允许调用 Web 前端 。然而 ,RBAC:access denied
的消息,时间为几秒钟 。
web-frontend
仍然不能调用 customers 服务 。如果我们回到我们在集群内运行的 curl Pod,尝试请求
http://web-frontend
,我们会得到一个 RBAC 错误 。DENY
策略是有效的,我们只允许从入口网关进行调用 。当我们部署 Web 前端时,我们也为 Pod 创建了一个服务账户(否则 , 命名空间中的所有 Pod 都被分配了默认的服务账户) 。现在我们可以使用该服务账户来指定 customers 服务调用的来源 。
推荐阅读
- 五 Istio:使用服务网格Istio进行流量路由
- 二 Istio:在Kubernetes(k8s)集群上安装部署istio1.14
- 魅族18和一加9对比_魅族18和一加9参数对比
- ipad分屏怎么打开(ipad第九代可以分屏吗)
- 九都金柜保险柜怎么开(全能保险柜怎么开)
- 少女前线纵向应变第九交响曲怎么通关
- 九重试炼免广告卷怎么获取
- 九重试炼免广告卷获取方式是什么
- 九宫格数独怎么玩(9宫格万能口诀)
- 中国钱币网|中国钱币收藏网