原文:https://makeoptim.com/istio-faq/accessing-external-services
- 现象
- 原因
- 方法
- 方法一
- 方法二
- 允许访问外部 HTTP 服务
- 允许访问外部 HTTPS 服务
- 管理到外部服务的流量
- 方法三
- 直接访问外部服务
- 确定平台内部的 IP 范围
- 阿里云(AKS)
- IBM Cloud Private
- IBM Cloud Kubernetes Service
- Google Container Engine (GKE)
- Azure Container Service(ACS)
- Minikube, Docker For Desktop, Bare Metal
- 配置代理绕行
- 访问外部服务
- 确定平台内部的 IP 范围
- 直接访问外部服务
- 总结
- 参考
现象
集群内无法访问外部服务。
-
在集群中部署 sleep
kubectl apply -f samples/sleep/sleep.yaml
-
设置环境变量
export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})
-
访问外网服务
$ kubectl exec -it $SOURCE_POD -c sleep -- curl http://www.baidu.com $ kubectl exec -it $SOURCE_POD -c sleep -- curl -I https://www.baidu.com | grep "HTTP/" command terminated with exit code 35
进入 sleep 容器,执行 curl http://www.baidu.com
,无数据返回;执行 curl -I https://www.baidu.com
也访问失败。这种现象就是集群内无法访问外部服务。
原因
由于默认情况下,来自 Istio-enable Pod 的所有出站流量都会重定向到其 Sidecar 代理,群集外部 URL 的可访问性取决于代理的配置。默认情况下,Istio 将 Envoy 代理配置为允许传递未知服务的请求。但这不是 Istio 推荐的做法,因此,服务商或者其他安装配置可能会修改默认设置为不允许传递未知服务的请求。
当遇到集群内无法访问外部服务时,可运行以下命令检查 Sidecar 的代理配置,查看是否允许传递未知服务的请求。
$ kubectl get configmap istio -n istio-system -o yaml | grep -o "mode: ALLOW_ANY"
mode: ALLOW_ANY
mode: ALLOW_ANY
# 或者
$ kubectl get configmap istio -n istio-system -o yaml | grep -o "mode: REGISTRY_ONLY"
mode: REGISTRY_ONLY
mode: REGISTRY_ONLY
如果命令输出有 mode: ALLOW_ANY
表示 Istio 代理允许调用未知的服务; 如果命令输出有 mode: REGISTRY_ONLY
那么 Istio 代理会阻止任何没有在网格中定义的 HTTP 服务或 service entry 的主机。
方法
如果是因为 Istio 的配置项为 mode: REGISTRY_ONLY
而导致集群内无法访问外部服务。可有以下三种访问外部服务的方法:
- 方法一:修改配置为
mode: ALLOW_ANY
以允许 Sidecar 将请求传递到未在网格内配置过的服务。 - 方法二:配置 ServiceEntry 以提供对外部服务的受控访问。
- 方法三:对于特定范围的 IP,完全绕过 Envoy 代理。
方法一
运行以下命令,修改配置为 mode: ALLOW_ANY
$ kubectl get configmap istio -n istio-system -o yaml | sed 's/mode: REGISTRY_ONLY/mode: ALLOW_ANY/g' | kubectl replace -n istio-system -f -
configmap/istio replaced
验证配置
$ kubectl get configmap istio -n istio-system -o yaml | grep -o "mode: ALLOW_ANY"
mode: ALLOW_ANY
mode: ALLOW_ANY
重启部署
$ kubectl rollout restart deployment sleep
deployment.extensions/sleep restarted
访问外部服务
$ export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})
$ kubectl exec -it $SOURCE_POD -c sleep -- curl http://www.baidu.com
......
京ICP证030173号