首页 > Web开发 > 详细

kubernetes(四)--service/ingress

时间:2020-02-03 21:34:28      阅读:81      评论:0      收藏:0      [点我收藏+]

一、Service概念

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)服务

技术分享图片

2.1、userspace 代理模式

技术分享图片

2.2、iptables 代理模式

技术分享图片

2.3、ipvs 代理模式

这种模式,kube-proxy 会监视 Kubernetes Service对象和Endpoints,调用netlink接口以相应地创建ipvs 规则并定期与 Kubernetes Service对象和Endpoints对象同步 ipvs 规则,以确保 ipvs 状态与期望一致。访问服务时,流量将被重定向到其中一个后端 Pod

与 iptables 类似,ipvs 于 netfilter 的 hook 功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着 ipvs 可以更快地重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs 为负载均衡算法提供了更多选项,例如:

  • rr:轮询调度
  • lc:最小连接数
  • dh:目标哈希
  • sh:源哈希
  • sed:最短期望延迟
  • nq:不排队调度

技术分享图片

三、Service类型

Service 在 K8s 中有以下四种类型

3.1、ClusterIp

默认类型,自动分配一个仅 Cluster 内部可以访问的虚拟 IP

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

技术分享图片

为了实现图上的功能,主要需要以下几个组件的协同工作:

  1. apiserver 用户通过kubectl命令向apiserver发送创建service的命令,apiserver接收到请求后将数据存储到etcd中
  2. kubernetes的每个节点中都有一个叫做kube-porxy的进程,这个进程负责感知service,pod的变化,并将变化的信息写入本地的iptables规则中
  3. iptables 使用NAT等技术将virtualIP的流量转至endpoint中
#创建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

3.2、NodePort

在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过NodeIp:NodePort 来访问该服务

3.3、LoadBalancer

在 NodePort 的基础上,借助 cloud provider 创建一个外部负载均衡器,并将请求转发到NodeIp:NodePort

3.4、ExternalName

把集群外部的服务引入到集群内部来,在集群内部直接使用。没有任何类型代理被创建,这只有 kubernetes 1.7 或更高版本的 kube-dns 才支持

kubernetes(四)--service/ingress

原文:https://www.cnblogs.com/hujinzhong/p/12257146.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!