k8s 对外服务之 Ingress(HTTPS/HTTP 代理访问 以及Nginx 进行 BasicAuth )
目录一Ingress HTTP 代理访问虚拟主机(一)原理(二)实验1,准备2,创建虚拟主机1资源3,创建虚拟主机2资源4,创建ingress资源5,查看相关参数6,测试访问二IngressHTTPS 代理访问(一)理论(二) 实验1,准备2,创建ssl证书3,创建 secret 资源进行存储 3.1 创建Secret资源编辑3.2 获取Secret资源信息3.3查看Secret资源4, 创建
目录
4, 创建 deployment、Service、Ingress Yaml 资源
2, 生成用户密码认证文件,创建 secret 资源进行存储
一 Ingress HTTP 代理访问虚拟主机
(一)原理
Ingress HTTP 代理访问虚拟主机,使用同一个nginx-ingress-controller,根据不同的域名,代理到不同的后端服务
例如访问www.china.com触发规则后,代理到service-01;访问www.zg.com触发规则二
Ingress可以基于虚拟主机进行配置。虚拟主机是一种特殊的软硬件技术,可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供web服务。Ingress可以将Ingress配置为提供服务外部可访问的URL、负载均衡流量、终止SSL/TLS并提供基于名称的虚拟主机。
(二)实验
1,准备
mkdir /opt/ingress-nodeport/vhost
cd /opt/ingress-nodeport/vhost
2,创建虚拟主机1资源
在Kubernetes集群中创建一个名为deployment1
的Deployment和一个名为svc-1
的Service。
vim deployment1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment1
spec:
replicas: 2
selector:
matchLabels:
name: nginx1
template:
metadata:
labels:
name: nginx1
spec:
containers:
- name: nginx1
image: soscscs/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: nginx1
kubectl apply -f deployment1.yaml #启动主机1资源
3,创建虚拟主机2资源
vim deployment2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment2
spec:
replicas: 2
selector:
matchLabels:
name: nginx2
template:
metadata:
labels:
name: nginx2
spec:
containers:
- name: nginx2
image: soscscs/myapp:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: nginx2
kubectl apply -f deployment2.yaml #启动主机2资源
4,创建ingress资源
vim ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress1
spec:
rules:
- host: www01.zzz.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-1
port:
number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress2
spec:
rules:
- host: www02.zzz.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: svc-2
port:
number: 80
在该文件中定义了两个Ingress资源,ingress1和ingress2。
ingress1配置了一个规则,当访问www01.zzz.com时,流量将被路由到名为svc-1的服务的端口80。
ingress2配置了一个规则,当访问www02.zzz.com时,流量将被路由到名为svc-2的服务的端口80。
kubectl apply -f ingress-nginx.yaml
5,查看相关参数
可以看到对外的端口是31101
[root@master01 vhost]#kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
deployment1 2/2 2 2 16m
deployment2 2/2 2 2 16m
[root@master01 vhost]#kubectl get pod,svc -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/deployment1-c8d988f6c-mtnfb 1/1 Running 0 16m 10.244.1.18 node01 <none> <none>
pod/deployment1-c8d988f6c-p27db 1/1 Running 0 16m 10.244.2.12 node02 <none> <none>
pod/deployment2-5588d5cdcd-77pnj 1/1 Running 0 16m 10.244.2.13 node02 <none> <none>
pod/deployment2-5588d5cdcd-krltr 1/1 Running 0 16m 10.244.1.19 node01 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24m <none>
service/svc-1 ClusterIP 10.96.105.191 <none> 80/TCP 16m name=nginx1
service/svc-2 ClusterIP 10.96.171.171 <none> 80/TCP 16m name=nginx2
[root@master01 vhost]#kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress1 <none> www01.zzz.com 10.96.67.162 80 15m
ingress2 <none> www02.zzz.com 10.96.67.162 80 15m
nginx-ingress-test <none> www.china.com 10.96.67.162 80 4h58m
nginx-vhost-ingress <none> www.chinese.com,www.zg.com 10.96.67.162 80 179m
[root@master01 vhost]#kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.96.67.162 <none> 80:31101/TCP,443:30796/TCP 5h39m
6,测试访问
做页面
做映射
访问测试
二 Ingress HTTPS 代理访问
(一)理论
在Kubernetes集群中配置HTTPS代理访问通常涉及以下步骤:
- 获取或生成SSL/TLS证书和私钥。
- 将证书和私钥文件放置在集群节点可以访问的位置,例如您刚刚创建的https目录。
- 创建Ingress资源的YAML配置文件,指定SSL/TLS证书和私钥的位置,以及需要启用HTTPS的虚拟主机规则。
一旦这些步骤完成,就可以使用kubectl apply命令应用Ingress配置,从而启用HTTPS代理访问。这将允许外部用户通过安全的HTTPS连接访问您的服务
(二) 实验
1,准备
mkdir /opt/ingress-nodeport/https
cd /opt/ingress-nodeport/https
2,创建ssl证书
生成一个自签名的TLS证书,用于在实验中配置HTTPS代理访问时使用
一般的话去你买域名的网站,下载
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/0=nginxsvc"
# -x509:表示生成自签名的证书。
# -sha256:表示使用SHA-256算法进行证书签名。
# -nodes:表示生成的私钥不加密。
# -days 365:表示证书的有效期为365天。
# -newkey rsa:2048:表示生成一个2048位的RSA私钥。
# -keyout tls.key:表示将生成的私钥保存到名为tls.key的文件中。
# -out tls.crt:表示将生成的证书保存到名为tls.crt的文件中。
# -subj "/CN=nginxsvc/O=nginxsvc":表示指定证书的主题信息,其中/CN表示Common Name(通用名称),/O表示Organization(组织)。
3,创建 secret 资源进行存储
3.1 创建Secret资源
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
命令详细解释如下:
kubectl
: 这是与Kubernetes集群进行交互的命令行工具。
create
: 这个子命令告诉kubectl去创建一个新的资源对象。
secret
: 指定要创建的资源类型为“secret”。Kubernetes中的secret可以有多种类型,这里使用的是TLS类型。
tls-secret
: 这是自定义的secret名称。你可以根据需要更改这个名字,它将在Kubernetes中作为标识这个secret的唯一名称。
--key tls.key
:--key
标志后面跟着的是TLS密钥文件的路径。在这个例子中,文件名为tls.key
。这个文件包含了私钥,是TLS证书对的一部分,用于服务端验证和加密通信。
--cert tls.crt
:--cert
标志后面跟着的是TLS证书文件的路径。在这个例子中,文件名为tls.crt
。这个文件包含了公钥以及由认证机构签署的相关信息,用于客户端验证服务端的身份。综上所述,这个命令的作用是使用指定的TLS密钥(
tls.key
)和证书(tls.crt
)文件,在Kubernetes集群中创建一个名为tls-secret
的TLS类型的secret。这个secret随后可以被Pods或者Services等Kubernetes资源引用,以便在需要TLS安全通信的场景下使用这些证书和密钥。
3.2 获取Secret资源信息
kubectl get secrets
3.3 查看Secret资源
kubectl describe secret tls-secret
-
使用
kubectl describe secret tls-secret
命令获取tls-secret
的详细信息。 -
可以看到了Secret资源的类型为
kubernetes.io/tls
,并且包含了证书和私钥的数据。
现在,可以在创建Ingress资源时引用这个Secret,以便为Ingress Controller配置HTTPS支持。这将允许Ingress Controller使用这个SSL证书来终止外部HTTPS请求。
4, 创建 deployment、Service、Ingress Yaml 资源
vim ingress-https.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app-https #修改名字,防止重复
spec:
replicas: 2
selector:
matchLabels:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc-https #后端服务的名称为nginx-svc-https
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-https
spec:
tls:
- hosts:
- www3.zzz.com
secretName: tls-secret # 存储TLS证书和私钥的 Secret 对象的名称为tls-secret
rules:
- host: www3.zzz.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc-https #后端服务的名称为nginx-svc-https
port:
number: 80
YAML配置文件解读:
- 在该文件中定义一个Deployment(nginx-app-https),它包含两个Nginx容器的副本。
- 定义一个Service(nginx-svc-https),它将端口80的流量转发到标签为name: nginx的Pod。
- 定义一个Ingress资源(nginx-https),它配置了HTTPS支持,使用之前创建的tls-secret证书和私钥。
- Ingress资源中定义了一个规则,当访问www03.zzz.com时,流量将被路由到nginx-svc服务的端口80。
使用kubectl apply -f ingress-https.yaml
命令将这些配置应用到Kubernetes集群中。
kubectl apply -f ingress-https.yaml
5, 查看配置
6,真机做映射 访问测试
在宿主机的 C:\Windows\System32\drivers\etc\hosts 文件中添加映射
浏览器访问
三 Nginx 进行 BasicAuth
(一)理论
1,是什么
Nginx 中的 BasicAuth 是一种基于HTTP基本认证(HTTP Basic Access Authentication)的认证方式,用于限制对web资源的访问。当启用了BasicAuth后,Nginx会要求尝试访问受保护资源的用户在浏览器中输入用户名和密码。这种认证过程发生在HTTP协议层面,是一种简单而广泛使用的身份验证机制。
具体来说,当客户端(如浏览器)请求一个受保护的URL时,Nginx服务器会返回一个401 Unauthorized响应,并在响应头中包含一个WWW-Authenticate字段,要求客户端提供凭证。浏览器随后会弹出一个对话框,要求用户输入用户名和密码。用户输入的凭据会被Base64编码并发送回服务器(注意:Base64编码并不是加密,只是编码,因此依然可以通过解码查看原始信息,但相比明文还是有所增加安全性)。
2, 使用场景
总之,Nginx的BasicAuth提供了一种简易的方法来保护网站的部分或全部内容,确保只有拥有有效凭证的用户才能访问。尽管它简单易用,但由于安全性较低(因为Base64编码容易被解码,且传输过程中如果没有使用HTTPS则密码可能被截取),所以在安全性要求较高的场景下,可能需要配合SSL/TLS(HTTPS)或其他更安全的认证机制一起使用
(二)实验
1,准备
mkdir /opt/ingress-nodeport/basic-auth
cd /opt/ingress-nodeport/basic-auth
2, 生成用户密码认证文件,创建 secret 资源进行存储
yum -y install httpd
htpasswd -c auth wyq #认证文件名必须为 auth
kubectl create secret generic basic-auth --from-file=auth
3, 创建Secret资源
kubectl create secret generic basic-auth --from-file=auth
- 使用
kubectl create secret generic basic-auth --from-file=auth
命令创建一个新的Kubernetes Secret资源,名为basic-auth
,并将之前生成的auth
文件作为数据。
4, 创建Ingress资源
vim ingress-auth.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-auth
annotations:
#设置认证类型basic
nginx.ingress.kubernetes.io/auth-type: basic
#设置secret资源名称basic-auth
nginx.ingress.kubernetes.io/auth-secret: basic-auth
#设置认证窗口提示信息
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - wyq'
spec:
rules:
- host: auth.wyq.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
使用vim编辑器创建一个名为ingress-auth.yaml的YAML文件。(如上代码)
在该文件中定义了一个Ingress资源,名为ingress-auth,它包含了基本认证的配置。
使用注解设置了认证类型(basic)、认证使用的Secret资源名称(basic-auth)以及认证窗口提示信息。
定义了一个规则,当访问auth.zzz.com时,流量将被路由到nginx-svc服务的端口80。具体详细设置方法可参考官网
https://kubernetes.github.io/ingress-nginx/examples/auth/basic/
启动
kubectl apply -f ingress-auth.yaml
5, 查看相关配置
数据流向就是:
当我们浏览器访问 auth.wyq.com:31101 数据流向通过nodeport对外暴露的端口到
7层的反向代理 ingress-nginx的网络
ingress-nginx 这个七层反向代理 根据规则 将流量转到
业务pod (nginx) 的svc
再根据标签选择器 到达对应的业务pod
6, 访问测试
先做映射
真机访问 auth.wyq.com:31101 会要求验证
输入账号密码
四 Nginx重写
(一)理论
1, 作用
当域名更新之后,可以使用重写功能,使旧域名,跳转到新的域名当中
例如当访问www.old.com时,使用重写功能跳转到www.new.com
2,步骤
在Kubernetes集群中配置Nginx Ingress Controller以实现URL重写,可以配置 Nginx Ingress Controller,然后通过编辑 Ingress 资源规则,使用 Nginx 的 rewrite 指令来修改传入请求的 URL 路径,实现定制的路由和重定向功能。
3, metadata.annotations 配置说明
Nginx 进行重写
#metadata.annotations 配置说明
●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上定义的路径是否使用正则表达式
(二) 实验
1,创建重写Ingress资源
mkdir rewrite
cd rewrite
vim ingress-rewrite.yaml
2,yaml 文件
即 当访问re.kgc.com 都会被重写为http://auth.wyq.com:31101
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-rewrite
annotations:
nginx.ingress.kubernetes.io/rewrite-target: http://auth.wyq.com:31101
spec:
rules:
- host: re.kgc.com #由于re.kgc.com只是用于跳转不需要真实站点存在,因此svc资源名称可随意定义
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-svc
port:
number: 80
3, 访问测试
做映射
浏览器访问 re.kgc.com:31101 就会跳转到 http://auth.wyq.com:31101
五 总结
更多推荐
所有评论(0)