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

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

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

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

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

    运行一个 Nginx 容器,将容器内的 80 端口映射到宿主机的 8080 端口:

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

    直接使用宿主机网络,容器内 80 端口直接对应宿主机 80 端口:

    bash 复制代码
    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 使用宿主机网络,直接暴露端口到宿主机:

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

    将容器端口映射到宿主机指定端口(类似 Docker 端口映射):

    yaml 复制代码
    # pod-hostport.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod-port
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - 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。

配置示例

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

关联的 Pod 配置

yaml 复制代码
# pod-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx  # 与 Service 的 selector 匹配
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - 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。

配置示例

yaml 复制代码
# service-loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service-lb
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer  # 类型为 LoadBalancer
  • 部署后,云服务商会自动创建负载均衡器,并分配公网 IP:

    bash 复制代码
    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,用于访问集群外服务。

配置示例

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

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

配置示例

yaml 复制代码
# ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  ingressClassName: nginx  # 使用 Nginx Ingress Controller
  rules:
  - host: example.com      # 外部访问域名
    http:
      paths:
      - path: /nginx       # 路径匹配
        pathType: Prefix
        backend:
          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+端口 单容器测试
Pod hostNetwork/hostPort Pod spec 中配置对应字段 宿主机IP+端口 特殊场景(如网络性能敏感)
Service NodePort type: NodePort + nodePort 节点IP+NodePort 开发/测试环境
Service LoadBalancer type: LoadBalancer 云负载均衡器IP 云环境生产服务
Service ExternalName type: ExternalName + externalName 集群内通过Service DNS访问 访问集群外服务
Ingress HTTP/HTTPS 路由 规则匹配域名/路径到Service 域名+路径(需解析到Ingress IP) 生产环境多服务路由管理

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

相关推荐
小白不想白a2 小时前
【ansible/K8s】K8s的自动化部署源码分享
kubernetes·自动化·ansible
云游3 小时前
Zabbix7.4.8(三):通过Zabbix agent 2监控Docker相关指标
docker·容器·zabbix
Lin_Aries_04213 小时前
使用 Jenkins 的流水线项目实施 CI/CD
运维·ci/cd·docker·容器·云计算·jenkins
云道轩3 小时前
初次尝试在kubernetes 1.31 上安装 人工智能模型运行平台 llm-d
人工智能·kubernetes·llm-d
缘的猿4 小时前
Kubernetes 安全管理:认证、授权与准入控制全面解析
java·安全·kubernetes
幻灭行度6 小时前
CKAD-CN 考试知识点分享(16) 修改 container 名称
kubernetes
走上未曾设想的道路6 小时前
k8s集群与gitlab registry连接
容器·kubernetes·gitlab
^Lim7 小时前
Docker搭建ESPIDF环境,程序下载
运维·docker·容器
虚伪的空想家10 小时前
K8S部署的ELK分片问题解决,报错:unexpected error while indexing monitoring document
运维·elk·云原生·容器·kubernetes·报错·eck