【Kubernetes】Service 类型:NodePort、ClusterlP、LoadBalancer、ExternalName

Service 服务》系列,共包含以下文章:

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

在《Service 概念与实战》一文中,Service 的发布使用的是 NodePort 类型。除此之外,Service 的发布还支持 ClusterlPLoadBalancerExternalName 这 3 种类型。

在这里插入图片描述

1.NodePort

在把 Service 的 type 字段设置为 NodePort 时,Kubernetes 将在每个节点上随机分配一个端口作为外部用户访问的入口(该端口号的默认范围是 30000 - 32767)。该端口允许外部用户访问集群内部的 Pod 应用。如果用户想指定 30000 - 32767 内某个具体的端口,则需要增加一个 nodePort 字段。

在这里插入图片描述

在以下 YAML 文件中,使用 nodePort 字段指定了一个自定义的端口号 31234

apiVersion: v1
kind: Service
metadata:
  name: service-demo2
  namespace: default
spec:
  # 这里使用 NodePort 类型的 Service 将应用程序暴露给外部
  type: NodePort 
  ports:
  - name: http
  	# 为方便起见,一般将 targetport 字段的值设置为与 port 字段相同的值
    port: 80
    targetPort: 80
    # 可选字段,自定义端口号
	nodePort: 31234
    protocol: TCP
  # 定义标签选择器,将服务 Service 与匹配便签的一组 Pod 关联起来
  selector:     
    app: nginx
端口类型
说明
nodePort外部机器可访问的端口,一般为 node 机器上开放的端口。nodePort 是 kubernetes 提供给集群外部客户访问 Service 入口的一种方式。
portKubernetes 中的服务之间访问的端口,是提供给集群内部客户访问 Service 的入口。例如,尽管 MySQL 容器暴露了 3306 端口,但是集群内其他容器需要通过 3306 端口访问该服务,外部机器不能访问 MySQL 服务,因为没有配置 nodePort 类型。
targetPorttargetPort 是 Pod 上的端口,容器的端口(最根本的端口入口),与制作容器时暴露的端口一致(DockerFile 中 EXPOSE),例如 docker.io 官方的 nginx 暴露的是 80 端口。从 portnodePort 上到来的数据最终经过 kube-proxy 流入到后端 Pod 的 targetPort 上进入容器。
containerPortcontainerPort 是在 Pod 控制器中定义的、Pod 中的容器需要暴露的端口。targetPortcontainerPort 必须一致。

在这里插入图片描述

2.ClusterlP

这是 Service 默认的发布类型。它将在集群内部分配一个可以访问的虚拟 IP 地址,通过该地址暴露服务。因此,这种类型的 Service 只能够实现 同一个集群内部应用之间的相互访问

在这里插入图片描述

下面来演示 ClusterIP 的使用。

通过 Deployment 创建应用的部署描述文件 service-clusterip1.yaml,并在其中输入以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name:  service-clusterip
spec:
  replicas: 3 
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx

使用 kubectl apply 命令创建 Deployment。

kubectl apply -f service-clusterip1.yaml

创建 Service 的描述文件 service-clusterip2.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Service
metadata:
  name: service-clusterip
  namespace: default
spec:
  ports:
  - name: http
    port: 1234
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx

这里没有指定 Service 的发布类型,默认就是 ClusterIP。同时这里将容器中的 80 端口暴露成了 1234 端口。

🚀 也可以使用 kubectl expose deployment my-deployment --port=1234 --target-port=80 --name=my-service 命令暴露应用。在这个例子中,my-deployment 是 Deployment 的名称,my-service 是 Service 的名称,--port=1234 是 Service 的端口,--target-port=80 是 Deployment 内部容器的端口。

使用 kubectl apply 命令创建 Service。

kubectl apply -f service-clusterip2.yaml

查看 Pod、Service 和 Endpoint 的详细信息。

kubectl get pod,svc,ep -o wide

输出的信息如下:

在这里插入图片描述

通过 Cluster IP 地址访问应用,将返回 Nginx 的首页。

curl 10.96.206.202:1234

在这里插入图片描述

3.LoadBalance

如果要使用外部的负载均衡器来访问应用(如 Google Cloud、AWS 和 OpenStack 等),则可以通过使用 LoadBalancer 类型的 Service 将 Kubernetes 集群中的 IP 地址和端口号自动加入公有云的 LoadBalancer 中,从而异步地实现负载均衡。

在这里插入图片描述
在以下 YAML 示例文件中,使用阿里云作为 Kubernetes 集群的外部负载均衡器。

apiVersion: v1
kind: Service
metadata:
  name: service-loadbalancer
  labels:
    app: service-loadbalancer
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: main-port
  selector:
    app: service-loadbalancer
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: alicloud-controller-manager
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: alicloud-controller-manager
    spec:
      containers:
      - image: collenzhao/alicloud-controller-manager
        name: alicloud-controller-manager
        env:
          - name: ACCESS_KEY_ID
            value: 你的阿里云 ACCESS_KEY_ID
          - name: ACCESS_KEY_SECRET
            value: 你的阿里云ACCESS_KEY_SECRET

在这里插入图片描述

4.ExternalName

ExternalName 类型的 Service 可以将一个已经存在的 Service 映射到外部的 DNS 服务,而达到通过使用外部 DNS 服务解析服务应用的目的。
在这里插入图片描述
下面是 Kubernetes 官方提供的一个示例。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

🚀 在查找主机 my-service.prod.svc.cluster.local 时,Kubernetes 集群的 DNS 服务将返回 my.database.example.com

Kubernetes 中,`type: NodePort` 和 `type: LoadBalancer` 是两种不同的服务暴露方式,适用于不同的场景。以下是它们的区别以及在 Minikube 中的使用说明: --- ### **1. NodePort** - **作用**:将服务暴露在集群节点的某个静态端口(NodePort)上,允许通过 `<NodeIP>:<NodePort>` 访问服务。 - **特点**: - 端口范围默认是 `30000-32767`。 - 适用于本地开发或测试环境。 - 不需要外部负载均衡器。 - **Minikube 使用**: - 直接通过 `minikube ip` 获取节点 IP,结合 NodePort 访问服务。 - 示例: ```yaml apiVersion: v1 kind: Service metadata: name: helloworld-service spec: type: NodePort ports: - port: 80 targetPort: 8888 nodePort: 32000 # 可选,不指定时会自动分配 ``` - 访问方式: ```bash curl http://$(minikube ip):32000 ``` --- ### **2. LoadBalancer** - **作用**:将服务暴露到外部负载均衡器(如云厂商的 LB),分配一个外部 IP。 - **特点**: - 在云环境中(如 AWS、GCP),会自动创建负载均衡器。 - 在 Minikube 或本地集群中,默认不会分配外部 IP,需额外操作(如 `minikube tunnel`)。 - **Minikube 使用**: - 启用 `minikube tunnel` 以模拟云负载均衡器: ```bash minikube tunnel ``` - 服务配置: ```yaml apiVersion: v1 kind: Service metadata: name: helloworld-service spec: type: LoadBalancer ports: - port: 80 targetPort: 8888 ``` - 访问方式: - 运行 `minikube tunnel` 后,Kubernetes 会为服务分配一个外部 IP(可通过 `kubectl get svc` 查看)。 - 直接访问该 IP: ```bash curl http://<EXTERNAL-IP> ``` --- ### **3. 关键区别** | 特性 | NodePort | LoadBalancer | |---------------------|-----------------------------|-----------------------------| | **适用环境** | 本地/测试 | 云环境或本地(需 `tunnel`) | | **端口范围** | 30000-32767 | 80/443(通常) | | **外部 IP** | 无(需手动获取 NodeIP) | 自动分配(云环境) | | **Minikube 支持** | 直接使用 | 需 `minikube tunnel` | --- ### **4. 如何选择?** - **本地测试**:优先用 `NodePort`,简单直接。 - **模拟云环境**:用 `LoadBalancer` + `minikube tunnel`,更接近生产环境。 - **Ingress 场景**:如果使用 Ingress 控制器(如 Nginx Ingress),通常用 `ClusterIP` 或 `NodePort` 暴露 Ingress 服务本身。 --- ### **5. 验证服务状态** 无论哪种类型,均可通过以下命令检查服务是否正常: ```bash kubectl get svc helloworld-service kubectl describe svc helloworld-service kubectl get pods -o wide # 确认 Pod 是否运行正常 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据与AI实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值