1,service介绍
Service(简称svc)定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象,Service是对一组提供相同功能的Pods的抽象,并为他们提供一个统一的入口,借助 Service 应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签(label)来选取后端Pod,一般配合ReplicaSet或者Deployment来保证后端容器的正常运行。
注意:svc在整个集群中负责网络服务(并不是底层容器网络实现),因为pod实际上是不可靠的,可能会被停止或者重启,一旦重启就会导致IP地址发生变化
2,service网络服务模式
Service 创建网络服务一般分为集群内部访问(clusterIP )和集群外部访问(NodePort)模式:
clusterIP 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
NodePort 是通过映射端口到宿主机的方式,访问地址为宿主机IP地址加上端口的方式,和hostPort 类似,但是NodePort 会在kubernetes集群的所有node上监听,也就是说创建一个Service ,配置了一个NodePort 监听30000端口,那么集群内所有的node都会监听30000端口,不管访问该node上有没有对应的pod,随意访问任何一台node的30000端口都可以被转发到正确的后端pod中
3,创建service
(1)集群内部访问(clusterIP )
[root@kube-master-01 yaml]# cat ng-rc-svc.yml
apiVersion: v1
kind: Service
metadata:
name: ng-svc
labels:
name: ng-svc
spec:
ports:
# 指的是监听88端口
- port: 88
# 指定后端pod监听的端口
targetPort: 80
protocol: TCP
selector:
# 指定具有app标签,且值为ng-rc 的pod全部纳入本组Service
app: ng-rc
# 通过create 创建好后可以查看到clusterIP和端口等信息
[root@kube-master-01 yaml]# kubectl get svcng-svc -o wide
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
ng-svc 10.254.99.239 88/TCP 1d app=ng-rc
(2)集群外部访问(nodeport模式)
通过这种模式,创建svc以后,集群里边的每一个node都会监听我们定义好的端口,并将该端口映射到pod,这样就实现了外部访问
[root@kube-master-01 yaml]# cat ng-rc-svc-nodeport.yml
piVersion: v1
kind: Service
metadata:
name: ng-svc-nodeport
labels:
name: ng-svc-nodeport
spec:
type: NodePort
ports:
- port: 30000
targetPort: 80
protocol: TCP
# 是实际提供外部访问的端口,默认端口是30000-32767 范围,为了避免混淆,建议把除targetPort外的端口都设相同
nodePort: 30000
selector:
app: ng-rc
# 查看Service 是否正确接管pod的网络服务可以使用命令
[root@kube-master-01 yaml]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 10.1.14.11:6443 1d
ng-svc 172.40.3.2:80,172.40.3.3:80,172.40.7.2:80 + 1 more... 1d
ng-svc-nodeport 172.40.3.2:80,172.40.3.3:80,172.40.7.2:80 + 1 more... 21h