1,service介绍

Service(简称svc)定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象,Service是对一组提供相同功能的Pods的抽象,并为他们提供一个统一的入口,借助 Service 应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service通过标签(label)来选取后端Pod,一般配合ReplicaSet或者Deployment来保证后端容器的正常运行。
注意:svc在整个集群中负责网络服务(并不是底层容器网络实现),因为pod实际上是不可靠的,可能会被停止或者重启,一旦重启就会导致IP地址发生变化
11.png

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 )

  1. [root@kube-master-01 yaml]# cat ng-rc-svc.yml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: ng-svc
  6. labels:
  7. name: ng-svc
  8. spec:
  9. ports:
  10. # 指的是监听88端口
  11. - port: 88
  12. # 指定后端pod监听的端口
  13. targetPort: 80
  14. protocol: TCP
  15. selector:
  16. # 指定具有app标签,且值为ng-rc 的pod全部纳入本组Service
  17. app: ng-rc
  1. # 通过create 创建好后可以查看到clusterIP和端口等信息
  2. [root@kube-master-01 yaml]# kubectl get svcng-svc -o wide
  3. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
  4. ng-svc 10.254.99.239 88/TCP 1d app=ng-rc

(2)集群外部访问(nodeport模式)

通过这种模式,创建svc以后,集群里边的每一个node都会监听我们定义好的端口,并将该端口映射到pod,这样就实现了外部访问

  1. [root@kube-master-01 yaml]# cat ng-rc-svc-nodeport.yml
  2. piVersion: v1
  3. kind: Service
  4. metadata:
  5. name: ng-svc-nodeport
  6. labels:
  7. name: ng-svc-nodeport
  8. spec:
  9. type: NodePort
  10. ports:
  11. - port: 30000
  12. targetPort: 80
  13. protocol: TCP
  14. # 是实际提供外部访问的端口,默认端口是30000-32767 范围,为了避免混淆,建议把除targetPort外的端口都设相同
  15. nodePort: 30000
  16. selector:
  17. app: ng-rc
  1. # 查看Service 是否正确接管pod的网络服务可以使用命令
  2. [root@kube-master-01 yaml]# kubectl get endpoints
  3. NAME ENDPOINTS AGE
  4. kubernetes 10.1.14.11:6443 1d
  5. ng-svc 172.40.3.2:80,172.40.3.3:80,172.40.7.2:80 + 1 more... 1d
  6. ng-svc-nodeport 172.40.3.2:80,172.40.3.3:80,172.40.7.2:80 + 1 more... 21h