潇湘夜雨移动版

主页 > 系统 > 云计算与云原生 >

ingress控制器

一、ingress简介
 
管理对集群中的服务(通常是HTTP)的外部访问的API对象。Ingress可以提供负载平衡、SSL终端和基于名称的虚拟主机。
我们知道service的表现形式为IP:PORT,即工作在第四层传输层(TCP/IP层),那么对于不同的URL地址经常对应用不同的后端服务或者
虚拟服务器,这些应用层的转发机制仅通过kubernetes的service机制是无法实现的,这种情况我们可以使用ingress策略定义和一个具体
的ingress Controller,两者结合实现一个完整的Ingress 负载均衡,这个负载均衡是基于nginx七层反向代理来实现。
 
    internet
        |
   [ Ingress ]
   --|-----|--
   [ Services ]
   
   
 foo.bar.com --|                 |-> foo.bar.com s1:80
              | 178.91.123.132  |
bar.foo.com --|                 |-> bar.foo.com s2:80
 
需要注意: Ingress Controller 和 Ingress是两个不同的资源。
 
Ingress它是通过headless service的集群内FQDN获取到它后端所有的Pod资源的IP,因为headless Service没有ClusterIP,它的域名对应的IP为PodIP。
 
Ingress获取PodIP后,在立刻将其写入到ingress-nginx的配置文件中,
并触发nginx重读配置文件。实现动态更新upstream。
 
另外,外部LB可以直接跳过Service,直接访问到nginx,这需要将nginx这个Pod作为共享宿主机的网络名称空间才能实现,这时就需要
借助于daemonSet控制器来控制着nginx这种七层反代Pod仅允许在指定节点上,并且每个节点上仅运行一个nginx Pod。
不同于 Deployment 控制器等 Ingress 控制器并不直接运行为 kube-controllermanager的一部份,它是 Kubemetes 集群的一个重要附件,类似于 CoreDNS 需要在集群
上单独部署
 
二、控制器类型
 
K8S 推荐的 Nginx Ingress。它的主要优点简单、易接入、对 TCP 和 UDP 协议的完全支持,但是其他的,比如像鉴权方式,或者流量调度,这个功能都是非常缺失的。
 
Kong 本身是一个 API 网关,他也算是开创了先河,将 API 网关引入到 K8S 中当 ingress。另外对于边缘网关,大家还是有很多需求的,比如说像鉴权、限流、灰度部署等能力。
Kong 在这些方面做的非常好。另外 Kong ingress 还有一个非常大的优点,他提供了一些 API、服务的定义,去抽象成 K8S 的 CRD,所以可以很方便地通过 K8S ingress 配置,
去同步到 Kong 的集群。虽然 Kong 有很多优点,但 Kong 也有一个非常大的缺点,那就是部署特别困难,另外他的高可用,与 APISIX 相比也是相形见绌。
 
Traefik 是基于 Golang 的 ingress,它本身是一个微服务网关,但是在 ingress 的场景应用比较多。他的主要平台是基于 Golang,自身支持的协议也非常多,总体来说是
没有什么缺点。如果大家熟悉 Golang 的话,也推荐一用。
 
HAproxy,是一个久负盛名的负载均衡器。它主要优点是有非常强大的负载均衡能力,其他方面并不占优势。
 
Istio ingress 和 Ambassador ingress 都是基于最近非常流行的 。说实话,我觉得这两个 ingress 没有什么缺点,可能唯一的缺点是他们基于 envoy 平台。
 
 
 
 
 
[root@master ~]# kubectl explain ingress.spec
KIND:     Ingress
VERSION:  extensions/v1beta1
 
RESOURCE: spec <Object>
 
DESCRIPTION:
     Spec is the desired state of the Ingress. More info:
     https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
 
     IngressSpec describes the Ingress the user wishes to exist.
 
FIELDS:
   backend <Object>
     A default backend capable of servicing requests that don't match any rule.
     At least one of 'backend' or 'rules' must be specified. This field is
     optional to allow the loadbalancer controller or defaulting logic to
     specify a global default.
 
   rules <[]Object>
     A list of host rules used to configure the Ingress. If unspecified, or no
     rule matches, all traffic is sent to the default backend.
 
   tls <[]Object>
     TLS configuration. Currently the Ingress only supports a single TLS port,
     443. If multiple members of this list specify different hosts, they will be
     multiplexed on the same port according to the hostname specified through
     the SNI TLS extension, if the ingress controller fulfilling the ingress
     supports SNI.
 
[root@master ~]# kubectl create namespace dev
namespace/dev created
[root@master ~]# kubectl get ns
NAME          STATUS   AGE
default       Active   561d
dev           Active   6s
kube-public   Active   561d
kube-system   Active   561d
 
https://github.com/kubernetes/ingress-nginx/tree/nginx-0.30.0/deploy/static
 
 
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
 
hosts添加:
199.232.68.133  githubusercontent.com raw.githubusercontent.com
 
修改镜像地址:
    containers:
        - name: nginx-ingress-controller
          #image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
          image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
 
[root@master ingress]# kubectl apply -f mandatory.yaml 
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created
limitrange/ingress-nginx created
[root@master ingress]# kubectl get pod -n ingress-nginx -o wide
NAME                                        READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
nginx-ingress-controller-5d49b4fbc7-j6gxr   0/1     ContainerCreating   0          48s   <none>   node2.k8s   <none>           <none>
[root@master ingress]# kubectl get pod -n ingress-nginx -o wide
NAME                                        READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nginx-ingress-controller-5d49b4fbc7-j6gxr   0/1     Running   0          51s   10.244.2.58   node2.k8s   <none>           <none>
 
查看日志,发现service缺少
[root@master ingress]# kubectl logs  nginx-ingress-controller-5d49b4fbc7-j6gxr -n ingress-nginx
W0705 10:45:09.069259       6 queue.go:130] requeuing &ObjectMeta{Name:sync status,GenerateName:,Namespace:,SelfLink:,UID:,ResourceVersion:,Generation:0,CreationTimestamp:0001-01-01 00:00:0 (责任编辑:liangzh)