貔貅云原生

貔貅云原生

Ingress

105
0
0
2023-12-05
Ingress

Ingress

编写一个简单的 Ingress 编排文件

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: jixingxing.student.cn    # 域名
      http:
        paths:
          - path: /app1      # 路径
            pathType: Prefix  # 路径类型,可以是 "Prefix" 或 "Exact"
            backend:
              service:
                name: nginx-test-01   # 目标服务的名称
                port:
                  number: 80           # 目标服务的端口号

Ingress 用于管理集群中的入站网络流量。它的主要目的是为了简化在 Kubernetes 集群中管理和暴露 HTTP 和 HTTPS 服务的方式,同时提供一种统一的方式来控制流量路由、负载均衡、SSL/TLS 终端和路径基础的请求转发。
简单来讲就是一个 nginx 服务,提供在集群外部通过域名访问 Kubernetes 集群内部服务,省略 Service 暴露到外边的问题,以及流量统一管理

部署编排文件

[root@kube01 ingress]# kubectl apply -f ingress.yaml
ingress.networking.k8s.io/my-ingress created

在集群外部通过域名访问,可以选择配置/etc/hosts,或者直接添加请求Handle

[root@telegraf01 ~]#  curl -H host:jixingxing.student.cn http://192.168.17.42:30327/app1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

在访问时添加了端口30327,这个是 Ingress 服务暴露的 NodePort

[root@kube01 ~]# kubectl get svc -n kube-system
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.254.120.12    <none>        80:30327/TCP,443:31336/TCP   65m
ingress-nginx-controller-admission   ClusterIP   10.254.209.202   <none>        443/TCP                      168d

说白了就是使用 Ingress 后,服务的 Service 不需要暴露 NodePort 了

在使用 Ingress 后,访问服务的流量不会经过 Service 了,Ingress 会监测 Service 与 Endpoint,在请求进来后,Ingress 会watch Service 对应的 Endpoint,直接把流量转发到对应的 Pod 上。

image-bumb.png

刚刚说了 Ingress 就是 Nginx,配置 Ingress 编排文件就相当于配置 Nginx,可以通过日志看出来,通过把配置文件编排进去后进行 reload 操作

I0824 07:58:56.338568       7 leaderelection.go:258] successfully acquired lease kube-system/ingress-controller-leader
I0824 07:58:56.338805       7 status.go:84] "New leader elected" identity="ingress-nginx-controller-7ffc675759-lm7wv"
I0824 07:58:56.347079       7 status.go:299] "updating Ingress status" namespace="default" ingress="my-ingress" currentValue=[] newValue=[{IP:10.254.230.235 Hostname: Ports:[]}]
I0824 07:58:56.350567       7 event.go:285] Event(v1.ObjectReference{Kind:"Ingress", Namespace:"default", Name:"my-ingress", UID:"7b073ece-e4b7-4c00-a859-e025c9afd480", APIVersion:"networking.k8s.io/v1", ResourceVersion:"15888363", FieldPath:""}): type: 'Normal' reason: 'Sync' Scheduled for sync
I0824 07:58:56.380685       7 controller.go:183] "Backend successfully reloaded"

编配的配置文件会配置到 Ingress 服务的/etc/nginx/nginx.conf下面

kubectl exec -it ingress-nginx-controller-7ffc675759-lm7wv -n kube-system  -- cat /etc/nginx/nginx.conf

编排配置文件

Ingress 编排文件可以做更多高级配置,比如限流之类的,下面是 Ingress 常见高级操作,可以通过编写在annotations中实现

Kubernetes Ingress 具有许多可用的注解(annotations),它们允许您在 Ingress 资源上添加额外的元数据或指令,以定制和控制 Ingress 控制器的行为。这些注解可以影响流量的路由、负载均衡、SSL/TLS 配置以及其他与 Ingress 相关的设置。以下是一些常见的 Ingress 注解示例:

  • nginx.ingress.kubernetes.io/rewrite-target: 该注解用于指定重写 URL 路径的规则,可用于将请求转发到不同的路径上。

  • nginx.ingress.kubernetes.io/ssl-redirect: 如果设置为 "true",将启用 HTTP 到 HTTPS 的重定向。

  • nginx.ingress.kubernetes.io/backend-protocol: 指定后端服务之间的协议(如 HTTP、HTTPS、GRPC)。

  • nginx.ingress.kubernetes.io/ssl-passthrough: 如果设置为 "true",将启用 SSL/TLS 透传,用于将 SSL/TLS 流量直接传递到后端服务。

  • nginx.ingress.kubernetes.io/ssl-protocols: 指定支持的 SSL/TLS 协议。

  • nginx.ingress.kubernetes.io/proxy-buffer-size: 设置代理缓冲区大小。

  • nginx.ingress.kubernetes.io/proxy-body-size: 设置允许的请求主体大小。

  • nginx.ingress.kubernetes.io/affinity: 设置会话保持的亲和性策略。

  • nginx.ingress.kubernetes.io/whitelist-source-range: 设置允许访问的 IP 地址范围。

  • kubernetes.io/ingress.class: 指定要使用的 Ingress 控制器类别,用于区分不同的 Ingress 控制器。