Ingress学习笔记

本文详细介绍了Kubernetes Ingress的原理和使用,包括Ingress资源、配置选项、跨域、重写规则、HTTPS配置、自定义header以及注解的使用。Ingress作为外部访问K8S集群应用的媒介,需要配合Ingress Controller才能工作,如Nginx Ingress Controller。文章还探讨了Ingress的多种应用场景,如单服务暴露、负载均衡、基于名字的虚拟主机和TLS配置。最后提到了Ingress的更新方法和一些常见配置模板。
摘要由CSDN通过智能技术生成

 Ingress是管理外部网咯访问K8S集群中Service的API对象(典型就是HTTP),它可以提供负载均衡、SSL终端以及基于名字的虚拟host。简单点来说它就是外网访问集群应用的媒介,流程如下:

+----------+  Ingress   +---------+
| internet | ---------> | Service |
+----------+            +---------+

Ingress Controller 负责实现入口(即ingress的意思),通常使用负载均衡器,但它也可以配置边缘路由器或其他前端以帮助处理流量。Ingress不会随意暴露端口或协议,向Internet公开HTTP和HTTPS以外的服务通常使用Service.Type=NodePortService.Type=LoadBalancer类型的服务。

 和其他K8S资源一样,Ingress必须要有一个 Ingress Controller,仅有 Ingress Resource 是无效的,Ingress也是无法正常工作的。Ingress Controller不会随着集群的启动而自动启动,且Ingress Controller有多种,目前K8S只支持和维护GCE(Google Kubernetes Engine)和nginx2种Controller。

【Ingress Resource】

 Ingress Resource 则和大部分的K8S资源差不多,需要apiVersionkindmetadata等字段,下面一个最小ingress resource的示例:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /testpath
        backend:
          serviceName: test
          servicePort: 80

Ingress通常都是使用注解annotations来配置某些选项,具体可配置选项、支持哪些注解取决于Ingress Controller类型,上述是一个rewrite-target的注解,spec字段包含了负载均衡器或代理服务器的配置,最重要的是它包含了所有传入请求的匹配规则。注:Ingress Resource仅支持HTTP通信的规则。

 Ingress rules是Ingress中比较重要的一部分,即上述示例中的rules字段的含义(它是一个可以包含多种rule对象的数组),每个Http的rule都应该包含如下的信息:

  • host:可选参数,用于限定rule适用的host,如指定为foo.bar.com,那该rule只应用于这个host,上述示例中未指定,则该rule适用于通过指定IP地址的所有入站HTTP流量;
  • -paths:一系列的path对象组成的数组,上述示例中只有一个path为/testpath,每个path都有一个backend对象(代表的是后端服务)与之对应;
  • backend:是一个serviceNameservicePort的组合对象,只有hostpath都匹配成功的情况下,LoadBalancer才会将流量导向引用的服务。

 通常Ingress会有一个 Default Backend,当在上述我们自定义的Ingress Resource没有匹配的rule对象时,流量就会被导向这个Default Backend。当然这个default backend需要我们自己去配,通常不会在Ingress Resource中配置default backend,而是应该在Ingress Ctontroller中进行指定。

【Ingress的类型】

1.Single Service Ingress

 即单服务Ingress,K8S当前是支持暴露单个服务的,可以通过在没有规则的情况下指定默认后端来使用ingress来完成此操作,如:

# ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
spec:
  backend:
    serviceName: testsvc
    servicePort: 80

注:

安装完ingress后,还要执行:

# 创建命名空间 ingress-nginx
kubectl create namespace ingress-nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml

kubectl apply -f ingress.yaml即可,通过kubectl get ingress test-ingress可以查看详情,包括Ingress分配给这个default backend的IP。

2.Simple fanout

 fanout基于请求的HTTP URI将配置流量从单个IP路由到多个服务,Ingress 是允许将负载平衡器的数量降到最低,如:

foo.bar.com -> 178.91.123.132 -> / foo    service1:4200
                                 / bar    service2:8080

上述的过程需要一个如下的Ingress(同一个域名配置了2个path):

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: simple-fanout-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: service1
          servicePort: 4200
      - path: /bar
        backend:
          serviceName: service2
          servicePort: 8080

3.基于名字虚拟host

 和2类似,这种类型的Ingress支持将HTTP流量路由到在同一个IP上的多个host name,流程如下:

foo.bar.com --|                 |-> foo.bar.com s1:80
              | 178.91.123.132  |
bar.foo.com --|                 |-> bar.foo.com s2:80

此时的Ingress Resource应该为:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: name-virtual-host-ingress
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
          serviceName: service1
          servicePort: 80
  - host: bar.foo.com
    http:
      paths:
      - backend
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值