如何从云外浏览器访问Kubernetes Pod内部署的index.html文件?
整体分为3个核心流程:打包包含静态HTML的镜像、部署Pod到集群、配置公网可访问的暴露规则,具体操作如下:
步骤1:构建包含index.html的容器镜像
在index.html所在的本地目录创建Dockerfile:
# 采用轻量的官方nginx镜像作为基础运行环境 FROM nginx:alpine # 将本地index.html复制到nginx默认静态资源目录 COPY index.html /usr/share/nginx/html/
执行镜像构建、推送到集群可访问的镜像仓库(示例镜像仓库地址为registry.example.com,可替换为你自己的私有/共有镜像仓库地址):
# 构建镜像 docker build -t registry.example.com/static-html:v1 . # 推送镜像 docker push registry.example.com/static-html:v1
测试场景下也可以将镜像手动导入所有K8s节点,生产环境必须使用集群可统一拉取的镜像仓库
步骤2:部署Deployment运行Pod
创建deployment.yaml配置文件:
apiVersion: apps/v1 kind: Deployment metadata: name: static-html-deploy spec: replicas: 2 selector: matchLabels: app: static-html template: metadata: labels: app: static-html spec: containers: - name: nginx image: registry.example.com/static-html:v1 ports: - containerPort: 80
执行部署命令:
kubectl apply -f deployment.yaml
执行kubectl get pods确认Pod状态为Running,代表部署成功。
步骤3:配置公网访问规则
根据你的集群环境和需求,选择以下任意一种暴露方案即可:
方案1:LoadBalancer类型Service(公有云K8s集群首选)
公有云厂商的托管K8s服务默认支持LoadBalancer类型Service,会自动分配公网IP。
创建service-lb.yaml:
apiVersion: v1 kind: Service metadata: name: static-html-svc spec: type: LoadBalancer selector: app: static-html ports: - port: 80 targetPort: 80
执行创建命令:
kubectl apply -f service-lb.yaml
等待3-5分钟后执行kubectl get svc static-html-svc,查看EXTERNAL-IP字段对应的公网IP,在浏览器直接访问该IP即可打开index.html。
方案2:NodePort类型Service(测试/无LoadBalancer场景使用)
NodePort会在所有K8s节点上开放一个固定端口用于外部访问,端口范围固定为30000-32767。
创建service-nodeport.yaml:
apiVersion: v1 kind: Service metadata: name: static-html-svc spec: type: NodePort selector: app: static-html ports: - port: 80 targetPort: 80 nodePort: 30080 # 可选,不填会自动分配30000-32767范围内的端口
执行创建命令:
kubectl apply -f service-nodeport.yaml
确保K8s节点的公网安全组/防火墙放通30080端口的入方向规则,在浏览器访问http://任意K8s节点公网IP:30080即可。
方案3:Ingress(多服务共享公网入口/需要域名访问场景使用)
如果集群已经部署了Ingress Controller(如nginx-ingress),可以用Ingress实现域名访问。
首先创建ClusterIP类型的Service:
apiVersion: v1 kind: Service metadata: name: static-html-svc spec: selector: app: static-html ports: - port: 80 targetPort: 80
创建ingress.yaml:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: static-html-ingress spec: ingressClassName: nginx rules: - host: www.yourdomain.com # 替换为你自己的域名,需要解析到Ingress Controller的公网IP http: paths: - path: / pathType: Prefix backend: service: name: static-html-svc port: number: 80
执行创建命令:
kubectl apply -f ingress.yaml
域名解析生效后,直接访问域名即可打开页面。
常见问题排查
- 访问超时:检查对应端口的安全组/防火墙是否放通,LoadBalancer类型需要放通80端口,NodePort类型需要放通对应的NodePort端口
- 404错误:执行
kubectl exec <Pod名称> -- cat /usr/share/nginx/html/index.html确认index.html文件是否正确打包到镜像中 - 服务不通:执行
kubectl describe svc static-html-svc检查Endpoints字段是否有对应的Pod IP,确认Service的Selector和Pod的Label匹配
内容的提问来源于stack exchange,提问作者bosari

