k8s service nodeport
服务(Service)
将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用程序就能使用不熟悉的服务发现机制。 你可以在 Pod 中运行代码,无需顾虑这是为云原生世界设计的代码,还是为已容器化的老应用程序设计的代码。 你可以使用 Service 让一组 Pod 在网络上可用,让客户端能够与其交互。
如果一组 Pod(称为“后端”)为集群内的其他 Pod(称为“前端”)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,以便前端可以使用提供工作负载的后端部分?
Kubernetes 中的 Service
Service API 是 Kubernetes 的组成部分,它是一种抽象,帮助你通过网络暴露 Pod 组合。 每个 Service 对象定义一个逻辑组的端点(通常这些端点是 Pod)以及如何才能访问这些 Pod 的策略。
举个例子,考虑一个图片处理后端,它运行了 3 个副本。这些副本是可互换的 —— 前端不需要关心它们调用了哪个后端副本。 然而组成这一组后端程序的 Pod 实际上可能会发生变化, 前端客户端不应该也没必要知道,而且也不需要跟踪这一组后端的状态。
Service 定义的抽象能够解耦这种关联。
定义 Service
Service 在 Kubernetes 中是一个对象 (与 Pod 或 ConfigMap 类似的对象)。你可以使用 Kubernetes API 创建、查看或修改 Service 定义。 通常你使用 kubectl
这类工具来进行这些 API 调用。
Service 资源
Kubernetes的Service
定义了一种抽象:逻辑上的一组Pod,一种可以访问它们的方式。这一组Pod能通过Service被访问到,通过是通过Selector
来实现的。
举个例子,如果后台有三个节点提供图片访问服务,调用者可以通过Service进行访问,它不需要知道具体访问的是哪一个节点,具体的策略由Service来配置,并实现负载均衡。某种意义上也是服务发现和解耦。
nodePort
外部流量访问K8s的一种方式,即nodeIP:nodePort
,是提供给外部流量访问K8s集群资源的一种方式。
例子
1、创建POD;
root@master:~# kubectl create deployment test-nodeport --image=nginx --replicas=2 deployment.apps/test-nodeport created
2、创建service;
root@master:~# kubectl create service nodeport test-nodeport --tcp=30001:80 --node-port=30000 service/test-nodeport created
3、查询创建结果:
root@master:~# kubectl get ep NAME ENDPOINTS AGE default-nginx <none> 98d kubernetes 192.168.108.21:6443 99d test-nodeport 10.244.1.6:80,10.244.2.6:80 19s root@master:~# kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR default-nginx ClusterIP 10.107.198.139 <none> 80/TCP 98d app=nginx kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 99d <none> test-nodeport NodePort 10.107.153.7 <none> 30001:30000/TCP 33s app=test-nodeport root@master:~# kubectl get pod -l app=test-nodeport NAME READY STATUS RESTARTS AGE test-nodeport-698fbf5cdd-6cf7c 1/1 Running 0 5m52s test-nodeport-698fbf5cdd-gnndf 1/1 Running 0 5m52s root@master:~#
5、外部机器通过nodeport 访问机器内部;
port、nodePort、targetPort
port: K8s集群内部服务访问service的入口。是service暴露在Cluster上的端口,ClusterIP:Port;
targetPort: 容器的端口,也是最终底层的服务所提供的端口,所以说targetPod也就是Pod的端口。从port或者是nodePort进入的流量,经过路由转发之后,最终都会都通过targetPort进入到Pod中;
nodePort:外部流量访问K8s的一种方式,即nodeIP:nodePort
,是提供给外部流量访问K8s集群资源的一种方式;
如:
通过外部网络来访问k8s集群资源,需要nodePort,即:nodePort 对外部访问;
总结
总体来说,除了targetPort是容器本身的端口之外,port和nodePod都是Service的端口。不同的是port是暴露给K8s访问的,nodePort是暴露给外部访问的。
采用 NodePort 方式暴露服务面临一个坑爹的问题是,服务一旦多起来,NodePort 在每个节点上开启的端口会及其庞大,而且难以维护,所以可以考虑换一种方式来进行维护,如:ingress;