[关闭]
@zhangyy 2020-03-07T20:11:12.000000Z 字数 3815 阅读 218

kubernetes 的 Services

kubernetes系列


  • 一: kubernetes 的 Services

一: kubernetes 的 Services

1.1 Service 的概念

  1. Kubernetes Service  定义了这样一种抽象:一个  Pod  的逻辑分组,一种可以访问它们的策略 —— 通常称为微
  2. 服务。 这一组  Pod  能够被  Service  访问到,通常是通过  Label Selector

image_1e2q5c0341utg151nhaeh2a1raa9.png-62.9kB

  1. Service能够提供负载均衡的能力,但是在使用上有以下限制:
  2. 只提供 4 层负载均衡能力,而没有 7 层功能,但有时我们可能需要更多的匹配规则来转发请求,这点上 4
  3. 负载均衡是不支持的

1.2 Service 的类型

  1. Service K8s 中有以下四种类型
  2. 1.ClusterIp:默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP
  3. 2.NodePort:在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过 : NodePort 来访
  4. 问该服务
  5. 3.LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发
  6. 到: NodePort
  7. 4.ExternalName:把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,
  8. 这只有 kubernetes 1.7 或更高版本的 kube-dns 才支持

image_1e2q5kpl315t11a4osbk1r571fr6m.png-147.3kB

1.3 VIP 和 Service 代理

  1. Kubernetes 集群中,每个 Node 运行一个  kube-proxy  进程。 kube-proxy  负责为  Service  实现了一种
  2. VIP(虚拟 IP)的形式,而不是  ExternalName  的形式。 Kubernetes v1.0 版本,代理完全在 userspace。在
  3. Kubernetes v1.1 版本,新增了 iptables 代理,但并不是默认的运行模式。 Kubernetes v1.2 起,默认就是
  4. iptables 代理。
  5. Kubernetes v1.8.0-beta.0 中,添加了 ipvs 代理
  6. Kubernetes 1.14 版本开始默认使用 ipvs 代理
  7. Kubernetes v1.0 版本, Service 4层”(TCP/UDP over IP)概念。 Kubernetes v1.1 版本,新增了
  8. Ingress APIbeta 版),用来表示 7层”(HTTP)服务
  9. !为何不使用 round-robin DNS
  10. 因为DNS 有缓存

1.4 代理模式的分类

1.4.1 userspace 代理模式

image_1e2q6ltgkh7t1n8k1jvv176i1rl13.png-730.9kB

1.4.2 iptables 代理模式

image_1e2q6n48c19sg13bd1g7epsq1l9v1j.png-682.7kB

1.4.3 ipvs 代理模式

  1. 这种模式,kube-proxy 会监视 Kubernetes Service 对象和 Endpoints ,调用 netlink 接口以相应地创建
  2. ipvs 规则并定期与 Kubernetes Service 对象和 Endpoints 对象同步 ipvs 规则,以确保 ipvs 状态与期望一
  3. 致。访问服务时,流量将被重定向到其中一个后端 Pod
  4. iptables 类似,ipvs netfilter hook 功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意
  5. 味着 ipvs 可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs 为负载均衡算法提供了更
  6. 多选项,例如:
  7. rr :轮询调度
  8. lc :最小连接数
  9. dh :目标哈希
  10. sh :源哈希
  11. sed :最短期望延迟
  12. nq 不排队调度

image_1e2q6oq7h9ui1gf1fr6qfbg0g20.png-807.6kB

image_1e2q73pi4ord23vuvc41c77v2d.png-197.4kB

1.5 ClusterIP

  1. clusterIP 主要在每个 node 节点使用 iptables,将发向 clusterIP 对应端口的数据,转发到 kube-proxy 中。然
  2. kube-proxy 自己内部实现有负载均衡的方法,并可以查询到这个 service 下对应 pod 的地址和端口,进而把
  3. 数据转发给对应的 pod 的地址和端口

image_1e2q7582j171o1mvjpeiq5um0l2q.png-107.1kB

  1. 为了实现图上的功能,主要需要以下几个组件的协同工作:
  2. apiserver 用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求后将数据存储
  3. etcd
  4. kube-proxy kubernetes的每个节点中都有一个叫做kube-porxy的进程,这个进程负责感知servicepod
  5. 的变化,并将变化的信息写入本地的iptables规则中
  6. iptables 使用NAT等技术将virtualIP的流量转至endpoint

  1. 定义一个deployment
  2. vim svc-deploy.yaml
  3. ----
  4. apiVersion: apps/v1
  5. kind: Deployment
  6. metadata:
  7. name: myapp-deploy
  8. namespace: default
  9. spec:
  10. replicas: 3
  11. selector:
  12. matchLabels:
  13. app: myapp
  14. release: stabel
  15. template:
  16. metadata:
  17. labels:
  18. app: myapp
  19. release: stabel
  20. env: test
  21. spec:
  22. containers:
  23. - name: myapp
  24. image: wangyanglinux/myapp:v2
  25. imagePullPolicy: IfNotPresent
  26. ports:
  27. - name: http
  28. containerPort: 80
  29. ---
  30. kubectl apply -f svc-deploy.yaml

image_1e2q7ps801st8qo1gmp419n9o37.png-105kB

  1. 定义service 对外访问:
  2. vim myapp-service.yaml
  3. ---
  4. apiVersion: v1
  5. kind: Service
  6. metadata:
  7. name: myapp
  8. namespace: default
  9. spec:
  10. type: ClusterIP
  11. selector:
  12. app: myapp
  13. release: stabel
  14. ports:
  15. - name: http
  16. port: 80
  17. targetPort: 80
  18. ---
  19. kubectl apply -f service.yaml

image_1e2qbmtuqfuu19pq1i3t1i15l8d3k.png-79.9kB

image_1e2qbnguu1qod2al109h1qsu1mur41.png-47.6kB

image_1e2qboc1u8kqah2s11fu5orv4e.png-240.1kB

image_1e2qbrd1r1u7u1gl5iuk1gl41le14r.png-260.5kB

1.6 Headless Service

  1. 有时不需要或不想要负载均衡,以及单独的 Service IP 。遇到这种情况,可以通过指定 Cluster
  2. IP(spec.clusterIP) 的值为 None 来创建 Headless Service 。这类 Service 并不会分配 Cluster IP kube-
  3. proxy 不会处理它们,而且平台也不会为它们进行负载均衡和路由

  1. vim myapp-svc-headless.yaml
  2. ---
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6. name: myapp-headless
  7. namespace: default
  8. spec:
  9. selector:
  10. app: myapp
  11. clusterIP: "None"
  12. ports:
  13. - port: 80
  14. targetPort: 80
  15. ---
  16. kubectl apply -f myapp-svc-headless.yaml
  17. kubectl get pods -n kube-system -o wide
  18. dig -t A myapp-headless.default.svc.cluster.local. @10.96.0.10
  19. kubectl get pod -o wide
  20. ---

image_1e2qc9b7cc7mtu31la11jqd18hf58.png-89.3kB
image_1e2qd20bu1i5ftcm1gda1kr41a5c5l.png-201.6kB

image_1e2qd2qof19jp1lf0l0c17vu145h62.png-191.3kB

image_1e2qd4c6b156b165dltj1ina12oq6f.png-87.8kB

1.7: NodePort

  1. nodePort 的原理在于在 node 上开了一个端口,将向该端口的流量导入到 kube-proxy,然后由 kube-proxy
  2. 一步到给对应的 pod

  1. vim nodeport.yaml
  2. ---
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6. name: myapp
  7. namespace: default
  8. spec:
  9. type: NodePort
  10. selector:
  11. app: myapp
  12. release: stabel
  13. ports:
  14. - name: http
  15. port: 80
  16. targetPort: 80
  17. ---
  18. kubectl apply -f nodeport.yaml
  19. kubectl get svc

image_1e2qdh4c4va4qtr13mfmo254k79.png-67.4kB

image_1e2qde7he15v01geo1io55f84cb6s.png-208.9kB

image_1e2qdl0mr3hh1aohapkfem8em83.png-62.3kB


1.8 LoadBalancer

  1. loadBalancer nodePort 其实是同一种方式。区别在于 loadBalancer nodePort 多了一步,就是可以调用
  2. cloud provider 去创建 LB 来向节点导流

image_1e2qdq9sj18dm1c7n1g4uro0bbc8g.png-80.1kB


1.9 ExternalName

  1. 这种类型的 Service 通过返回 CNAME 和它的值,可以将服务映射到 externalName 字段的内容( 例如:
  2. www.baidu.com )。ExternalName Service Service 的特例,它没有 selector,也没有定义任何的端口和
  3. Endpoint。相反的,对于运行在集群外部的服务,它通过返回该外部服务的别名这种方式来提供服务

  1. vim externalName.yaml
  2. ---
  3. kind: Service
  4. apiVersion: v1
  5. metadata:
  6. name: my-service-1
  7. namespace: default
  8. spec:
  9. type: ExternalName
  10. externalName: www.baidu.com
  11. ---
  12. kubectl apply -f externalName.yaml

image_1e2qe64jshas1v3b4bs1c5p1k5q8t.png-117.9kB

  1. 当查询主机 my-service.defalut.svc.cluster.local ( SVC_NAME.NAMESPACE.svc.cluster.local )时,集群的
  2. DNS 服务将返回一个值 my.database.example.com CNAME 记录。访问这个服务的工作方式和其他的相
  3. 同,唯一不同的是重定向发生在 DNS 层,而且不会进行代理或转发
  1. dig -t A my-service-1.default.svc.cluster.local. @10.244.0.11

image_1e2qef9ts1h9v10u29geki41utf9q.png-186.7kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注