K8S-Service 提供外部服务(7)

使用 Service 提供外部服务

Pod 使用的是一个集群内部的 IP 地址,如果用 Pod 来运行 nginx 是无法从集群外部访问到页面的。比如上面创建的 Pod,在 Master 节点上执行curl ip就可以访问到 nginx 页面。

 exit 退出到 PowerShell 后就无法访问了。

 另一个问题就是 Pod 并不是一个稳定的实体,经常会被创建或销毁,这里它的 IP 地址也会发生变化。

解决方案就是使用 Service 来提供外部服务

  • 创建一个 Service sudo kubectl service nginx-service
  • 也可以直接将已存在的 Deployment 对外公开为一个服务
    sudo kubectl expose deployment nginx-deployment

  •  查看资源详细信息sudo kubectl describe [资源类型] [资源名称]

  •  通过配置文件创建 Service

新建一个配置文件 nginx-service.yaml

apiVersion: v1  # 使用的Kubernetes API版本,这里是v1。
kind: Service  # 定义资源类型为Service,表示创建一个服务。
metadata:  # 元数据部分,用于描述Service的基本信息。
  name: nginx-service  # Service的名称为nginx-service。
spec:  # 规格部分,定义Service的规格。
  selector:  # 选择器部分,用于指定服务应该选择哪些Pod作为后端。
    app: nginx  # 选择具有标签app=nginx的Pod作为后端。
  ports:  # 端口配置,定义Service暴露的端口。
    - protocol: TCP  # 使用TCP协议。
      port: 80  # Service暴露的端口号为80。
      targetPort: 80  # 转发到后端Pod的端口号也为80。

这里需要先了解一下选择器 selector 的作用:选择特定的资源,一般和 label 标签一起使用,类似 CSS 的选择器,我们前面在创建 Deployment 时已经给 Deployment 绑定了一个选择器,回头看看配置文件里的 matchLabels,也可以sudo kubectl describe deployment nginx-deployment看一下 Deployment 信息,可以看到 Deployment 信息下有个 Selector

 然后再看看 Pod 信息,创建的三个 Pod 都有 Labels 标签

 总结一下就是,在 Deployment 声明一个选择器,在 Pod 里贴上一个标签,选择器与标签匹配的 Deployment 就可以管理 Pod。

保存配置文件后应用一下这个文件sudo kubectl apply -f nginx-service.yaml

但是这个服务还是一个集群内部的服务,无法从集群外部访问,这时我们就得用到 NodePort 类型的服务。

 NodePort 可以将服务公开到集群的节点上,然后我们通过 IP 和端口就可以访问到服务了。

我们创建 Service 时没有指定服务的类型,那这个 Service 默认就是一个 ClusterIP 类型的服务,也就是集群内部的服务,现在我们来将 Service 的服务类型改为 NodePort,只要在配置文件里加上 type 和 nodePort 就好了。注意端口的范围在 30000~32767 之间(这个范围是由 Kubernetes 团队选择的,因为它们通常不会被其他应用或服务占用)

apiVersion: v1  # 使用的Kubernetes API版本,这里是v1。
kind: Service  # 定义资源类型为Service,表示创建一个服务。
metadata:  # 元数据部分,用于描述Service的基本信息。
  name: nginx-service  # Service的名称为nginx-service。
spec:  # 规格部分,定义Service的规格。
  type: NodePort    # 指定服务类型
  selector:  # 选择器部分,用于指定服务应该选择哪些Pod作为后端。
    app: nginx  # 选择具有标签app=nginx的Pod作为后端。
  ports:  # 端口配置,定义Service暴露的端口。
    - protocol: TCP  # 使用TCP协议。
      port: 80  # Service暴露的端口号为80。
      targetPort: 80  # 转发到后端Pod的端口号也为80。
      nodePort: 30080

保存后 apply 一下,sudo kubectl apply -f nginx-service.yaml

然后查看 Service 信息,可以看到服务类型变成了 NodePort,且端口号为 30080

 查看一下 IP 地址sudo kubectl get nodes -o wide

 

然后打开浏览器,输入 nodeIP:port,可以访问了!

 

关于 Service 的类型还有其它各类和应用,LoadBalcancer、ExternalName、Headless,感兴趣上官网了解一下

posted @ 2025-07-11 21:30  arroa  阅读(73)  评论(0)    收藏  举报