Service:一个Pod的逻辑分组,一种可以访问它们的策略 —— 通常称为微服务。这一组Pod能够被Service访问到,通常是通过Label Selector
Service能够提供负载均衡的能力,但是在使用上有以下限制:只提供 4 层负载均衡能力,而没有 7 层功能
在 Kubernetes 集群中,每个 Node 运行一个kube-proxy进程。kube-proxy负责为Service实现了一种VIP(虚拟 IP)的形式,而不是ExternalName的形式。
在 Kubernetes v1.0 版本,代理完全在 userspace。在Kubernetes v1.1 版本,新增了 iptables 代理,但并不是默认的运行模式。从 Kubernetes v1.2 起,默认就是iptables 代理。在 Kubernetes v1.8.0-beta.0 中,添加了 ipvs 代理在 Kubernetes 1.14 版本开始默认使用ipvs 代理
在 Kubernetes v1.0 版本,Service是 “4层”(TCP/UDP over IP)概念。在 Kubernetes v1.1 版本,新增了Ingress API(beta 版),用来表示 “7层”(HTTP)服务
这种模式,kube-proxy 会监视 Kubernetes Service对象和Endpoints,调用netlink接口以相应地创建ipvs 规则并定期与 Kubernetes Service对象和Endpoints对象同步 ipvs 规则,以确保 ipvs 状态与期望一致。访问服务时,流量将被重定向到其中一个后端 Pod
与 iptables 类似,ipvs 于 netfilter 的 hook 功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着 ipvs 可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs 为负载均衡算法提供了更多选项,例如:
Service 在 K8s 中有以下四种类型
默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP
clusterIP 主要在每个 node 节点使用 iptables(ipvs),将发向 clusterIP 对应端口的数据,转发到 kube-proxy 中。然后 kube-proxy 自己内部实现有负载均衡的方法,并可以查询到这个 service 下对应 pod 的地址和端口,进而把数据转发给对应的 pod 的地址和端口
为了实现图上的功能,主要需要以下几个组件的协同工作:
#创建deployment [root@k8s-master01 service]# cat myapp-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy namespace: default spec: replicas: 3 selector: matchLabels: app: myapp release: stable template: metadata: labels: app: myapp release: stable env: test spec: containers: - name: myapp image: hub.dianchou.com/library/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 [root@k8s-master01 service]# kubectl create -f myapp-deploy.yaml deployment.apps/myapp-deploy created [root@k8s-master01 service]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE myapp-deploy 3/3 3 3 8s [root@k8s-master01 service]# kubectl get rs NAME DESIRED CURRENT READY AGE myapp-deploy-7cb48b56d7 3 3 3 11s [root@k8s-master01 service]# kubectl get pod NAME READY STATUS RESTARTS AGE myapp-deploy-7cb48b56d7-9g2zm 1/1 Running 0 16s myapp-deploy-7cb48b56d7-dxtbz 1/1 Running 0 16s myapp-deploy-7cb48b56d7-gw4jn 1/1 Running 0 16s [root@k8s-master01 service]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES myapp-deploy-7cb48b56d7-9g2zm 1/1 Running 0 23s 10.244.1.137 k8s-node01 <none> <none> myapp-deploy-7cb48b56d7-dxtbz 1/1 Running 0 23s 10.244.1.138 k8s-node01 <none> <none> myapp-deploy-7cb48b56d7-gw4jn 1/1 Running 0 23s 10.244.2.140 k8s-node02 <none> <none> [root@k8s-master01 service]# curl 10.244.1.137 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> #创建service [root@k8s-master01 service]# cat myapp-service.yaml apiVersion: v1 kind: Service metadata: name: myapp namespace: default spec: type: ClusterIP selector: app: myapp release: stable ports: - name: http port: 80 targetPort: 80 [root@k8s-master01 service]# kubectl create -f myapp-service.yaml service/myapp created [root@k8s-master01 service]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 31h myapp ClusterIP 10.98.224.21 <none> 80/TCP 30s [root@k8s-master01 service]# curl 10.98.224.21 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> [root@k8s-master01 service]# curl 10.98.224.21/hostname.html myapp-deploy-7cb48b56d7-dxtbz [root@k8s-master01 service]# curl 10.98.224.21/hostname.html myapp-deploy-7cb48b56d7-9g2zm [root@k8s-master01 service]# curl 10.98.224.21/hostname.html myapp-deploy-7cb48b56d7-gw4jn
在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过NodeIp:NodePort 来访问该服务
在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到NodeIp:NodePort
把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 kubernetes 1.7 或更高版本的 kube-dns 才支持
kubernetes(四)--service/ingress
原文:https://www.cnblogs.com/hujinzhong/p/12257146.html