一、背景介绍

Pod是有生命周期的,当一个工作节点(node)销毁时,节点上运行的pods也会被销毁。ReplicationController会动态地在其他节点上创建Pod来保持应用程序的运行,每一个Pod都有一个独立的IP地址,甚至是同一个节点上的Pod。可以看出Pod的IP是动态的,它随Pod的创建而创建,随Pod的销毁而消失,这就引出一个问题:如果由一组Pods组合而成的集群来提供服务,那如何访问这些Pods呢?

Kubenetes的Service就是用来解决这个问题的。一个Service可以看作一组提供相同服务的Pods的对外访问接口,Service作用于哪些Pods是通过label selector来定义的,这些Pods能被Service访问,Pod之间的发现和路由(如应用中的前端和后端组件)由Kubernetes Service处理。

Service有四种type:

  • ClusterIP(默认)
  • NodePort
  • LoadBalancer
  • ExternalName

其中NodePort和LoadBalancer两类型的Services可以对外提供服务。

二、基于NodePort配置对外暴露服务

NodePort:对外暴露应用(集群外)。在每个节点上启用一个端口来暴露服务,可以在集群外部访问。

2.1 创建service.yaml

示例代码:

---# serviceapiVersion: v1kind: Servicemetadata:name: web-servicenamespace: web-spacespec:selector:app: web# 指定关联Pod的标签type: NodePort# 这里代表是NodePort类型ports:- port: 8080# Service端口,供内部访问(和clusterIP对应,即ip:8080)protocol: TCP# TCP协议targetPort: 8080# 容器端口nodePort: 30001# 对外暴露的端口,供外部调用

示例图片:

2.2 应用yaml

kubectl create -f service.yaml

参考资料

  • k8s学习(四) k8s使用nodeport方式配置service对外暴露服务
  • k8s service使用NodePort对外暴露应用