集群内非Istio服务网格应用访问网格内服务的解决方法
解决网格外Pod访问网格内服务的403权限问题
针对你的场景,有几种不用Istio Gateway就能让网格外的应用A访问网格内应用B的方案:
方案1:调整Istio RBAC策略,放行网格外请求
Istio的RBAC默认会拒绝没有携带Istio身份信息的请求(也就是网格外无Sidecar的Pod发起的请求)。你可以通过创建AuthorizationPolicy来允许指定来源的访问:
仅允许ns-outside-mesh命名空间的请求
创建如下YAML文件(替换成你的应用标签和端口):
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-outside-mesh-access namespace: ns-inside-mesh spec: selector: matchLabels: app: appB # 应用B的Pod标签 action: ALLOW rules: - from: - source: namespaces: ["ns-outside-mesh"] to: - operation: ports: ["80"] # 应用B的服务端口
执行命令应用:
kubectl apply -f <文件名>.yaml
允许所有网格外的集群内请求
如果要开放给所有网格外的Pod,可使用principals: ["unknown"](Istio用unknown标识未经过Sidecar处理的请求):
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-all-outside-mesh namespace: ns-inside-mesh spec: selector: matchLabels: app: appB action: ALLOW rules: - from: - source: principals: ["unknown"] to: - operation: ports: ["80"]
方案2:给应用A所在命名空间开启Sidecar注入(可选)
如果可以接受给应用A的Pod添加Istio Sidecar,直接给ns-outside-mesh命名空间打标签开启自动注入:
kubectl label namespace ns-outside-mesh istio-injection=enabled
之后重启应用A的Pod,Sidecar会自动注入。此时Istio会为请求添加身份信息,再配合允许ns-outside-mesh来源的RBAC策略即可正常访问。
方案3:让应用B的Service绕过Istio拦截(不推荐)
通过给应用B的Service添加注解,让Istio不对其流量进行处理,这样网格外请求可以直接访问Pod,绕过RBAC检查:
apiVersion: v1 kind: Service metadata: name: serviceB namespace: ns-inside-mesh annotations: istio.io/exclude-inbound-ports: "80" # 替换成服务端口,用"*"可排除所有端口 spec: selector: app: appB ports: - port: 80 targetPort: 8080
注意:这种方式会让应用B失去Istio提供的监控、熔断等所有功能,仅在特殊场景下使用。
内容的提问来源于stack exchange,提问作者Iwan Satria
相关产品推荐
相关产品推荐

