K8s部署Nginx集群,通过Ingress实现HTTPS域名访问过程

 更新时间:2026年01月26日 15:29:57   作者:ICT董老师  
文章主要介绍了如何使用Ingress控制器和Nginx服务来实现HTTP到HTTPS的强制重定向,并解释了Ingress控制器如何处理TLS终止和流量路由,通过配置Ingress和Nginx服务,可以确保所有流量都通过HTTPS访问,从而提高安全性

架构

客户端 → Ingress Controller (处理 TLS) → Service: nginx → Nginx Pod (提供静态内容)

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx

我们创建的 Service 类型默认是 ClusterIP,Ingress 控制器可以通过 ClusterIP 访问到 Pod。

secret存储TLS证书

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=dong.nginx.com"
kubectl create secret tls nginx-ssl-cert --cert=tls.crt --key=tls.key --namespace=default

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - dong.nginx.com
    secretName: nginx-tls-secret
  rules:
  - host: dong.nginx.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

在Ingress配置中,设置了注解​nginx.ingress.kubernetes.io/force-ssl-redirect: "true"​,这会导致Ingress控制器将HTTP请求重定向到HTTPS。

我们使用的是​kubernetes.io/ingress.class: "nginx"​,这通常是由NGINX Ingress控制器处理的。NGINX Ingress控制器默认会监听80和443端口,并且当你配置了TLS和强制重定向时,80端口的请求会被重定向到443。

在host字段中指定了域名,需要通过域名才可以访问(只有Host头匹配的请求才会被路由到此服务,如果直接访问Ingress Controller的IP,由于缺少Host头,请求不会被正确路由)。

访问 ​HTTP​ 端口 -> 被告知“请走 ​HTTPS​”

返回308永久重定向,说明HTTP被强制跳转到HTTPS,这是常见的做法。服务器明确告诉客户端:“你访问的这个 ​http​ 地址已经不再使用了,请永久地使用另一个地址(通常是 ​https​ 地址)来访问我。”这是现代Web服务的标准做法,为了安全,强制将不安全的 ​HTTP​ 协议跳转到安全的 ​HTTPS​ 协议。

308 重定向需要客户端(如浏览器)自动跟随重定向,但 curl 默认不会自动跟随重定向。

Ingress Controller:处理 TLS 终止和路由

通常 Ingress 控制器会使用它自己的 TLS 证书,而 Pod 内部的 nginx 不需要配置 SSL,可以只作为静态文件服务器,因为 Ingress 控制器会处理 SSL 终止。

在Kubernetes中,通常访问服务是通过Ingress控制器提供的入口。Ingress控制器会监听80和443端口(或者你配置的其他端口),然后根据Ingress规则路由流量。

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  default.conf: |
    server {
      listen 80;
      server_name _;
      root /usr/share/nginx/html;
      index index.html;

      location / {
        try_files $uri $uri/ =404;
      }

      autoindex off;

      location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        add_header Cache-Control "public";
      }
    }

在 ConfigMap 中,我们只配置了一个 HTTP 服务器(监听 80 端口),并且没有配置 SSL。因此,Pod 内的 nginx 只会处理 HTTP 流量。而 Ingress 控制器会将 HTTPS 流量终止并转发给 Service(即 Pod)的 80 端口。

nginx-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: html-pvc
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

存储管理-PV动态供给见–有状态应用-MySQL主从复制集群

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-web-cluster
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config
          mountPath: /etc/nginx/conf.d
        - name: html
          mountPath: /usr/share/nginx/html
      volumes:
      - name: config
        configMap:
          name: nginx-config
      - name: html
        persistentVolumeClaim:
          claimName: html-pvc

用户访问

访问前需要在用户的主机上修改hosts文件进行域名解析,添加:Ingress节点IP 及 域名。

通过Ingress节点IP地址(kubectl get ingress)加上Ingress控制器的Service上(kubectl get svc -n ingress-nginx)的暴露端口,用户可以从集群外部访问Ingress控制器。(这里需要通过域名访问或者携带主机头,如下:)

curl -H "Host:dong.nginx.com" https://192.168.1.73:31237 -k
#证书是自签名的,不在curl的CA信任库中,需要通过-k或--insecure选项来跳过证书验证

当前Ingress-controller的服务类型是NodePort,它会在每个节点上开放一个端口,所以访问时必须带上端口号。

1.http://dong.nginx.com:31441​ → 308 重定向到 HTTPS

2.https://dong.nginx.com:31237​ → Ingress → Service:nginx → Nginx Pod → 返回网页内容

curl默认不会跟随重定向。所以,当您使用curl访问HTTP时,您看到的是308重定向的响应体,而不是跟随重定向后的内容。

在浏览器中访问http://dong.nginx.com:31441,浏览器会自动重定向到HTTPS并显示页面,用户不会看到308的页面。

# 1. 查看重定向信息
curl -I http://dong.nginx.com:31441

# 2. 自动跟随重定向获取最终内容
curl -L http://dong.nginx.com:31441

# 3. 或者使用详细模式查看整个过程
curl -v -L http://dong.nginx.com:31441

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解consul的安装和配置

    详解consul的安装和配置

    这篇文章主要介绍了详解consul的安装和配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • K8S 使用EFK日志的统一管理(详细步骤)

    K8S 使用EFK日志的统一管理(详细步骤)

    在Kubernetes中,EFK是一种常见的日志统一管理方案,EFK堆栈允许你收集、存储、搜素、分析和可视化容器应用程序的日志,下面是如何在Kubernetes中使用EFK实现日志统一管理的详细步骤,感兴趣的朋友一起看看吧
    2025-01-01
  • kubernetes需要默认的serviceaccount的原因解析

    kubernetes需要默认的serviceaccount的原因解析

    这篇文章主要介绍了kubernetes为何需要默认的serviceaccount,ServiceAccount 是 Kubernetes 中的一种重要概念,它的实际使用场景包括很多,本文给大家讲解的非常详细,需要的朋友可以参考下
    2023-04-04
  • K8S容器OOM killed排查过程

    K8S容器OOM killed排查过程

    这篇文章主要介绍了K8S容器OOM killed排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • k8s证书有效期时间修改的方法详解

    k8s证书有效期时间修改的方法详解

    K8S集群有证书的概念,之前一直是使用默认的,默认都是1年和10年的,1年有效期这显然对于生产环境是不合适的,下面这篇文章主要给大家介绍了关于k8s证书有效期时间修改的相关资料,需要的朋友可以参考下
    2022-08-08
  • Kubernetes应用服务质量管理详解

    Kubernetes应用服务质量管理详解

    这篇文章主要为大家介绍了Kubernetes应用服务质量管理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • K8S-ConfigMap实现应用和配置分离详解

    K8S-ConfigMap实现应用和配置分离详解

    这篇文章主要为大家介绍了K8S-ConfigMap实现应用和配置分离详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • K8s EphemeralContainer临时容器解读

    K8s EphemeralContainer临时容器解读

    Kubernetes临时容器用于调试无shell容器,通过shareProcessNamespace参数实现安全登录与故障排查,排查后可删除,版本1.25及以上默认启用,需使用预装debug工具的镜像(如busybox)
    2025-08-08
  • 详解Rainbond内置ServiceMesh微服务架构

    详解Rainbond内置ServiceMesh微服务架构

    这篇文章主要为大家介绍了详解Rainbond内置ServiceMesh微服务架构,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • k8s 中的 service 如何找到绑定的 Pod 及实现 Pod 负载均衡的方法

    k8s 中的 service 如何找到绑定的 Pod 及实现 

    service 是一组具有相同 label pod 集合的抽象,集群内外的各个服务可以通过 service 进行互相通信,这篇文章主要介绍了k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡,需要的朋友可以参考下
    2022-10-10

最新评论