一、环境准备¶
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的证书。
生产环境对外的服务一般需要配置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

6.环境复原
k delete -f ingress-ssl.yaml
三、域名添加用户名密码认证¶
针对网站需要通过密码来访问的情况,我们可以使用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


7.环境复原
k delete -f ingress-with-auth.yaml