容器外部网络无法访问服务的解决方法
现象描述
在Kubernetes环境中,容器外部网络(如集群外的客户端)无法访问容器内部运行的devkitai-server服务。
可能原因
- 服务绑定地址为空:DevKit AI的config.yaml配置文件中配置的server.host未正确配置,服务可能无法被外部网络访问。
- ClusterIP访问范围限制:若配置为Kubernetes集群的ClusterIP(如10.244.0.x),则该IP仅在集群内部网络路由,集群外部的客户端无法访问。
- 端口映射不一致:DevKit AI的config.yaml配置文件中配置的server.port与Kubernetes Service/NodePort映射的端口不一致,导致流量无法正确转发。
处理步骤
- 配置Kubernetes端口映射。
- 打开配置文件。
vi my-service.yaml
- 按“i”进入编辑模式,配置示例如下:
apiVersion: v1 kind: Service metadata: name: devkitai-service namespace: <namespace> spec: type: NodePort # 或 LoadBalancer,视访问需求选择 selector: app: devkitai ports: - port: <service端口> # 与config.yaml中server.port一致 targetPort: <容器端口> # 与config.yaml中server.port一致 nodePort: <节点端口> # 外部访问端口范围30000-32767 - 按“Esc”键退出编辑模式,输入:wq!,按“Enter”键保存并退出文件。
- 创建或更新Service服务。
kubectl apply -f my-service.yaml
- 请将使用示例中配置Kubernetes端口映射的“my-service.yaml”请替换为你的实际配置文件。
- 配置示例中ports.port与targetPort配置的端口务必与4中DevKit AI的config.yaml配置文件中配置的server.port保持一致。
- 打开配置文件。
- 进入DevKit AI基础包解压后目录。
cd DevKit-AI-x.x.x-Linux-Kunpeng
- 编辑“config/config.yaml”文件。
vi config/config.yaml
- 按“i”进入编辑模式,修改如下内容。
# 服务基础核心配置 server: # 支持协议:http / https 默认https;用户需填写host值;port值默认为8000 protocol: http host: 0.0.0.0 # 允许所有网络接口侦听,使外部网络可访问 port: xxxx # 与Service端口映射一致
(可选)若需配置为集群内部访问而非外部访问,可按照如下操作:
- 查看Pod信息或通过describe查看Pod IP。
kubectl get pods -n <namespace> -o wide
或
kubectl describe pod <pod-name> -n <namespace> | grep "IP:"
- 编辑DevKit AI工具目录“config/config.yaml”文件,按“i”进入编辑模式,修改如下内容。
# 服务基础核心配置 server: # 支持协议:http / https 默认https;用户需填写host值;port值默认为8000 protocol: http host: <pod-ip> # 仅限集群内部访问,外部客户端无法连接 port: xxxx # 与Service端口映射一致
请将“pod-ip”替换为4.a中获取到的Pod IP。
- server.host设置为“0.0.0.0”可使服务暴露于所有网络接口,若留空或配置为“127.0.0.1”,则仅本地进程可访问,外部网络请求无法到达。
- server.port参数请与Kubernetes Service/NodePort映射的端口保持一致,否则会导致流量无法正确转发。
- DevKit AI的config.yaml配置文件中的server.host配置为具体ClusterIP时,仅集群内部服务器可访问,外部客户端无法连接。此方式不适用于需要外部访问的场景。
- 查看Pod信息或通过describe查看Pod IP。
- 按“Esc”键退出编辑模式,输入:wq!,按“Enter”键保存并退出文件。
- 重新启动DevKit AI Server服务。
systemctl restart devkitai-server
- 验证服务可访问性。
- 从集群节点内部测试。
curl http://<pod-ip>:<port>/run
- 从集群外部测试。
curl http://<node-ip>:<nodePort>/run
使用示例验证服务可访问性时请将“pod-ip”、“port”、“node-ip”、“nodePort”替换为你的实际IP和端口值。
- 从集群节点内部测试。
父主题: FAQ