2026/9/11 14:20:14

Istio 中如何用 ServiceEntry 让 Pod 访问 GitHub 等外部服务

Istio 中如何用 ServiceEntry 让 Pod 访问 GitHub 等外部服务 Istio 中如何用 ServiceEntry 让 Pod 访问 GitHub 等外部服务【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istioIstio 服务网格中的 Pod 默认无法访问集群外的服务。原因是 Pod 通过 iptables 将所有出站流量透明地重定向到 sidecar 代理而 sidecar 默认只处理集群内目标intra-cluster destinations。如果未做出口配置Pod 访问外部地址时会出现 404、HTTPS 连接问题或 TCP 连接问题如果 ServiceEntry 配置不当还可能遇到服务器名称相关的问题。要解决这个问题需要为外部服务创建ServiceEntry资源把它注册为网格中的外部服务MESH_EXTERNALsidecar 才能放行到对应主机和端口的流量。本场景以访问 GitHub 为例目标是让网格内的 Pod 能成功执行git clone拉取 GitHub 上的仓库并可按同样方法扩展到其他外部服务。仓库中的samples/external/目录提供了现成的 ServiceEntry 示例和验证方式参见 samples/external/README.md。前提条件集群已安装 Istio且需要访问外部服务的 Pod 已被 sidecar 注入即“Istio-enabled pods”。如需在 Pod 内验证可使用仓库提供的 curl 测试 Pod一个只做 sleep 的 Alpine 容器可进入 shell 执行curl等命令通过 samples/curl/curl.yaml 创建kubectl apply -f curl.yaml验证时通过kubectl exec进入该 Pod 执行命令方式参考 samples/curl/README.mdexport CURL_POD$(kubectl get pod -l appcurl -o jsonpath{.items..metadata.name}) kubectl exec -it $CURL_POD -c curl -- 在Pod内执行的命令应用 GitHub 的 ServiceEntryGitHub 的出口配置由 samples/external/github.yaml 提供包含两个ServiceEntry分别覆盖 HTTPS 拉取和 SSH 拉取# HTTP and TLS, the host must be specified apiVersion: networking.istio.io/v1 kind: ServiceEntry metadata: name: github-https spec: hosts: - github.com ports: - number: 443 name: https protocol: HTTPS --- # For TCP services the IP ranges SHOULD be specified to avoid problems # if multiple SEs use the same port number. apiVersion: networking.istio.io/v1 kind: ServiceEntry metadata: name: github-tcp spec: hosts: - dummy.github.com # not used addresses: # from about-githubs-ip-addresses - 13.229.188.59/32 - 13.250.177.223/32 - 140.82.112.0/20 - 18.194.104.89/32 - 18.195.85.27/32 - 185.199.108.0/22 - 185.199.108.153/32 - 185.199.109.153/32 - 185.199.110.153/32 - 185.199.111.153/32 - 192.30.252.0/22 - 192.30.252.153/32 - 192.30.252.154/32 - 23.20.92.3/32 - 35.159.8.160/32 - 52.74.223.119/32 - 54.166.52.62/32 - 54.87.5.173/32 ports: - name: tcp number: 22 protocol: tcp location: MESH_EXTERNAL应用该文件kubectl create -f github.yaml两条规则的设计意图不同修改时需要注意github-httpsHTTP/TLS 类的 ServiceEntry 必须写明确认过的hosts这里是github.com的 443 端口支持 HTTPS 克隆。github-tcp纯 TCP 服务这里是 SSH 的 22 端口不能靠域名区分因此hosts填一个占位值dummy.github.com源文件注释标明“not used”并通过addresses给出 GitHub 的 IP 段。源文件注释指出如果多个 ServiceEntry 使用同一端口号应当SHOULD指定 IP 段以避免冲突。addresses列表来自 GitHub 官方的 IP 地址说明页如果 GitHub 变更了 IP 段需要自行更新该列表。验证访问是否生效文档给出的验证方式是在 Pod 内执行git clone。应用github.yaml后Istio-enabled pods 应能成功执行命令取自 samples/external/README.mdgit clone https://github.com/fortio/fortio.gitgithub.yaml 文件头注释中同样给出了示例目标git clone https://github.com/istio/api.git。若要使用 SSH 方式git clone gitgithub.com:istio/api.git源文件注明前提是本地已配置好身份识别identification和证书并且 22 端口流量由github-tcp这条 ServiceEntry 放行。可以在上一步创建的 curl Pod 中通过kubectl exec -it $CURL_POD -c curl --执行上述命令。注意文档并未说明该容器预装了 git容器内缺少 git 时应换一个装有 git 的网格内 Pod 验证。如果应用 ServiceEntry 后 Pod 仍然访问失败按 samples/external/README.md 的描述区分两类现象出现 404、HTTPS 连接问题或 TCP 连接问题通常是 Istio 尚未配置为允许 Pod 访问对应的外部服务如果是 ServiceEntry 本身配置错误如 hosts 写错Pod 可能出现服务器名称server names相关的问题。用同样的方式放行其他外部服务samples/external/目录下的另外两个示例展示了不同端口协议的配置模式可直接照抄修改主机名aptget.yaml为apt-get update/apt-get install放行 80 端口的 HTTP 流量hosts 列出deb.debian.org、archive.ubuntu.com等仓库域名。应用后 Pod 可成功执行apt-get update和apt-get install未放行时可能得到 “404 Not Found”。pypi.yaml为pip放行 443 端口的 HTTPS 流量。注意它声明了三个 ServiceEntrypypi.python.org、pypi.org、files.pythonhosted.org源文件注释说明pypi.python.org会 301 重定向到pypi.org且pip install还会从files.pythonhosted.org拉取文件——外部服务存在重定向或文件下载域名时必须把这些域名一并写入 hosts否则会在重定向后的请求上失败。README 同时给出两点边界说明让 Pod 动态更新软件包库不是最佳实践这些示例主要是为了交互式排障方便注重安全的集群应当只放行到云服务等必要依赖的流量。Istio 文档中的“默认允许访问所有外部服务”配置方式不允许 80 端口的 HTTP 和 22 端口的 SSH而这里的示例正是为了放行这两个端口提供的。限制ServiceEntry 的 hosts 与端口必须与外部服务实际使用的域名和端口一致重定向、CDN 文件域名都要单独覆盖参考pypi.yaml的三域名写法。纯 TCP 端口的 ServiceEntry 依赖 IP 段GitHub 的 IP 段以源文件中的列表为准网络变更时需人工更新。SSH 方式克隆 GitHub 依赖客户端自身的身份与证书配置ServiceEntry 只解决网络放行不负责认证。【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考