一、环境准备

1、创建Namespace

kubectl create ns study-ingress

2、创建一个 Nginx 模拟 Web 服务

k create deploy nginx --image=registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2 -n study-ingress

3、创建service

kubectl expose deploy nginx --port 80 -n study-ingress

4、没有证书可以使用Openssl生成一个证书(此步骤可忽略),下面环境采用阿里云ssl证书

[root@k8s-master01 ~]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginx.test.com"

上面参数说明:

  • openssl: OpenSSL是一个开源的加密工具库,用于进行加密、解密和生成证书等操作
  • req: 命令选项,用于执行证书请求相关的操作
  • -x509: 命令选项,表示生成自签名的X.509证书,而不是创建证书签署请求(CSR)
  • -nodes: 命令选项,表示在生成私钥时不加密密钥。这样生成的私钥文件不会有密码保护,这在Nginx中使用TLS证书时很常见,因为Nginx需要使用未加密的私钥
  • -days 365: 命令选项,设置证书的有效期为365天,即一年
  • -newkey rsa:2048: 命令选项,表示同时生成一个新的RSA 2048位的私钥
  • -keyout tls.key: 命令选项,指定生成的私钥保存在名为tls.key的文件中
  • -out tls.crt: 命令选项,指定生成的自签名证书保存在名为tls.crt的文件中
  • -subj "/CN=nginx.test.com": 命令选项,设置证书的主题(Subject),其中包含了证书的通用名称(Common Name,简称CN)。这里将通用名称设置为nginx.test.com,这意味着该证书将用于nginx.test.com域名

生成tls.crt和tls.key文件

[root@k8s-master01 ~]#  ls
tls.crt  tls.key

二、使用 HTTPS 发布服务

生产环境对外的服务, 一般需要配置 https协议,使用 Ingress 也可以非常方便的添加https的证书。

Ingress官网关于TLS/Https说明

生产环境对外的服务一般需要配置HTTPS协议,使用Ingress也可以非常方便地添加HTTPS的证书。下面进行添加HTTPS证书演示:

1.创建tls类型的secret

[root@k8s-master01 ~]# kubectl create secret tls ca-secret --cert=test.zhang-qing.com.crt --key=test.zhang-qing.com.key -n study-ingress

[root@k8s-master01 day012]# kubectl get secret -n study-ingress
NAME        TYPE                DATA   AGE
ca-secret   kubernetes.io/tls   2      7s

2.配置 Ingress 添加 TLS 配置

[root@k8s-master01 ~]# vim ingress-ssl.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  creationTimestamp: null
  name: nginx-ingress
  namespace: study-ingress
  # annotations:
   # kubernetes.io/ingress.class: nginx
spec:
  ingressClassName: nginx # for k8s >= 1.22+
  rules:
  - host: test.zhang-qing.com
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific
  tls:
  - hosts:
    - test.zhang-qing.com
    secretName: ca-secret

上面参数说明:

  • hosts:证书所授权的域名列表
  • secretName:证书的Secret名字

说明:1.22+版本的k8s需要配置ingressClassName

3.更新该Ingress

[root@k8s-master01 ~]# kaf ingress-ssl.yaml

4.使用curl进行测试,域名已经被重定向到 https

[root@k8s-master01 day012]# curl -H "Host:test.zhang-qing.com" 10.0.0.22 -I  -k
HTTP/1.1 308 Permanent Redirect
Date: Wed, 19 Mar 2025 00:24:04 GMT
Content-Type: text/html
Content-Length: 164
Connection: keep-alive
Location: https://test.zhang-qing.com

打开浏览器,输入test.zhang-qing.com查看到被重定向到 https://nginx.test.com

image-20250319082458062

6.环境复原

k delete -f ingress-ssl.yaml

三、域名添加用户名密码认证

Ingress官网Basic相关说明

针对网站需要通过密码来访问的情况,我们可以使用Nginx的basic-auth设置密码访问。下面进行相关演示:

1.由于需要使用htpasswd工具,需要安装 httpd

[root@k8s-master01 ~]# yum install httpd -y

2.使用 htpasswd 创建 foo 用户的密码

[root@k8s-master01 study-ingress]#  htpasswd -c auth foo
New password: 123
Re-type new password: 123
Adding password for user foo

上面参数说明:

  • htpasswd:这是命令行实用程序,用于管理 Apache 中的 HTTP 基本认证用户密码文件
  • -c:这个标志表示我们要创建一个新的密码文件。如果同名的文件已经存在,它将被覆盖
  • auth:这是密码文件的名称。在这种情况下,密码文件将被命名为 "auth"
  • foo:这是您要在密码文件中为其创建密码条目的用户名。执行命令后,系统会提示您输入 "foo" 用户的密码

查看生成的密码

[root@k8s-master01 ~]# cat auth
foo:$apr1$2AnMQs9G$OXZuCuYEUE8YjSMPf.be7/

3.基于之前创建的密码文件创建 Secret

[root@k8s-master01 ~]# kubectl create secret generic basic-auth --from-file=auth -n study-ingress

4.创建包含密码认证的 Ingress

[root@k8s-master01 ~]# vim ingress-with-auth.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
# kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-realm: Please Input Your Username and Password
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-type: basic
  name: ingress-with-auth
  namespace: study-ingress
spec:
  ingressClassName: nginx # for k8s >= 1.22+
  rules:
  - host: test.zhang-qing.com
    http:
      paths:
      - backend:
          service:
            name: nginx
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific

上面参数说明:

  • nginx.ingress.kubernetes.io/auth-realm: 设置基本认证提示信息,当用户访问该 Ingress 时,会要求输入用户名和密码
  • nginx.ingress.kubernetes.io/auth-secret: 指定用于存储加密的用户名和密码的 Secret 名称。在这里,Secret 名称为 "basic-auth",里面应该包含用户名和密码的信息
  • nginx.ingress.kubernetes.io/auth-type: 指定认证类型为基本认证 (basic)

5.创建该 Ingress,并访问测试

[root@k8s-master01 day012]# kaf ingress-with-auth.yaml

[root@k8s-master01 day012]# curl -H "Host:test.zhang-qing.com" 10.0.0.22 -I

HTTP/1.1 401 Unauthorized
Date: Wed, 19 Mar 2025 00:31:30 GMT
Content-Type: text/html
Content-Length: 172
Connection: keep-alive
WWW-Authenticate: Basic realm="Please Input Your Username and Password"

上面curl参数说明:

  • -H 参数可以设置请求头
  • -I 标志用于发出 HEAD 请求,只会检索响应头部,而不包含响应主体

6.打开浏览器,输入test.zhang-qing.com进行访问。输入账号和密码即可来到nginx登录界面。这里账号为foo,密码为123

Ingress Nginx基本认证-1

Ingress Nginx基本认证-2

7.环境复原

k delete -f ingress-with-auth.yaml