K8s简述NodePort
前言最近在学习Kubernetes的过程中,由于都是在K8s集群内部进行Docker通信的,就遇到了如何暴露服务给外界访问的问题,生产环境比较好的方案就是借助云服务商使用LoadBalancer的方式,但由于是测试环境就使用了比较简单的NodePort来暴露服务,在实践过程中,也加深了对K8s概念的理解。Service把一组Pods抽象为网络服务,通过K8s你不需要通过修改程序的服务发现机制来管理
前言
最近在学习Kubernetes的过程中,由于都是在K8s集群内部进行Docker通信的,就遇到了如何暴露服务给外界访问的问题,生产环境比较好的方案就是借助云服务商使用LoadBalancer
的方式,但由于是测试环境就使用了比较简单的NodePort
来暴露服务,在实践过程中,也加深了对K8s概念的理解。
Service
把一组Pods抽象为网络服务,通过K8s你不需要通过修改程序的服务发现机制来管理通信。K8s给每个Pods独立的IP,以及给一组Pods一个DNS并通过负载均衡的方式进行访问。
动机
K8s的Pods是有生命周期的,通常是可以被创建和销毁的,然后销毁之后就不会再启动了。如果采用的是Deployment,则可以动态的创建和销毁Pod。
每个Pod都有自己的IP,但是在Deployment中创建的Pod,先创建的可能会和后面创建Pod的IP地址不同。
那么就会出现一个问题,如果一组Pod为服务调用方,一组Pod为服务提供方,服务调用者怎么找到服务提供者的地址?
Service 资源
Kubernetes的Service
定义了一种抽象:逻辑上的一组Pod,一种可以访问它们的方式。这一组Pod能通过Service被访问到,通过是通过Selector
来实现的。
举个例子,如果后台有三个节点提供图片访问服务,调用者可以通过Service进行访问,它不需要知道具体访问的是哪一个节点,具体的策略由Service来配置,并实现负载均衡。某种意义上也是服务发现和解耦。
nodePort
外部流量访问K8s的一种方式,即nodeIP:nodePort
,是提供给外部流量访问K8s集群资源的一种方式。
例如需要暴露服务的端口给外界访问的话可以通过命令:
kubectl expose deployment nginx --type=NodePort
可以随机暴露出一个端口外部访问的端口(默认值:30000-32767)出来。由于暴露的端口往往都比较大,这时候可以采用nginx反向代理的方式,为外界提供访问服务(HTTP:80,HTTPS:443)。
除了使用命令之外也可以使用yaml配置文件的方式进行服务的配置,如下所示:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort // 配置为NodePort,外部可以访问
ports:
- port: 30080 // 容器间,服务调用的端口
targetPort: 80 // 容器暴露的端口,与Dockerfile暴露端口保持一致
nodePort: 30001 // NodePort,外部访问的端口
selector:
name: nginx-pod
然后如果是一些内部的服务,比如数据库服务,或者除了网关以外的微服务,这些服务是不需要外部访问的。因此没有必要设置nodePort
属性。
port
K8s集群内部服务访问service的入口。是service暴露在Cluster上的端口,ClusterIP:Port
。如下面的yaml配置文件所示,K8s集群内部节点可以通过30080端口访问Nginx服务,然而外部网络还是不能够访问到服务,因为nodePort参数没有配置。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 30080
targetPort: 80
selector:
name: nginx-pod
targetPort
容器的端口,也是最终底层的服务所提供的端口,所以说targetPod也就是Pod的端口。从port或者是nodePort进入的流量,经过路由转发之后,最终都会都通过targetPort进入到Pod中。
与容器创建时暴露的端口保持一致,具体演示如下所示:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort // 有配置NodePort,外部流量可访问k8s中的服务
ports:
- port: 30080 // 服务访问端口
targetPort: 80 // 容器端口
nodePort: 30001 // NodePort
selector:
name: nginx-pod
总结
总体来说,除了targetPort是容器本身的端口之外,port和nodePod都是Service的端口。不同的是port是暴露给K8s访问的,nodePort是暴露给外部访问的。
更多推荐
所有评论(0)