一、概念

我们知道Service的表现形式为IP地址和端口号(ClusterIP:Port),即工作在TCP/IP层。而对于基于http的服务来说,不同的URL地址经常对应不同的后端服务或者虚拟服务器,这些应用层的转发机制仅通过k8s的service机制是无法实现的。k8s引入了ingress资源对象,用于将k8s集群外的客户端请求路由到集群内部的服务上,同时提供7层(HTTP和HTTPS)路由功能。
k8s使用了一个Ingress策略定义和一个具体提供转发服务的Ingress Controller,两者结合,实现了灵活Ingress策略定义的服务路由功能。

1.Ingress

Ingress 是对集群中服务的外部访问进行管理的 API 对象,公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
在这里插入图片描述
Ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。

2.Ingress Controller

Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。使用Ingress进行服务路由时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service对应的后端Endpoint(Pod)上,这样就跳过kube-proxy设置的路由转发规则。
在这里插入图片描述

3.负载均衡器

IngressController需要实现基于不同HTTP URL向后转发的负载分发规则,并可以灵活设置7层负载分发策略。目前Ingress Controller已经有许多实现方案,包括:Nginx、HAProxy、Kong、Traefik、Skepper、Istio等开源软件实现,用那种需要结合自身实际需求去选择。

二、Ingress资源详解

1.Ingress资源定义

apiVersion: networking.k8s.io/v1				## Ingress接口版本
kind: Ingress									## 资源类型
metadata:										## 元数据
  name: minimal-ingress							## 资源名称
  annotations:									## 注解
    nginx.ingress.kubernetes.io/rewrite-target: /		## 重写,更多注解参考nginx官网
spec:											## 详细信息
  ingressClassName: nginx-example				## 这是最关键的一个配置,这个配置就是用来关联ingress-controller,这个值是ingressClass的名称
  rules:										## 路由规则
 - http:										## 协议类型 
      paths:									## 路径信息
      - path: /testpath							## 具体路径
        pathType: Prefix						## 路径匹配类型
        backend:								## 关联后端信息
          service:								## 后端service
            name: test							## service name
            port:								## service端口
              number: 80						## 端口号

路径匹配类型

  • ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的
    pathType 处理或者与 Prefix 或 Exact 类型作相同处理。
  • Exact:精确匹配 URL 路径,且区分大小写。
  • Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 /
    分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。

2.默认后端

没有设置规则的 Ingress 将所有流量发送到同一个默认后端,而 .spec.defaultBackend 则是在这种情况下处理请求的那个默认后端。 defaultBackend 通常是 Ingress 控制器的配置选项, 而非在 Ingress 资源中指定。 如果未设置任何的 .spec.rules,那么必须指定 .spec.defaultBackend。 如果未设置 defaultBackend,那么如何处理所有与规则不匹配的流量将交由 Ingress 控制器决定。
如果没有 hosts 或 paths 与 Ingress 对象中的 HTTP 请求匹配,则流量将被路由到默认后端。

3.资源后端

Resource 后端是一个引用,指向同一命名空间中的另一个 Kubernetes 资源,将其作为 Ingress 对象。 Resource 后端与 Service 后端是互斥的,在二者均被设置时会无法通过合法性检查。 Resource 后端的一种常见用法是将所有入站数据导向带有静态资产的对象存储后端。

4.Ingress类

Ingress 可以由不同的控制器实现,通常使用不同的配置。 每个 Ingress 应当指定一个类,也就是一个对 IngressClass 资源的引用。 IngressClass 资源包含额外的配置,其中包括应当实现该类的控制器名称。

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: external-lb
spec:
  controller: example.com/ingress-controller
  parameters:
    apiGroup: k8s.example.com
    kind: IngressParameters
    name: external-lb

IngressClass 中的 .spec.parameters 字段可用于引用其他资源以提供额外的相关配置。
参数(parameters)的具体类型取决于你在 .spec.controller 字段中指定的 Ingress 控制器

三、演练

演练使用kuboard内置IngressController,无需搭建,主要展示ingress规则及路由效果

1.创建资源

1.1deployment资源

[root@k8s-master ingress]# vim app-nginx.yaml    ##应用的yaml文件
apiVersion: apps/v1
kind: Deployment           ##资源类型deployment
metadata:
name: nginx-app            ##pod名称
namespace: test            ##名称空间
spec:
  replicas: 2              ##副本数
  selector:                
    matchLabels:           ##标签选择器
      app: nginx
  template:                ##以下是pod模板
    metadata:
      labels:
        app: nginx         ##给pod作标签
    spec:
      containers:
      - name: nginx        ##容器名称
        image: core.harbor.domain/test/nginx-1.16.1:v4    ##镜像版本
        ports:
        - containerPort: 80    ##容器端口

1.2service资源

apiVersion: v1 
kind: Service
metadata:
  name: nginx-app-svc        ##svc名称
  namespace: test            ##名称空间
spec:
  type: ClusterIP            ##用clusterIP模式
  ports:
  - protocol: TCP
    port: 80                 ##svc暴露的端口
    targetPort: 80           ##关联容器端口
  selector:
    app: nginx

1.3ingress资源

apiVersion: extensions/v1beta1  
kind: Ingress         
metadata:
  name: nginx-app-ingress  
  namespace: test 
  annotations:
spec:
  ingressClassName: nginx
  rules:                        
  - host: test.k8s.com       
    http:                  
      paths:             
      - path: /              
        backend:            
          serviceName: nginx-app-svc  
          servicePort: 80

1.4创建

[root@k8s-master ingress]# kubectl apply -f app-nginx.yaml
[root@k8s-master ingress]# kubectl apply -f service-nginx.yaml
[root@k8s-master ingress]# kubectl apply -f ingress-app.yaml

2.查看ingress注册情况

[root@k8s-master nginx-image]# kubectl get ingress -A
NAMESPACE   NAME                    CLASS    HOSTS                  ADDRESS      PORTS     AGE
harbor      harbor-ingress          nginx    core.harbor.domain     10.5.0.213   80, 443   64d
harbor      harbor-ingress-notary   <none>   notary.harbor.domain                80, 443   64d
test        nginx-app               nginx    test.k8s.com           10.5.0.213   80        6d3h
test        nginx-v1                nginx    ng-test.com            10.5.0.213   80        57d
test        nginx-v2                nginx    ng-test.com            10.5.0.213   80        57d
[root@k8s-master nginx-image]# kubectl get pod -n ingress-nginx
NAME                                              READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-nginx-6mnlh        0/1     Completed   0          64d
ingress-nginx-admission-patch-nginx-zvjpt         0/1     Completed   0          64d
ingress-nginx-controller-nginx-7549777f47-gxhfd   1/1     Running     0          64d
ingress-nginx-controller-nginx-7549777f47-nslfp   1/1     Running     0          64d
[root@k8s-master nginx-image]# kubectl exec -it  ingress-nginx-controller-nginx-7549777f47-gxhfd -n ingress-nginx -- /bin/bash
bash-5.1$
bash-5.1$ ls
fastcgi.conf            fastcgi_params.default  koi-win                 mime.types.default      nginx.conf              owasp-modsecurity-crs   template                win-utf
fastcgi.conf.default    geoip                   lua                     modsecurity             nginx.conf.default      scgi_params             uwsgi_params
fastcgi_params          koi-utf                 mime.types              modules                 opentracing.json        scgi_params.default     uwsgi_params.default
bash-5.1$ vim nginx.conf   // 详情见下图

在这里插入图片描述

3.访问测试

由于浏览器是走公网,使用的域名没有备案,所以被封了,可以在服务器上访问测试
服务器上配置host

[root@k8s-master nginx-image]# kubectl get svc -n ingress-nginx
NAME                                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller-admission-nginx   ClusterIP   10.106.130.250   <none>        443/TCP                      64d
ingress-nginx-controller-nginx             NodePort    10.105.158.159   <none>        80:30718/TCP,443:31427/TCP   64d
[root@k8s-master nginx-image]# cat /etc/hosts
::1     localhost       localhost.localdomain   localhost6      localhost6.localdomain6
127.0.0.1       localhost       localhost.localdomain   localhost4      localhost4.localdomain4

10.5.0.211      iZuf6i1h1s2lsfa536a42xZ iZuf6i1h1s2lsfa536a42xZ
10.5.0.211  k8s-master
10.5.0.212  k8s-node01
10.5.0.213  k8s-node02
10.5.0.214  k8s-node03
10.105.158.159  core.harbor.domain ng-test.com test.k8s.com
[root@k8s-master nginx-image]# curl test.k8s.com
10.244.58.241
[root@k8s-master nginx-image]# curl test.k8s.com
10.244.58.241
[root@k8s-master nginx-image]# curl test.k8s.com
10.244.58.242
[root@k8s-master nginx-image]# curl test.k8s.com
10.244.58.242

4.配置tls

4.1生成证书

参考:https://blog.csdn.net/weixin_43866248/article/details/129663815

4.2创建secret文件

[root@k8s-master CA]# base64 --wrap=0 ca.key	// 这个值要记录,填入secret的tls.key字段	
[root@k8s-master CA]# base64 --wrap=0 ca.crt	// 这个值要记录,填入secret的tls.crt字段
[root@k8s-master CA]# vim nginx-tls.yaml
apiVersion: v1
kind: Secret
metadata:
  name: nginx-tls
  namespace: test
type: kubernetes.io/tls
data:
  tls.crt: |
    LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLRENDQXhDZ0F3SUJBZ0lKQVBJcldIdFRpc3B5TUEwR0NTcUdTSWIzRFFFQkN3VUFNSDh4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlEQUpPV1RFUk1BOEdBMVVFQnd3SVRtVjNJRmx2Y21zeEZUQVRCZ05WQkFvTQpERVY0WVcxd2JHVXNJRXhNUXpFWU1CWUdBMVVFQXd3UFJYaGhiWEJzWlNCRGIyMXdZVzU1TVI4d0hRWUpLb1pJCmh2Y05BUWtCRmhCMFpYTjBRR1Y0WVcxd2JHVXVZMjl0TUI0WERUSXpNRGN4TXpFeU1EQXlOMW9YRFRNek1EY3gKTURFeU1EQXlOMW93ZnpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ01BazVaTVJFd0R3WURWUVFIREFoTwpaWGNnV1c5eWF6RVZNQk1HQTFVRUNnd01SWGhoYlhCc1pTd2dURXhETVJnd0ZnWURWUVFEREE5RmVHRnRjR3hsCklFTnZiWEJoYm5reEh6QWRCZ2txaGtpRzl3MEJDUUVXRUhSbGMzUkFaWGhoYlhCc1pTNWpiMjB3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN5V0RjOE11OVp3TFhWQkdYYTFWL0ZoVUJvZ0QxQgpCTGdjNzN2UUhUZGhTOVpjc29lRFozMkxhSExRZEV3cy9wdVNJVnJ6cGt0VlJwRElnS1A3YnZiNzFySHVHOWZTClZJQ3JXanROUHAyYjFVN0V6RW5lVnVzbnNDcTR4d1ArUTlJV0NnNEYrSEZ5ZFlCdVF2RXVKNzUrcTIwOWwxNnEKV3N1ekNZMGoyTVlOejhpN2NtdWlzNnlPSmc5eFpzb1dVbGJ5SjlCMWpOalkvZ3dzQ1FlRlFaeDdYd0UxV0RFVwpCSEs0WlpsUTNKbXoybkFvV2hyeVZ2eGVpVGp0VzJBUm5ja3NEQXZNcjMvUTA4V056TnN1OGhvWjd2K1UxUnBrCkRGUVlOVGNpMTFhRXdsYWVySzV6eTBzaERCT2hsemlOTWVKNnhmWjBaYkVZRnUrbkVZMlIrVjNkQWdNQkFBR2oKZ2FZd2dhTXdIUVlEVlIwT0JCWUVGTnh5Q2FyemRWUG5WbWhJSTlOQWdsMlVIV2VPTUI4R0ExVWRJd1FZTUJhQQpGTnh5Q2FyemRWUG5WbWhJSTlOQWdsMlVIV2VPTUFrR0ExVWRFd1FDTUFBd0N3WURWUjBQQkFRREFnV2dNQnNHCkExVWRFUVFVTUJLQ0VIZDNkeTUwWlhOMExXczRjeTVqYjIwd0xBWUpZSVpJQVliNFFnRU5CQjhXSFU5d1pXNVQKVTB3Z1IyVnVaWEpoZEdWa0lFTmxjblJwWm1sallYUmxNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFFV0pKcwo0U3pQVldadWM1N2F4MkFYNWYwOXVQdVlid1V1cUVNaDE5QTR6UndxOUhKWFlvb0Yza0NIanpzTzc0dUlNS0tuCnh3L2g4L1J3RERTZ0pnZDJIcnJuWWs1MWd1MVR4MnhkWmRKYjljV3hKU203ZFF2TTlZMmJMTmpmM2JIai94QVcKRDlhRThmOVhjRm11RTl4a1pqSStLYzVvMEZGWm44ZVVGR3ljRC9qN2tiQTdOWGZ1angxaCs5WFpBNXNxdUhIZApMUzArUEQ5U1lwRno4Zm9jTWVMdFk3L3dMa0ZLMXB2aG5DV0tubHZ3NHNoQkRDNlp6cS9zeS9uUWN1Z0VRRGZ5ClJoMWc5UGhycWNCK05lcjZRSXVKekU2RE9OaU4wa01sTm14aU1EOTFIemFVUExNaGd2bnBxMmRqbC9GOWxiaGQKazBPVzIwS2htTys5VmVMYgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  tls.key: |
    LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQ3lXRGM4TXU5WndMWFYKQkdYYTFWL0ZoVUJvZ0QxQkJMZ2M3M3ZRSFRkaFM5WmNzb2VEWjMyTGFITFFkRXdzL3B1U0lWcnpwa3RWUnBESQpnS1A3YnZiNzFySHVHOWZTVklDcldqdE5QcDJiMVU3RXpFbmVWdXNuc0NxNHh3UCtROUlXQ2c0RitIRnlkWUJ1ClF2RXVKNzUrcTIwOWwxNnFXc3V6Q1kwajJNWU56OGk3Y211aXM2eU9KZzl4WnNvV1VsYnlKOUIxak5qWS9nd3MKQ1FlRlFaeDdYd0UxV0RFV0JISzRaWmxRM0ptejJuQW9XaHJ5VnZ4ZWlUanRXMkFSbmNrc0RBdk1yMy9RMDhXTgp6TnN1OGhvWjd2K1UxUnBrREZRWU5UY2kxMWFFd2xhZXJLNXp5MHNoREJPaGx6aU5NZUo2eGZaMFpiRVlGdStuCkVZMlIrVjNkQWdNQkFBRUNnZ0VCQUp2SVRzYzR2cllwalNzN0lqVmF1TU55TithUVRmRWpUQ2VLVVI1aXh1TW8KT1dEVFdXZkEySHNUaTJibWp6dW1Vd0g4UE5RamFCNWUrMDBJZ1RTNW91Z3NpMU92NG4rSTdMUEFwNWc3bjdSbApTTjdDaTZ1NVJNTndNSUVpNWl3TjFjOEdqV1ZOdE5zRUpHRXIvRHdTMzJVS0hPdjE4dXpmVHB0Zk5uZ2ZmRERHCjMrQVUvUk9EMk02K3B4bXBZUzU4QlNXQzI4ZlN6cVRScVBSZ2dEUlVZNXlGTmJKd1dUaTlLcHNNdTM3M1ZxaEYKbldXZDhQZzd3ZmVlZzMzMU1tSmM5TlEwQWhXdngyNDU4ZGpsanVGR2FWLzdDVzRrTUtkZXBwTldZRnhhMkJZegplTldOTEF2YWxMMlE3bk5yN2tFR09ESkFOZkVwMCtpenBDQ0hudk1GVDRFQ2dZRUEyL2JwWnFsRHZaRDZWRldOCmY3ay9DczJNMFZWQTVTRHdmUGtOMUxKNENLdDQxQVJQYkJLMTFaYWJjb08wZXJ2d2pPTUhmNTd1V3F4c3l2OUIKcjlmUEtsZFBnUnhjSVhNNkNraEpDWHdoSE5Gb3dvd2krd3FWZUViZ2lQai82bm9FM0twc3c5MU5pQW1BMENEVApZVG5lKzBOUGlvRlBxRzVXY1h2L09lMk5RMjBDZ1lFQXo0L09yWTRMVXBwY2pCSlczZzNZWjE3RWI4ZXBFc2hiCk03WlhrN2VvZFdQVjlkazVLRWpzb0xuNDZxTXQ4ZkpnVEFaUThNaVl5TkduWk9LL1hPT1FnQUZhaUovRmJMUGQKNXJuWnJtQWY2RFcycmxSWU9XVmMyKzhjREpiamQ2b1BISHg1T0xDaG45RVY5THVkSnNUOU84VVBWWHhDVDJFNgphN1VWMmxvTmpqRUNnWUFBMXM1SkgvZ3NMdk5sZ3ZZSk9MR3UzdDNjcHBDYXp5ZGJzcStFMGpGM0J3QnMvcDgyCjhGTlZQei9VamdBUVA4dEpIa3lYQmdvdXVsMm40SlZsa0ZNdi9DbEhlczQzS25OY09xNWNwT2FUYjVFUXZPd2QKUFFzWTdGeEs2WGhBY3JxMkJNaHBidHl1MmlwdG9OSnRtb1RwUEhaL05zTVJCMnE1QUJvWEpIclhlUUtCZ0ZqeApBNXhsT0w3ZHZIaWRSeklCOXRCYzBJb2hvWGFWK2xiUGRQbXNnbmhESHFVcHZ3OWZLRjY3TWtuQlFPZmpkNVk4ClFxVGJJSFUxT2FqR2JUL3RsN2J5WFl3Y0FxcFE3TzU0aHluc3NOOTlYTm1ZOVBFcldUNDVXT2lnSTdyY1dYdFkKYjAxMml0dUQ2Z2VqK1hScWh5VDhqVlNSV1l6UVdndGJYcERoYzl1UkFvR0FIaEZ2eHZSN1A3WnBWNWd0c3dpMwpQRytkdVdTQ1Jod2pGeXVlS1J3bmFCc0J6TC9oUStmNTlvU3JQM2Q4T254VnBWNTZOcWp3dkhNeW9ZOFVLK3ZDCmVmbVF2bnJXeFBORnpiVHhsNUpXdG5zWkhIems1M091VGxHSWRhT2VtQXRaMktVd2pNcSsyZFFBNjE2L1NRaHcKNVllQ2t4c2RETzlMcEdUY01oa2FuWEk9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K
[root@k8s-master CA]# kubectl apply -f nginx-tls.yaml
secret/nginx-tls created

4.3修改ingress

apiVersion: extensions/v1beta1  
kind: Ingress         
metadata:
  name: nginx-app-ingress  
  namespace: test 
  annotations:
spec:
  tls:							// 添加
  - hosts:						// 添加
    - test.k8s.com				// 添加
    secretName: nginx-tls		// 添加
  ingressClassName: nginx
  rules:                        
  - host: test.k8s.com       
    http:                  
      paths:             
      - path: /              
        backend:            
          serviceName: nginx-app-svc  
          servicePort: 80
[root@k8s-master test]# kubectl edit ingress nginx-app -n  test
ingress.networking.k8s.io/nginx-app edited

4.4https访问测试

[root@k8s-master test]# curl -k  https://test.k8s.com
10.244.58.242
[root@k8s-master test]# curl -k  https://test.k8s.com
10.244.58.242
[root@k8s-master test]# curl -k  https://test.k8s.com
10.244.58.241
[root@k8s-master test]# curl -k  https://test.k8s.com
10.244.58.241
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐