将运行在一组 Pods 上的应用程序公开为网络服务的形象办法。
应用 Kubernetes,你无需批改应用程序即可应用不相熟的服务发现机制。 Kubernetes 为 Pod 提供本人的 IP 地址,并为一组 Pod 提供雷同的 DNS 名, 并且能够在它们之间进行负载平衡。
Service的工作模式
- userspace 代理模式
- iptables 代理模式
- IPVS 代理模式
多端口 Service,如以下示例:
apiVersion: v1kind: Servicemetadata: name: my-servicespec: selector: app.kubernetes.io/name: MyApp ports: - name: http protocol: TCP port: 80 targetPort: 9376 - name: https protocol: TCP port: 443 targetPort: 9377
内部服务Service
在某些环境中,利用零碎须要将一个内部数据库作为后端服务进行连贯,或将另一个集群或Namespace中的服务作为服务的后端,这时能够通过创立一个无Label Selector的Service来实现。
apiVersion: v1kind: Servicemetadata: name: mysql-testspec: ports: - port: 3306
(此时须要创立一个和该Service同名的Endpoint)。
apiVersion: v1kind: Endpointsmetadata: name: mysql-test namespace: defaultsubsets: - addresses: - ip: 120.25.128.30 ports: - port: 3306
Headless Service
在某些利用场景中,凋谢人员心愿本人管制负载平衡的策略,不应用Service提供的默认负载平衡的性能,或者应用程序心愿晓得属于同组的其余实例。 此种服务不为Service设置ClusterIP,仅通过Label Selector 找后端的Pod列表返回给调用的客户端。
apiVersion: v1kind: Servicemetadata: name: nginx labels: app: nginxspec: ports: - port: 80 clusterIP: None selector: app: nginx
Service的类型
- ClusterIP:指定Service的拜访形式,默认值为ClusterIP
- NodePort:通过每个节点上的 IP 和动态端口(NodePort)裸露服务。 NodePort 服务会路由到主动创立的 ClusterIP 服务。 通过申请 <节点 IP>:<节点端口>,你能够从集群的内部拜访一个 NodePort 服务。
- LoadBalancer:应用云提供商的负载均衡器向内部裸露服务。 内部负载均衡器能够将流量路由到主动创立的 NodePort 服务和 ClusterIP 服务上。
- ExternalName:通过返回 CNAME 和对应值,能够将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创立任何类型代理。
ClusterIP:这个service有一个Cluster-IP,其实就一个VIP。具体实现原理依附kubeproxy组件,通过iptables或是ipvs实现。
NodePort:在ClusterIP根底上为Service在每台机器上绑定一个端口,这样就能够通过: NodePort来拜访该服务。
apiVersion: v1kind: Servicemetadata: name: my-servicespec: type: NodePort #类型 selector: app.kubernetes.io/name: MyApp ports: # 默认状况下,为了不便起见,`targetPort` 被设置为与 `port` 字段雷同的值。 - port: 80 # Service端口 targetPort: 80 # 容器端口 protocol: TCP # 协定 # 可选字段 # 默认状况下,为了不便起见,Kubernetes 管制立体会从某个范畴内调配一个端口号(默认:30000-32767) nodePort: 30007 # 对外裸露的端口,能够指定
LoadBalancer:在NodePort的根底上,借助Cloud Provider创立一个内部负载均衡器,并将申请转发到NodePort
apiVersion: v1kind: Servicemetadata: name: my-servicespec: selector: app.kubernetes.io/name: MyApp ports: - protocol: TCP port: 80 targetPort: 9376 clusterIP: 10.0.171.239 type: LoadBalancerstatus: loadBalancer: ingress: - ip: 192.0.2.127
ExternalName:把集群内部的服务引入到集群外部来,在集群外部间接应用。没有任何类型代理被创立,这只有 Kubernetes 1.7或更高版本的kube-dns才反对。
集群内部拜访Pod或Service的办法
将容器利用的端口号映射到物理机
通过设置容器级别的hostPort,将容器利用的端口映射到物理机上
apiVersion: v1kind: Podmetadata:name: webapplabels: app: webappspec: containers: - name: webapp image: tomcat ports: - containerPort: 8080 hostPort: 8081
通过设置Pod级别的hostNetwork=true,该Pod中所以容器的端口号都被间接映射到物理机上。
apiVersion: v1kind: Podmetadata:name: webapplabels: app: webappspec: hostNetwork: true containers: - name: webapp image: tomcat ports: - containerPort: 8080
将Service的端口号映射到物理机
通过配置nodePort映射到物理机,同时设置Service的类型为NodePort
apiVersion: v1kind: Servicemetadata:name: nginxlabels: app: nginxspec: type: NodePort ports: - port: 80 targetPort: 8080 nodePort: 8081 selector:app: nginx
如有@侵权,请分割 2787950493@qq.com 改版。