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  阅读(112)  评论(0)    收藏  举报