k8s 对外服务之 Ingress(HTTPS/HTTP 代理访问 以及Nginx 进行 BasicAuth )

目录

一   Ingress HTTP 代理访问虚拟主机

(一)原理

(二)实验

1,准备

2,创建虚拟主机1资源

3,创建虚拟主机2资源

4,创建ingress资源

5,查看相关参数

6,测试访问

二  Ingress  HTTPS 代理访问

(一)理论

(二) 实验

1,准备

2,创建ssl证书

3,创建 secret 资源进行存储 

3.1 创建Secret资源​编辑

3.2 获取Secret资源信息

3.3  查看Secret资源

4, 创建 deployment、Service、Ingress Yaml 资源

5,  查看配置

6,真机做映射  访问测试

三    Nginx 进行 BasicAuth 

(一)理论

1,是什么

2, 使用场景

(二)实验

1,准备

2, 生成用户密码认证文件,创建 secret 资源进行存储

3, 创建Secret资源

4, 创建Ingress资源

5, 查看相关配置

6, 访问测试

四     Nginx重写

(一)理论

1,  作用

2,步骤

3, metadata.annotations 配置说明

(二)  实验

1,创建重写Ingress资源 

2,yaml 文件

3, 访问测试


一   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

五    总结

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值