kubernetes(k8s): service 和 ingress

一 总述

1 service 作用

POD 中运行的容器存在动态、弹性的变化(容器的重启IP地址会变化),因此便产生了service,其资源为此类POD对象提供一个固定、统一的访问接口及负载均衡能力,并借助DNS系统的服务发现功能,解决客户端发现容器难得问题

service 和POD 对象的IP地址在集群内部可达,但集群外部用户无法接入服务,解决的思路有:
1 在POD上做端口暴露(hostPort)
2 在工作节点上公用网络名称空间(hostNetwork)
3 使用service 的NodePort 或 loadbalancer (service 依赖于 DNS资源服务)
4 ingress七层负载均衡和反向代理资源

2 service资源及实现模型

1 service 概述

1 service是微服务的一种实现,事实上其是一种抽象:通过关注定义出多个POD对象组合而成的逻辑集合,以及访问这组POD的策略,service关联POD 需要标签选择器完成,其基于标签选择器将一组POD定义成一个逻辑集合,并通过自己的IP地址和端口调度代理请求至后端POD之上。

2 service 对象的IP地址称为cluster IP,位于K8S集群配置指定的专用IP地址范围内,其是一种虚拟IP地址,其在service对象创建后保持不变,并且能够被同一集群中的POD资源访问,service端口接受客户端的请求并将其转发至后端POD中的相应端口,因此,其又被称为四层代理,因其工作在TCP/IP层。

3 service 资源通过API server 持续监视标签选择器匹配到的后端POD对象,并实时跟踪各对象的变动,service并不直接连接POD对象,而是通过endpoints 资源对象类型处理,其有IP地址和端口组成,默认情况下,当创建service对象时,其关联的endpoints对象也会被自动创建。

2 虚拟IP和服务代理

1 虚拟IP

一个service对象就是工作节点上的一些iptables或ipvs,用于将到达service对象的IP地址的流量转发到相应的endpoint对象指定的IP地址和端口上,kube-proxy组件通过api-server持续监控着各个service及其相关的POD对象,并将其创建或变动实时反映到工作节点的iptable或ipvs上。

ipvs是借助于netfilter实现的网络请求报文调度框架,支持rr、wrr、lc、wlc、sh、sed和nq 等十余种调度算法,用户空间的命令行工具是ipvsadm,用于管理工作于ipvs上的调度规则。

service IP 事实上是用于生成iptables 或 ipvs 规则时使用的ip地址,仅用于实现K8S集群网络的内部通信,并能够通过规则中定义的转发服务请求作为目标地址予以响应,这也是其成为虚拟IP地址的原因。

2 代理模型

1 userspace 代理模型(用户空间模型)

userspace 是Linux操作系统的用户空间,这种模型中,kube-proxy 负责跟踪API server 上的endpoints对象的变动,并根据其进行相关的调整策略。

对于每个service对象,其都会随机打开一个本地端口,任何到达此端口的请求都会被代理到当前service资源的后端各个POD对象上,其默认使用RR调度策略。

其代理的过程是: 请求到达service后,其被转发到内核,经由套接字送往用户空间的kube-proxy,而后经由kube-proxy送回内核空间,并调度至后端POD,其传输方式效率太低。在1.1 版本之前,其是默认的转发策略。

2 iptables代理模型

kube-proxy 负责跟踪API server上 service和 endpoints对象的变动,并据此作出service资源定义的变动,对于每个service,都会创建iptabls规则直接捕获到达clusterIP 和PORT 的流量,并将其重定向到当前的service后端,默认算法是随机调度算法,POD 直接请求service IP 地址通过其直接访问对应的POD服务,在1.2开始成为默认类型,其使用的是iptables的目标地址转换至后端的POD对象,相对而言,其不用在内核和用户空间之间切换,因此更加高效,但其不能再被挑中的POD资源无响应时进行重定向,但用户空间(userspace)模型可以。

3 ipvs模型

此模型跟踪API service上的service和endpoints对象的变动,据此来调用netlink接口创建IPVS规则,并确保API server中的变动保持同步,其流量调度策略在IPVS中实现,其余的在iptables中实现。
ipvs 支持众多调度算法,如rr、lc、dh、sh、sed和nq 等。

二 service 资源基本应用

service 本身不提供服务,其是通过后端POD提供对应的服务,因此,service资源对象通常要和deployment完成应用的创建和对外发布。

1 创建service 资源

1 使用命令行创建service资源

创建POD资源

 kubectl run   nginx  --image=nginx:1.14  --replicas=3

查看deployment资源
在这里插入图片描述其名称为nginx

创建对应的service资源

kubectl expose  deployment nginx --name=nginx --port=80 --target-port=80 --protocol=TCP

查看生成的service
在这里插入图片描述查看生成的endpoints对应关系
在这里插入图片描述node节点资源访问
在这里插入图片描述

2 使用配置文件创建service

#[root@master1 service]# cat demo.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
    name: service-demo
    namespace: default
spec:
    selector:  #用于匹配后面POD对象
        matchLabels:
            app: service
    template:
        metadata:
            labels:
                app: service
        spec:
            containers:
                - name: service-demo
                  image: nginx:1.14
                  ports:  # 配置暴露端口
                    - name: http
                      containerPort: 80
                  readinessProbe:  #增加就绪性探测,用于探测服务是否正常运行,若未就绪则service不能向该POD上调度流量
                    httpGet:
     
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值