当前位置: 首页 > news >正文

K8S中关于容器对外提供服务网络类型

在 Kubernetes 和容器化环境中,容器、Pod、Service 的外部访问方式各有特点,核心是通过不同的网络配置实现外部流量与内部服务的连接。以下从概念、网络类型、配置示例三个维度详细说明:

一、容器(Docker 容器)的外部访问

容器是独立运行的应用单元,默认情况下网络隔离,外部无法直接访问。其外部访问的核心是端口映射:将容器内的端口映射到宿主机的端口,外部通过「宿主机 IP + 映射端口」访问容器。

网络类型:
  • 桥接网络(bridge,默认):容器连接到 Docker 虚拟网桥,通过端口映射与宿主机通信。
  • host 网络:容器直接使用宿主机的网络命名空间,无需端口映射,容器端口直接绑定宿主机端口。
配置示例:
  1. 桥接网络 + 端口映射(最常用)
    运行一个 Nginx 容器,将容器内的 80 端口映射到宿主机的 8080 端口:

    docker run -d --name nginx-demo -p 8080:80 nginx
    
    • 访问方式:http://宿主机IP:8080(外部设备通过宿主机 IP 和 8080 端口访问容器内的 Nginx)。
    • 原理:-p 宿主机端口:容器端口 建立端口映射,外部流量通过宿主机 8080 端口转发到容器 80 端口。
  2. host 网络
    直接使用宿主机网络,容器内 80 端口直接对应宿主机 80 端口:

    docker run -d --name nginx-host --network host nginx
    
    • 访问方式:http://宿主机IP:80(无需端口映射,容器与宿主机共享网络)。
    • 注意:端口冲突风险高(宿主机和容器不能同时使用同一端口)。

二、Pod(Kubernetes 最小部署单元)的外部访问

Pod 是 Kubernetes 中最小的部署单元,包含一个或多个容器,拥有独立的集群内 IP(仅集群内部可见)。外部访问 Pod 需通过特殊配置打破网络隔离。

网络类型:
  • hostNetwork:Pod 直接使用宿主机的网络命名空间(类似 Docker 的 host 网络)。
  • hostPort:将 Pod 内容器的端口绑定到宿主机的指定端口(类似 Docker 的 -p 映射)。
配置示例:
  1. hostNetwork 配置
    Pod 使用宿主机网络,直接暴露端口到宿主机:

    # pod-hostnetwork.yaml
    apiVersion: v1
    kind: Pod
    metadata:name: nginx-pod-host
    spec:hostNetwork: true  # 使用宿主机网络containers:- name: nginximage: nginxports:- containerPort: 80  # 容器内端口(直接对应宿主机80端口)
    
    • 部署:kubectl apply -f pod-hostnetwork.yaml
    • 访问方式:http://宿主机IP:80(Pod 与宿主机共享网络,直接通过宿主机 IP+80 端口访问)。
    • 缺点:Pod 调度受限制(同一节点不能有相同端口的 Pod),端口冲突风险高。
  2. hostPort 配置
    将容器端口映射到宿主机指定端口(类似 Docker 端口映射):

    # pod-hostport.yaml
    apiVersion: v1
    kind: Pod
    metadata:name: nginx-pod-port
    spec:containers:- name: nginximage: nginxports:- containerPort: 80    # 容器内端口hostPort: 8080       # 映射到宿主机的端口
    
    • 部署:kubectl apply -f pod-hostport.yaml
    • 访问方式:http://宿主机IP:8080(外部通过宿主机 8080 端口访问 Pod 内的 Nginx)。
    • 缺点:同一节点不能有两个 Pod 映射到相同的 hostPort,限制调度灵活性。

三、Service(Kubernetes 服务抽象)的外部访问

Service 是 Kubernetes 中用于稳定暴露 Pod 的抽象层,通过标签选择器关联 Pod,提供固定访问点。其核心作用是:即使 Pod 重建(IP 变化),Service 地址保持不变。

Service 的外部访问方式主要通过Service 类型Ingress实现,常见类型如下:

1. NodePort 类型

在每个节点上开放一个静态端口(默认范围 30000-32767),外部通过「节点 IP + NodePort 端口」访问 Service,再由 Service 转发到 Pod。

配置示例

# service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-service-nodeport
spec:selector:app: nginx  # 关联标签为 app=nginx 的 Podports:- port: 80        # Service 集群内访问端口targetPort: 80  # 转发到 Pod 的端口nodePort: 30080 # 节点开放的端口(可选,默认自动分配)type: NodePort    # 类型为 NodePort

关联的 Pod 配置

# pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-podlabels:app: nginx  # 与 Service 的 selector 匹配
spec:containers:- name: nginximage: nginxports:- containerPort: 80
  • 部署:kubectl apply -f pod-nginx.yaml -f service-nodeport.yaml
  • 访问方式:http://任意节点IP:30080(外部通过节点 IP 和 30080 端口访问,Service 会转发到 Pod 的 80 端口)。
  • 适用场景:开发/测试环境,需要简单暴露服务到集群外。
2. LoadBalancer 类型

依赖云服务商(如 AWS、GCP、阿里云)的负载均衡器,自动分配一个公网 IP,外部通过该 IP 访问 Service,负载均衡器会转发流量到节点的 NodePort。

配置示例

# service-loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-service-lb
spec:selector:app: nginxports:- port: 80targetPort: 80type: LoadBalancer  # 类型为 LoadBalancer
  • 部署后,云服务商会自动创建负载均衡器,并分配公网 IP:
    kubectl get svc nginx-service-lb
    # 输出示例:
    # NAME               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
    # nginx-service-lb   LoadBalancer   10.96.xxx.xxx  123.45.67.89    80:30123/TCP   5m
    
  • 访问方式:http://123.45.67.89:80(直接通过负载均衡器的公网 IP 访问)。
  • 适用场景:生产环境,需要高可用的公网访问(依赖云服务)。
3. ExternalName 类型

通过 DNS 别名将 Service 映射到集群外部的域名(如 example.com),无需关联 Pod,用于访问集群外服务。

配置示例

# service-externalname.yaml
apiVersion: v1
kind: Service
metadata:name: external-service
spec:type: ExternalNameexternalName: example.com  # 映射到外部域名
  • 访问方式:在集群内,通过 external-service.default.svc.cluster.local(Service 的 DNS 名)访问,会自动解析为 example.com
  • 适用场景:需要在集群内统一访问外部服务(如第三方 API)。
4. Ingress(补充:七层路由管理)

Ingress 不是 Service 类型,而是独立的资源,用于管理外部 HTTP/HTTPS 流量到 Service 的路由(七层负载均衡)。需配合 Ingress Controller(如 Nginx Ingress)使用。

配置示例

# ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-ingress
spec:ingressClassName: nginx  # 使用 Nginx Ingress Controllerrules:- host: example.com      # 外部访问域名http:paths:- path: /nginx       # 路径匹配pathType: Prefixbackend:service:name: nginx-service-nodeport  # 转发到的 Service 名port:number: 80                  # Service 的端口
  • 前提:已部署 Nginx Ingress Controller(会暴露一个公网 IP 或 NodePort)。
  • 访问方式:http://example.com/nginx(需将 example.com 解析到 Ingress Controller 的 IP),流量会转发到关联的 Service 和 Pod。
  • 适用场景:生产环境,需要基于域名、路径的精细化路由(如一个 IP 对应多个服务)。

总结

组件外部访问方式核心配置访问方式适用场景
容器端口映射/host网络Docker -p--network host宿主机IP+端口单容器测试
PodhostNetwork/hostPortPod spec 中配置对应字段宿主机IP+端口特殊场景(如网络性能敏感)
ServiceNodePorttype: NodePort + nodePort节点IP+NodePort开发/测试环境
ServiceLoadBalancertype: LoadBalancer云负载均衡器IP云环境生产服务
ServiceExternalNametype: ExternalName + externalName集群内通过Service DNS访问访问集群外服务
IngressHTTP/HTTPS 路由规则匹配域名/路径到Service域名+路径(需解析到Ingress IP)生产环境多服务路由管理

通过以上配置,可以根据实际场景(环境、需求、资源)选择合适的外部访问方式。

http://www.dtcms.com/a/419852.html

相关文章:

  • 建设网站需要虚拟空间嘛专业网站制作公司采用哪些技术制作网站?
  • 超声波水表:原理、实现与核心技术解析
  • 怎样 建设电子商务网站直播网站app开发
  • Nginx 核心功能配置:访问控制、用户认证、HTTPS 与 URL 重写等
  • 大模型显存占用完全指南:从训练到推理的计算公式与实战案例(建议收藏)
  • 惠州做网站采招网招标官网
  • 烟台做网站找哪家好哪个网站可以做海报
  • 【星海出品】计算机科学之磁盘数据读取时间逻辑
  • 模力通AI风格仿写 让公文写作告别“风格焦虑”
  • 构建AI智能体:四十七、Agent2Agent多智能体系统:基础通信与任务协作实现
  • 天猫建设网站的意义张家港网站建设做网站
  • python爬虫进阶版练习(只说重点,selenium)
  • 东莞网站设计教程为企业做好服务保障
  • 福州网站建设q.479185700強网页翻译网站
  • 134、【OS】【Nuttx】【周边】效果呈现方案解析:端口映射(三)
  • 网站开发 报价单网站源码asp
  • Java HHH000490: Using JtaPlatform implementation
  • 网站关键词检测郑州外贸网站推广
  • 苏州网站开发的企业wordpress 结合qq
  • 在Linux中安装应用
  • 【高级语言范型介绍】
  • android 权限申请封装类
  • 个人习惯的各类chat大模型的使用场景
  • 济南网站建设与优化网站建设验收报告范本
  • 汕头网页设计网站方案网络下载的网站模板能直接上传到虚拟主机
  • C++ 异步任务详解:future, promise, async
  • 【MySQL 高阶】MySQL 程序详解
  • Cloudreve 性能卡顿?对接雨云对象存储,实现上传下载“满速飞”
  • 解锁机器人导航的全模态潜能!OmniVLA:机器人导航的全模态视觉-语言-动作模型
  • 制作一个买股票的网站怎么做网站空间与服务器