持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
Nginx进行BasicAuth验证
进行nginx的basicAuth验证, 需要在ingress中添加一些参数, 在metadata中添加 annotations 参数
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-with-auth
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
这个参数的含义是什么呢? 我们和k8s的label标签来比对说:
- label标签和k8s官方提供的, 很多关联关系是通过标签匹配的.
- 而annotations 是k8s的ingress和nginx的一种约定, 这个约定的作用是什么呢?比如加了上面的3行, 就表示要进行权限验证. 这是一种约定.
官方定义的和约定的区别是: 官方定义的只要你使用k8s都生效. 约定就在特定场景生效. annotations就在ingress和nginx之间生效. 如果换一种七层服务代理那就不生效了.
下面来看看如何设置权限验证.
第一步: 安装httpd, 设置账号密码
yum -y install httpd
htpasswd -c auth lxl
第二个命令的含义:
- -c: create创建的意思。
- auth:创建授权账号
- lxl:授权账号的名称是lxl。 然后设置账号密码为123456
然后会在当前目录生成一个文件auth
第二步:将授权信息添加为k8s对象
kubectl create secret generic basic-auth --from-file=auth
- secret: 创建一个秘钥对象
- generic: 秘钥的类型是普通类型
- basic-auth: 给秘钥起个名字叫 basic-auth
- --from-file=auth: 表示基于auth文件进行添加, 这里auth指的就是上面生成的文件
注意:在哪里生成的auth文件,就在那里执行上面的命令。负责要带路径。
第三步:准备资源文件
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-with-auth
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - lxl'
spec:
rules:
- host: auth.lxl.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
-
ingress的名称是ingress-with-auth
-
annotations: 增加约定信息. 有了下面三个表示需要权限验证
- nginx.ingress.kubernetes.io/rewrite-target: / 必须设置, 当有多个ingress的时候, 就需要配置, 否则访问会报错
- nginx.ingress.kubernetes.io/auth-type:权限验证的类型
- nginx.ingress.kubernetes.io/auth-secret:秘钥的名字
- nginx.ingress.kubernetes.io/auth-realm: 权限验证的提示信息
-
ingress访问的域名是auth.lxl.com
-
ingress代理的svc是nginx-svc, 端口号是80
第四步: 执行资源清单
kubectl apply -f ingress-auth.yaml
第五步: 配置host
第六步:浏览器请求
http://www.auth.com:30201
输入:lxl/ 123456
Nginx重写
| 名称 | 描述 | 值 |
|---|---|---|
| nginx.ingress.kubernetes.io/rewrite-target | 必须重定向流量的目标URI | 串 |
| nginx.ingress.kubernetes.io/ssl-redirect | 指示位置部分是否仅可访问SSL(当Ingress包含证书时默认为True) | 布尔 |
| nginx.ingress.kubernetes.io/force-ssl-redirect | 即使Ingress未启用TLS,也强制重定向到HTTPS | 布尔 |
| nginx.ingress.kubernetes.io/app-root | 定义Controller必须重定向的应用程序根,如果它在'/'上下文中 | 串 |
| nginx.ingress.kubernetes.io/use-regex | 指示Ingress上定义的路径是否使用正则表达式 | 布尔 |
- rewrite-target : 表示你访问主机,想要跳转到哪里
- ssl-redirect: 是否仅接收ssl请求. 如果是, 那么http请求将不允许跳转到https, 也就是不允许http请求. 强制https
- force-ssl-redirect: 如果未启用TLS, 也强制跳转到https. 自动做地址跳转到https
- app-root: 可以定义一个根目录的前缀,之前都是"/"作为根目录,也可以改成其他. ingress会反向代理到svc, 这个svc的根一定是ingress代理的根么,不一定.所以可以修改.
- use-regex: 指示Ingress上定义的路径是否使用正则表达式
举个例子: 上面我们配置了https加密的ingress,我们在访问的时候, 通过域名www.lxl.com:32110访问. 如果这时我们在浏览器直接输入www.lxl.com:30201会怎么样呢? ps: 32110是ingress对应的svc的443端口, 30201是ingress对应的svc的80端口.
http://www.lxl.com:30201
当我们在浏览器输入这个地址的时候, 会怎么样呢? 如下图, 直接跳转到www.lxl.com. 访问请求是没找到. 为什么没找到呢? 因为默认http跳转过来的https的端口是443, 而我们这里没有配443端口,而是32110.
案例: 强制地址跳转
在这里, 我们让流量跳转到百度
第一步: 准备资源文件
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-redirect
annotations:
nginx.ingress.kubernetes.io/rewrite-target: https://www.baidu.com
spec:
rules:
- host: redirect.lxl.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc-v2
port:
number: 80
- 这里面设置了域名跳转. 当我们访问 redirect.lxl.com 的时候, 会自动跳转到 www.baidu.com
第二步: 运行资源文件
kubectl apply -f ingress-redirect.yaml
第三步: 修改宿主机host
第四步: 浏览器访问
浏览器访问redirect.lxl.com:30201会自动跳转到www.baidu.com
ingress的相关内容就结束了。