Skip to content

Commit 0ca9dd0

Browse files
ingress
增加ingress代理说明
1 parent 2a88eca commit 0ca9dd0

File tree

1 file changed

+248
-0
lines changed

1 file changed

+248
-0
lines changed

k8s/ingress.md

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
2+
3+
4+
5+
6+
7+
8+
9+
## nginx ingress
10+
### nginx ingress redirect
11+
```yaml
12+
[root@K8S-master01 5.4]# kubectl create -f redirect.yaml
13+
ingress.extensions/redirect created
14+
[root@K8S-master01 5.4]# cat redirect.yaml
15+
apiVersion: extensions/v1beta1
16+
kind: Ingress
17+
metadata:
18+
annotations:
19+
nginx.ingress.kubernetes.io/permanent-redirect: https://www.baidu.com
20+
name: redirect
21+
namespace: default
22+
spec:
23+
rules:
24+
- host: nginx.redirect.com
25+
http:
26+
paths:
27+
- path: /
28+
backend:
29+
serviceName: nginx-v2
30+
servicePort: 80
31+
```
32+
使用curl访问 `nginx.redirect.com` 会被重定向到 `https://www.baidu.com`
33+
34+
35+
### nginx ingress rewrite
36+
Rewrite主要用于地址重写,比如访问 `nginx.test.com/rewrite` 跳转到 `nginx.test.com` ,访问 `nginx.test.com/rewrite/foo` 会跳转到 `nginx.test.com/foo` 等。
37+
38+
```yaml
39+
apiVersion: extensions/v1beta1
40+
kind: Ingress
41+
metadata:
42+
annotations:
43+
nginx.ingress.kubernetes.io/rewrite-target: /$1
44+
name: rewrite
45+
namespace: default
46+
spec:
47+
rules:
48+
- host: nginx.test.com
49+
http:
50+
paths:
51+
- backend:
52+
serviceName: nginx-v2
53+
servicePort: 80
54+
# 或者 /rewrite(/|$)(.*)
55+
path: /rewrite/?(.*)
56+
```
57+
58+
要使用 Kubernetes Ingress 和 NGINX Ingress 控制器实现 URL 重写(将 `/rewrite/data` 重写到 `/data`),你需要配置 `nginx.ingress.kubernetes.io/rewrite-target` 注解。以下是实现此功能的 Ingress YAML 配置示例:
59+
60+
```yaml
61+
apiVersion: networking.k8s.io/v1
62+
kind: Ingress
63+
metadata:
64+
name: rewrite-ingress
65+
namespace: default
66+
annotations:
67+
nginx.ingress.kubernetes.io/rewrite-target: /$1
68+
spec:
69+
rules:
70+
- http:
71+
paths:
72+
- path: /rewrite(/|$)(.*)
73+
pathType: Prefix
74+
backend:
75+
service:
76+
name: your-service-name
77+
port:
78+
number: 80
79+
```
80+
81+
解释:
82+
- **`annotations`**:
83+
- `nginx.ingress.kubernetes.io/rewrite-target: /$1`: 这个注解告诉 NGINX Ingress 控制器将匹配的路径重写为 `$1` 变量的内容。这里的 `$1` 是正则表达式中的第一个捕获组。
84+
85+
- **`path: /rewrite(/|$)(.*)`**:
86+
- 这个路径定义了一个正则表达式,用于匹配以 `/rewrite` 开头的请求。
87+
- `(/|$)`: 匹配 `/` 或者路径结束,确保 `/rewrite` 后面可以是 `/` 或者为空。
88+
- `(.*)`: 捕获 `/rewrite` 后面的所有内容,并将其作为 `$1` 传递给 `rewrite-target`。
89+
90+
- **`pathType: Prefix`**:
91+
- 表示该路径是基于前缀匹配的。任何以 `/rewrite` 开头的路径都会被匹配。
92+
93+
- **`backend`**:
94+
- 定义了请求最终会被代理到的服务 (`your-service-name`) 和端口 (`80`)。
95+
96+
97+
### nginx ingress错误代码重定向
98+
本节主要演示当访问链接返回值为404、503等错误时,如何自动跳转到自定义的错误页面
99+
100+
### nginx ingress SSL
101+
配置之后实现自动跳转HTTPS
102+
103+
### nginx ingress 匹配请求头
104+
105+
以下是您提供的图片中的文本内容:
106+
107+
```yaml
108+
[root@K8S-master01 5.7]# kubectl create -f snippet.yaml
109+
ingress.extensions/snippet created
110+
[root@K8S-master01 5.7]# cat snippet.yaml
111+
apiVersion: extensions/v1beta1
112+
kind: Ingress
113+
metadata:
114+
annotations:
115+
nginx.ingress.kubernetes.io/server-snippet: |
116+
set $agentflag 0;
117+
if ($http_user_agent ~* "iPhone" ) {
118+
set $agentflag 1;
119+
}
120+
if ( $agentflag = 1 ) {
121+
return 301 http://nginx.test.com;
122+
}
123+
name: snippet
124+
namespace: default
125+
spec:
126+
rules:
127+
- host: nginx.snippet.com
128+
http:
129+
paths:
130+
- path: /
131+
backend:
132+
serviceName: nginx-v2
133+
servicePort: 80
134+
```
135+
136+
解释:
137+
- **`annotations`**:
138+
- `nginx.ingress.kubernetes.io/server-snippet`: 这个注解允许你在 NGINX 配置中插入自定义的配置片段。在这个例子中,它用于根据用户代理(User-Agent)重定向 iPhone 用户到 `http://nginx.test.com`。
139+
140+
- **`name: snippet`**: 定义了 Ingress 资源的名称。
141+
142+
- **`namespace: default`**: 指定了 Ingress 资源所在的命名空间。
143+
144+
- **`spec.rules`**: 定义了 Ingress 的路由规则。
145+
- `host: nginx.snippet.com`: 指定该规则适用于 `nginx.snippet.com` 域名。
146+
- `path: /`: 指定路径为根路径 `/`。
147+
- `backend.serviceName: nginx-v2` 和 `servicePort: 80`: 指定请求将被转发到名为 `nginx-v2` 的服务的 80 端口。
148+
149+
### nginx ingress基本认证
150+
有些网站可能需要通过密码来访问,对于这类网站可以使用Nginx的basic-auth设置密码访问,具体方法如下。
151+
```bash
152+
[root@K8S-master01 5.8]# htpasswd -c auth foo
153+
New password:
154+
Re-type new password:
155+
Adding password for user foo
156+
[root@K8S-master01 5.8]# cat auth
157+
foo:$apr1$okma2fx9$hdTJ.KFmi4pY9T6a2MjeS1
158+
```
159+
基于之前创建的密码创建Secret:
160+
```bash
161+
[root@K8S-master01 5.8]# kubectl create secret generic basic-auth
162+
--from-file=auth
163+
secret/basic-auth created
164+
```
165+
166+
```bash
167+
[root@K8S-master01 5.8]# kubectl create -f test-auth.yaml
168+
ingress.extensions/ingress-with-auth created
169+
```
170+
创建完成之后,再访问对应的uri就会弹出登录验证窗口
171+
172+
### Nginx Ingress黑/白名单
173+
```yaml
174+
apiVersion: extensions/v1beta1
175+
kind: Ingress
176+
metadata:
177+
name: ingress-with-auth
178+
annotations:
179+
nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.10.129
180+
# type of authentication
181+
nginx.ingress.kubernetes.io/auth-type: basic
182+
# name of the secret that contains the user/password definitions
183+
nginx.ingress.kubernetes.io/auth-secret: basic-auth
184+
# message to display with an appropriate context why the authentication is required
185+
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
186+
spec:
187+
rules:
188+
- host: nginx.auth.com
189+
http:
190+
paths:
191+
- path: /
192+
backend:
193+
serviceName: nginx
194+
servicePort: 80
195+
```
196+
197+
解释:
198+
- **`apiVersion: extensions/v1beta1`**: 指定使用的 API 版本。注意,这个版本在较新的 Kubernetes 版本中已经被弃用,建议使用 `networking.k8s.io/v1`。
199+
- **`kind: Ingress`**: 表示这是一个 Ingress 资源。
200+
- **`metadata.name: ingress-with-auth`**: 定义了 Ingress 资源的名称。
201+
- **`annotations`**:
202+
- `nginx.ingress.kubernetes.io/whitelist-source-range`: 设置允许访问的 IP 地址范围。
203+
- `nginx.ingress.kubernetes.io/auth-type`: 指定认证类型为基本认证(basic)。
204+
- `nginx.ingress.kubernetes.io/auth-secret`: 引用包含用户名和密码定义的 Secret 名称。
205+
- `nginx.ingress.kubernetes.io/auth-realm`: 设置认证提示信息。
206+
- **`spec.rules`**: 定义了 Ingress 的路由规则。
207+
- `host: nginx.auth.com`: 指定该规则适用于 `nginx.auth.com` 域名。
208+
- `http.paths`: 定义路径规则。
209+
- `path: /`: 指定根路径 `/`。
210+
- `backend.serviceName: nginx` 和 `servicePort: 80`: 指定请求将被转发到名为 `nginx` 的服务的 80 端口。
211+
212+
使用说明:
213+
此配置创建了一个带有基本认证的 Ingress 资源,只有来自 `192.168.10.129` 的请求才能访问 `nginx.auth.com`,并且需要通过基本认证才能访问。认证信息存储在名为 `basic-auth` 的 Secret 中。
214+
215+
### Nginx Ingress速率限制
216+
有时候可能需要限制速率以降低后端压力,此时,可以使用Nginx的ratelimit进行配置,具体方法如下
217+
```yaml
218+
# 限制每秒的连接,单个 IP:
219+
nginx.ingress.kubernetes.io/limit-rps:
220+
# 限制每分钟的连接,单个 IP:
221+
nginx.ingress.kubernetes.io/limit-rpm:
222+
# 限制客户端每秒传输的字节数 单位为 K:
223+
nginx.ingress.kubernetes.io/limit-rate:
224+
```
225+
226+
227+
```yaml
228+
apiVersion: networking.k8s.io/v1
229+
kind: Ingress
230+
metadata:
231+
name: example-ingress
232+
annotations:
233+
nginx.ingress.kubernetes.io/limit-rps: "5"
234+
nginx.ingress.kubernetes.io/limit-rpm: "300"
235+
nginx.ingress.kubernetes.io/limit-rate: "100"
236+
spec:
237+
rules:
238+
- host: example.com
239+
http:
240+
paths:
241+
- path: /
242+
pathType: Prefix
243+
backend:
244+
service:
245+
name: example-service
246+
port:
247+
number: 80
248+
```

0 commit comments

Comments
 (0)