【k8s系列十四】Nginx进行BasicAuth验证

391 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

image

然后会在当前目录生成一个文件auth

image

第二步:将授权信息添加为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

image

第六步:浏览器请求

http://www.auth.com:30201

image

输入:lxl/ 123456

image

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.

image

案例: 强制地址跳转

在这里, 我们让流量跳转到百度

第一步: 准备资源文件

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

image

第四步: 浏览器访问

浏览器访问redirect.lxl.com:30201会自动跳转到www.baidu.com

ingress的相关内容就结束了。