kubernetes 中服务 这个对象的出现是为了解决一个问题,那就是pod 的不稳定性,因为pod 会因为各种原因删除,创建,更新, 所以pod 的IP是变动的
例如,我们创建了一个Mysql 的pod , 我们如果使用pod 的IP地址进行通信,那么如果这个pod 发生了变化,我们是无法自动获取到新的IP地址的,所以服务就出现了
Service 是在pod 前边的一层,service的地址是不会变的,也就是说,我们只需要对应的给mysql 的pod 创建一个service , 那么 , 无论pod 的ip 发生什么变化,我们都不需要关心,因为service 会监听pod的新地址,并把我们的请求发送到正确的地址
我们来看一下具体的三种类型的Service 类型,分别是: NodePort , ClusterIP,LoadBalancer
如下图所示,NodePort 这个service 其实就是 同时监听 我们的Pod 和 物理主机, 把物理主机的30000-32767 端口转发到 Pod 的80端口
这样,当我们请求物理主机的30000-32767端口的时候就可以访问到我们的Pod里的服务了
如何创建:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: v1 kind: Service metadata: name: myapp-service spec: types: NodePort ports: - targetPort: 80 port: 80 nodePort: 30008 selector: app: myapp type: front-end |
其中比较关键的就是selector , 这个selector决定了service 把流量发送到哪些pod,因为我们可能有上百个pod ,我们必须精确找到我们的pod, 所以
selector里边的值要和pod 定义里边的label 匹配,这样,service 和pod的联系就建立了,如下图:
注意,Service 是整个cluster 级别的,并不是和某个Node绑定的,你可以访问任何的Node的IP加端口,都可以访问到我们的pod ,即使你访问的Node上没有对应的POD, kubernetes也会通过IPtalbles 给你转发到其他对的Node ,然后到对的pod
ClusterIP 类型的Service 是为了解决内部service之间的相互访问
也就是前段的Pod ,通过Service来访问后端的POD,同样是因为pod 的IP地址会 发生变化,所以我们使用Service
创建也非常简单
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: Service metadata: name: back-end spec: types: ClusterIP ports: - targetPort: 80 port: 80 selector: app: myapp type: back-end |
1 |
kubectl create -f service-definition.yaml |
查看:
1 |
kubectl get services |
创建完成以后,我们就可以通过clusterip 的80端口来访问pod的80端口了
LoadBalance 是一种特殊的Service ,他必须要有所在云平台的支持,例如AWS, GCP
因为我们从不能把我们所有的Node IP地址发给客户去访问我们的pod,我们希望他们能通过域名类似: www.503error.com这样的域名来访问我们的pod , 这个时候我们就可以定义一个Loadbalance 类型的Service
aws 为例,我们把域名指向创建出来的alb ,然后alb会自动的把流量转发到我们的pod上,具体实现原理就不详细说了,就是通过target group之类的
创建方法也非常简单,换一下types就可以了
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: v1 kind: Service metadata: name: back-end spec: types: LoadBalancer ports: - targetPort: 80 port: 80 selector: app: myapp type: back-end |
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021