【K8S】Service再了解
关于Service的概念及其实例,可以参考这篇文章【K8S】Service概念及其实例
一句话概括Service的作用,Service负责将客户端的请求转发到具有特定标签的Pod上。
但是Service和Pod并不是直接相连的,Pod的ip及端口会被保存在Service的EndPoints列表中,查看一个Service的EndPoints的命令是
kubectl get endpoints service名称 -n 命名空间
那么外界如何访问这个Service呢?或者说,怎么将Service暴露给外部呢?
第一种方式,可以使用NodePort方式。
顾名思义,在某个节点上开放一个端口,用于将请求转发到对应的Service端口上,Service再查询EndPoints列表,最后将请求转发到具体的Pod上。
采用NodePort方式的简单Service样例
apiVersion: v1
kind: Service
metadata:
name: Service-nodePort
spec:
clusterIp: 100.10.10.9
type: NodePort //设置为NodePort
ports:
- port: 80
targetPort: 8080
nodeport: 30123 //通过节点的30123端口可以访问该Service
selector:
app: test
只要我们访问这个节点的ip:30123,然后流量会转发到该service的clusterIp:80端口上,再转发到endPoints列表中的地址(即pod的ip:端port)上,此时流量已经到了pod上,pod最后将流量下发到该Pod上的容器的8080端口上,由容器完成对请求的处理。
但是nodeport的值只能在【30000,30767】之间。
第二种方式,通过Ingress暴露服务
Ingress更像是请求的引路人,可以依据请求的地址,转发到对应的service上。
一个简单的实例
apiVersion: v1
kind: Ingress
metadata:
name: Ingress-test
spec:
rules:
- host: test.example.com
http:
paths:
- path: /a //对test.example.com/a请求转发至s1服务
backend:
serviceName: s1
servicePort:80
- path: /b //对test.example.com/b请求转发至s2服务
backend:
serviceName: s2
servicePort:80
该ingress实例,可以将对一个主机的不同访问路径转发到不同的服务上
当然,这里的host为数组,说明Ingress可以将对不同主机的不同访问路径转发到不同的服务上,更加灵活。
Service类型
headLess,顾名思义,无头服务。
无头服务不需要配置clusterIp,那么配置一个headLess类型的Service时,只需要将spec.clusterIp设置为None。
这种类型的Service所管辖的每一个Pod,都会有一个域名,所以这些Pod可以通过域名互相访问。
未完