文章目录

  • 1 Service
  • 2 service暴露端口的方式
    • 2.1 clusterIP
    • 2.2 NodePort
    • 2.3 loadbalancer
    • 2.4 lngress
  • 3 kubernetes代理方式
    • 3.1 userspace代理模式
    • 3.2 iptables 代理模式
    • 3.3 IPVS 代理模式
  • 4 Service服务类型
  • 5 实列
    • 5.1 ClusterIP
    • 5.2 NodePort
    • 5.3 ExternalName

1 Service

Kubernetes Service定义了这样一种抽象:逻辑上的一组 Pod,一种能够访问它们的策略 —— 一般被称为微服务。这一组 Pod 可以被 Service 访问到,一般是经过selector实现的。

举例:考虑一个图片处理 backend,它运行了3个副本。这些副本是可互换的 —— frontend 不需要关心它们调用了哪一个 backend 副本。 然而组成这一组 backend 程序的 Pod 实际上可能会发生变化,frontend 客户端不必知道,并且也不需要跟踪这一组 backend 的状态。Service 定义的抽象可以解耦这种关联。

Service能够提供负载均衡的能力,可是使用上存在以下限制

  • 只能提供4层负载均衡能力,而没有7层功能。有时咱们可能须要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的

web访问的service服务示例图

2 service暴露端口的方式

2.1 clusterIP

此类型会提供一个集群内部的虚拟IP(与pod不在同一网段),以供集群内部的pod之间通信使用。clusterIP也是kubernetes service的默认类型,主要需要以下几个组件的协同工作

  • apiservice:在创建service时,apiserver接收到请求以后将数据存储到etcd中。
  • kube-proxy:k8s的每个节点中都有该进程,负责实现service功能,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables
    -iptables:使用NAT等技术将virtuallp的流量转至endpoint

2.2 NodePort

NodePort模式除了使用clusterip外,也将service的port映射到每个node的一个指定内部的port上,映射的每个node的内部port都一样。为每个节点暴露一个端口,通过nodeIP+nodeport可以访问你这个服务,同时服务依然会有cluster类型的ip+port。内部通过clusterip方式访问,外部通过nodeport方式访问

2.3 loadbalancer

loadbalancernodeport基础上,k8s可以请求底层云平台创建一个负载均衡器,将每个node作为后端,进行服务分发,该模式需要底层云平台(例如GCE)支持

2.4 lngress

lngress是一种http方式的路由转发机制由lngress controllerhttp代理服务器组合而成,lngress controller实例监控kubernetes api实时更新http代理服务器的转发规则。http代理服务器有GCE load-balancer、haproxy、nginx等开源方案

service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务.举个例子一个a服务运行3个pod,b服务怎么访问a服务的pod,pod的ip都不是持久化的重启之后就会有变化。这时候b服务可以访问跟a服务绑定的serviceservice信息是固定的提前告诉b就行了,service通过Label Selector跟a服务的pod绑定,无论a的pod如何变化对b来说都是透明的

3 kubernetes代理方式

Kubernetes集群中,每一个 Node 运行一个kube-proxy进程。kube-proxy负责为 Service实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName的形式

Kubernetes v1.0开始,已经可使用 userspace代理模式。Kubernetes v1.1添加了 iptables 代理模式,在Kubernetes v1.2kube-proxyiptables模式成为默认设置。Kubernetes v1.8添加了ipvs代理模式

3.1 userspace代理模式

这种模式kube-proxy会监视 Kubernetes masterService对象和 Endpoints对象的添加和移除。 对每一个 Service它会在本地 Node 上打开一个端口(随机选择)。 任何链接到代理端口的请求,都会被代理到 Servicebackend Pods中的某个上面(如 Endpoints所报告的同样)。 使用哪一个 backend Pod,是 kube-proxy基于 SessionAffinity来肯定的

它配置iptables规则,捕获到达该 ServiceclusterIP(是虚拟 IP)和 Port 的请求,并重定向到代理端口,代理端口再代理请求到 backend Pod

默认状况下,userspace模式下的kube-proxy经过循环算法选择后端,默认的策略是,经过round-robin算法来选择 backend Pod

3.2 iptables 代理模式

这种模式,kube-proxy会监视Kubernetes控制节点对 Service对象和 Endpoints对象的添加和移除。 对每一个 Service它会配置iptables规则,从而捕获到达该ServiceclusterIP和端口的请求进而将请求重定向到Service的一组 backend中的某个上面。对于每一个 Endpoints对象,它也会配置 iptables规则,这个规则会选择一个backend组合。

默认的策略是kube-proxyiptables模式下随机选择一个backend

使用iptables处理流量具备较低的系统开销,由于流量由Linux netfilter处理,而无需在用户空间和内核空间之间切换。 这种方法也可能更可靠。

若是kube-proxyiptables模式下运行,而且所选的第一个Pod 没有响应,则链接失败。 这与userspace模式不一样;在这种状况下kube-proxy将检测到与第一个 Pod 的链接已失败,并会自动使用其余后端 Pod 重试。

咱们可使用Pod readiness探测器 验证后端 Pod 是否能够正常工做,以便 iptables模式下的kube-proxy仅看到测试正常的后端。这样作意味着能够避免将流量经过kube-proxy发送到已知已失败的Pod

3.3 IPVS 代理模式

ipvs模式下kube-proxy监视Kubernetes服务Service和端点Endpoints调用 netlink接口相应地建立 IPVS规则, 并按期将 IPVS规则与Kubernetes服务Service和端点Endpoints同步。该控制循环可确保IPVS状态与所需状态匹配。访问服务Service时,IPVS 将流量定向到后端Pod之一

IPVS代理模式基于相似于iptables模式的 netfilter挂钩函数,可是使用哈希表做为基础数据结构,而且在内核空间中工做。 这意味着,与 iptables模式下的 kube-proxy相比,IPVS模式下的kube-proxy重定向通讯的延迟要短,而且在同步代理规则时具备更好的性能。与其余代理模式相比,IPVS模式还支持更高的网络流量吞吐量

IPVS提供了更多选项来平衡后端Pod的流量

  • rr: round-robin(循环)
  • lc: least connection (smallest number of open connections) (最小连接(打开连接的最小数量))
  • dh: destination hashing (目的地址哈希调度)
  • sh: source hashing (源地址哈希调度)
  • sed: shortest expected delay(最短的预期延迟)
  • nq: never queue(无须队列等待)

注意: 要在IPVS模式下运行kube-proxy必须在启动kube-proxy以前使IPVS Linux在节点上可用。 当kube-proxyIPVS代理模式启动时,它将验证IPVS内核模块是否可用。 若是未检测到IPVS内核模块,则 kube-proxy将退回到以iptables代理模式运行

4 Service服务类型

  • ClusterIP:默认类型,自动分配一个仅Cluster内部能够访问的虚拟IP(只能在集群内部访问)

  • NodePort:经过每一个 Node 上的 IP和静态端口(NodePort)(范围30000-32767)暴露服务。以ClusterIP为基础NodePort服务会路由到 ClusterIP服务。经过请求<NodeIP>:<NodePort>能够从集群的外部访问一个集群内部的 NodePort服务ClusterIP和路由规则会自动创建

  • LoadBalancer:使用云提供商的负载均衡器,能够向外部暴露服务。外部的负载均衡器能够路由到 NodePort服务和 ClusterIP服务

  • ExternalName创建一个dns别名指到service name上,主要是防止service name发生变化,要配合dns插件使用

5 实列

5.1 ClusterIP

[root@master ~]# vi network.yaml
apiVersion: apps/v1
kind: Deployment
metadata: name: myapp-deploy namespace: default
spec: replicas: 2 selector: matchLabels: app: myapp release: v1template:metadata: labels: app: myapp release: v1 spec: containers: - name: myappimage: zhaojie10/httpd:v0.1imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata: name: myapp-nodeportnamespace: default
spec: type: ClusterIPselector: app: myapprelease: v1ports: - name: httpdport: 80targetPort: 80# 应用资源清单文件,创建资源
[root@master ~]# kubectl apply -f network.yaml
deployment.apps/myapp-deploy created
service/myapp-nodeport created# 查看pod,service运行情况
[root@master ~]# kubectl get pods,svc
NAME                                READY   STATUS    RESTARTS   AGE
pod/myapp-deploy-667bd747b6-6mkmq   1/1     Running   0          6m30s
pod/myapp-deploy-667bd747b6-wp65f   1/1     Running   0          6m30sNAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP   5d22h
service/myapp-nodeport   ClusterIP   10.98.197.112   <none>        80/TCP    6m30s# 查看iptables,规则[root@master ~]# iptables -t nat -nvL | grep 'myapp-nodeport'0     0 KUBE-MARK-MASQ  all  --  *      *       10.244.2.173         0.0.0.0/0            /* default/myapp-nodeport:httpd */0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */ tcp to:10.244.2.173:800     0 KUBE-MARK-MASQ  all  --  *      *       10.244.1.126         0.0.0.0/0            /* default/myapp-nodeport:httpd */2   120 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */ tcp to:10.244.1.126:802   120 KUBE-SVC-UJB7KAYNZVW7NK6H  tcp  --  *      *       0.0.0.0/0            10.98.197.112        /* default/myapp-nodeport:httpd cluster IP */ tcp dpt:802   120 KUBE-MARK-MASQ  tcp  --  *      *      !10.244.0.0/16        10.98.197.112        /* default/myapp-nodeport:httpd cluster IP */ tcp dpt:802   120 KUBE-SEP-WXLK2WHO6A3V7JDH  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */ statistic mode random probability 0.500000000000     0 KUBE-SEP-BXPFXJRGQ62K7TWT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */# 访问测试
[root@master ~]# curl 10.98.197.112
This is V1!

5.2 NodePort

[root@master ~]# vi network.yaml
apiVersion: apps/v1
kind: Deployment
metadata: name: myapp-deploy namespace: default
spec: replicas: 2 selector: matchLabels: app: myapp release: v1template:metadata: labels: app: myapp release: v1 spec: containers: - name: myappimage: zhaojie10/httpd:v0.1imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata: name: myapp-nodeportnamespace: default
spec: type: NodePort  // 指定NodePort类型selector: app: myapprelease: v1ports: - name: httpdport: 80targetPort: 80nodePort: 30001   //指定对外端口# 应用修改后的资源定义文件,重启pods
[root@master ~]# kubectl apply -f network.yaml
deployment.apps/myapp-deploy unchanged
service/myapp-nodeport configured# 查看pods,service状态
[root@master ~]# kubectl get pod,svc
NAME                                READY   STATUS    RESTARTS   AGE
pod/myapp-deploy-667bd747b6-6mkmq   1/1     Running   0          30m
pod/myapp-deploy-667bd747b6-wp65f   1/1     Running   0          30mNAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP        5d23h
service/myapp-nodeport   NodePort    10.98.147.133   <none>        80:30001/TCP   30m# 查看iptables 规则
[root@master ~]# iptables -t nat -nvL | grep 'myapp-nodeport'1    60 KUBE-SVC-UJB7KAYNZVW7NK6H  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */ tcp dpt:300010     0 KUBE-MARK-MASQ  all  --  *      *       10.244.2.173         0.0.0.0/0            /* default/myapp-nodeport:httpd */0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */ tcp to:10.244.2.173:800     0 KUBE-MARK-MASQ  all  --  *      *       10.244.1.126         0.0.0.0/0            /* default/myapp-nodeport:httpd */1    60 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */ tcp to:10.244.1.126:800     0 KUBE-SVC-UJB7KAYNZVW7NK6H  tcp  --  *      *       0.0.0.0/0            10.98.147.133        /* default/myapp-nodeport:httpd cluster IP */ tcp dpt:800     0 KUBE-MARK-MASQ  tcp  --  *      *      !10.244.0.0/16        10.98.147.133        /* default/myapp-nodeport:httpd cluster IP */ tcp dpt:801    60 KUBE-MARK-MASQ  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */ tcp dpt:300011    60 KUBE-SEP-WXLK2WHO6A3V7JDH  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */ statistic mode random probability 0.500000000000     0 KUBE-SEP-BXPFXJRGQ62K7TWT  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/myapp-nodeport:httpd */# 访问测试
[root@master ~]# curl 192.168.25.146:3000
This is V1!

5.3 ExternalName

[root@master ~]# vi network.yaml
apiVersion: apps/v1
kind: Deployment
metadata: name: myapp-deploy namespace: default
spec: replicas: 2 selector: matchLabels: app: myapp release: v1template:metadata: labels: app: myapp release: v1 spec: containers: - name: httpdimage: zhaojie10/httpd:v0.2  //此处将镜像,更换为基于contos编译的httpd镜像imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata: name: myapp-externalnamenamespace: default
spec: type: ExternalName  //指定类型externalName: my.k8s.example.com# 使用修改过后的资源定义文件,重启pods
[root@master ~]# kubectl apply -f network.yaml
deployment.apps/myapp-deploy configured
service/myapp-externalname unchanged# 查看pod,service状态
[root@master ~]# kubectl get pod,svc
NAME                               READY   STATUS    RESTARTS   AGE
pod/myapp-deploy-6768948cc-5gkk9   1/1     Running   0          9m8s
pod/myapp-deploy-6768948cc-gf5cnr   1/1     Running   0          9m6sNAME                         TYPE           CLUSTER-IP   EXTERNAL-IP          PORT(S)   AGE
service/kubernetes           ClusterIP      10.96.0.1    <none>               443/TCP   6d
service/myapp-externalname   ExternalName   <none>       my.k8s.example.com   <none>    32m# 此处Type,改为 ExternalName模式了

ExternalName类型的Service经过返回CNAME和它的值,能够将服务映射到externalName字段的内容(例如:my.k8s.example.com;能够实现跨namespace名称空间访问)。ExternalName ServiceService的特例,它没有selector也没有定义任何的端口和Endpoint。相反的,对于运行在集群外部的服务,它经过返回该外部服务的别名这种方式提供服务

k8s的service端口暴露与代理相关推荐

  1. 记一次k8s中service端口限制在30000-32767问题排查

    问题 今天利用service暴露nodePort端口80报以下错误 he Service "webapp" is invalid: spec.ports[0].nodePort: ...

  2. 使用kubectl port-forward暴露minikube k8s service端口

    kubectl port-forward暴露minikube k8s service端口 第一种方式 minikube service hello-minikube 第二种方式: kubectl po ...

  3. Kubernetes(k8s)之Service(服务)

    Service k8s中的Service Service中涉及到的名词 Service的实现 演示环境 IPVS 以ClusterIP模式创建svc 外部访问service的方式 1.通过Node P ...

  4. 【项目实战19】k8s(5)—service服务(IPVS均衡负载)

    service服务 一.前言 (1).service简述 (2).service类型 二.IPVS服务 (1).简介 (2).使用 三.service外部访问方式 (1).NodePort (2).L ...

  5. 企业运维 kubernetes(k8s) 之 service

    目录 1. service 介绍 2. 开启 kube-proxy 的 ipvs 模式 3. 创建 service:(NodePort方式) 4. DNS 插件 Service 5. pod 滚动更新 ...

  6. k8s之service服务(微服务)

    一.service介绍 Service可以看作是一组提供相同服务的Pod对外的访问接口.借助Service,应用可以方便地实现服务发现和负载均衡. service默认只支持4层负载均衡能力,没有7层功 ...

  7. k8s创建service

    k8s创建service 一.创建service示例 1.1.已有的deployment 1.2.使用expose创建 1.3.使用yaml创建 1.4.从集群外部访问service 1.5.创建无头 ...

  8. 【k8s系列十二】k8s 之 Service的类型

    svc的类型 ClusterIp:默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP NodePort:在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样 ...

  9. 【运维面试】k8s中service和ingress的区别

    serivce是如何被设计的: 在pod中运行的容器在动态,弹性的变化(比如容器的重启IP地址会变化),为了给pod提供一个固定的,统一访问的接口,以及负载均衡的能力,并借助DNS系统实现服务发现功能 ...

最新文章

  1. 微课堂 | 腾讯产品经理刘涵宇:给产品经理和设计师的用户体验知识
  2. CANopen笔记1
  3. 专精开发还是转管理?程序员的职业规划选择,没有想象中那么难
  4. Spring整合Hibernate 二 - 声明式的事务管理
  5. 使用Java的Selenium:Google搜索
  6. 获取浏览器可视区域、屏幕的宽和高
  7. Centos 7 环境下,如何使用 Apache 实现 SSL 虚拟主机 双向认证 的详细教程:
  8. 引擎设计跟踪(九.2) 3DS MAX 导出插件 继续
  9. 阅读替换净化规则_阅读3.0来了 — 全网免费阅读功能更强大
  10. linux centos无线网卡驱动安装,Linux CentOS 7 安装tp link 无线网卡驱动
  11. Vue中Swiper以及vue-awesome-swiper的安装和问题
  12. CSR蓝牙4.0与 APT-X高保真音频技术
  13. syntactic sugar - 语法糖 - 糖衣语法
  14. anki最新开发文档(2.1)
  15. 【Adapter模式】C++设计模式——适配器
  16. w10投影全屏设置_win10如何让投影仪铺满全屏
  17. 单片机c语言生日快乐歌,单片机C语言程序设计:播放生日快乐歌
  18. videojs进度条始终为零
  19. 解决帝国CMS搜索页面模板不支持灵动标签和万能标签的方法
  20. tair mysql_MySQL数据库异构数据同步–后端以tair为例

热门文章

  1. android百度地图路线查询,Android百度地图——路线规划搜索
  2. 移动端名片识别SDK
  3. kafka 创建 topic 报错 Error: Exception thrown by the agent : java.rmi.server.ExportException: Port alrea
  4. NES神经干细胞标志物抗体检测方案
  5. AMADA阿玛达JAE工控机维修UT5-AMD9-B故障汇总
  6. 简单的通过DockerFile 构建自己的nacos镜像 并持久化到 MySQL8.0
  7. 生成式人工智能是否会是下一个风口?
  8. 成功解决 RecoveryYour PC/Device needs to be repairedThe Boot c onfiguration Data for your PC is missin
  9. 五星好评的蓝牙耳机长什么样子?2021高人气蓝牙耳机榜单前五
  10. renderdoc捕获的mesh,通过插件一键导出成fbx