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 上。
刚刚说了 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 控制器。