> 技术文档 > 在k8s中:ingress 原理、安装、使用案例_ingress安装

在k8s中:ingress 原理、安装、使用案例_ingress安装

1. Ingress 安装及原理

1.1 作用及原理

  • 作用:Ingress 是 Kubernetes 中用于管理外部访问(HTTP/HTTPS)到集群内服务的 API 对象,支持负载均衡、SSL 终结和基于名称的虚拟托管。
  • 原理
    1. 每个节点监听 80 和 443 端口
    2. 接收到 HTTP 请求后,根据设置的路径转发到对应的 Service。
    3. 转发流程:HAProxy -> Ingress (80 和 443) -> Service -> Pod

1.2 安装 Ingress 控制器

推荐使用 DaemonSet 部署

  • 解释
    • Ingress 控制器以 Pod 的方式运行,支持 Deployment 和 DaemonSet 两种部署方式。
    • 安装文件地址:
      • https://github.com/kubernetes/ingress-nginx/releases
      • ingress-nginx/deploy/static/provider/baremetal/deploy.yaml at controller-v1.10.5 · kubernetes/ingress-nginx · GitHub
  • 部署步骤
    1. 下载 deploy.yaml 文件。
    2. 替换镜像为国内镜像源,或提前下载。
    3. 修改 hostNetwork 配置,直接监听宿主机的 80 和 443 端口。
      • 如果不使用 hostNetwork,Ingress 将监听 NodePort(如 30000 左右的端口)。
    4. 转发流程:HAProxy -> Ingress (80 和 443) -> Service -> Pod
  • 部署文件路径
    • /root/ingress/Ingress-case-20230611-backup/1.1-ingress-nginx-1.2.0_deploy-yaml/2.ingress-nginx-controller-v1.2.0_daemonset.yaml
    • 部署命令:kubectl  apply  -f  2.ingress-nginx-controller-v1.2.0_daemonset.yaml
  • 注意事项
    • 如果使用 DaemonSet 部署,Ingress 将监听 80 和 443 端口。
    • 如果使用 Deployment 部署,Ingress 将监听 NodePort 端口,需要使用 HAProxy 代理。

2. Ingress 项目

2.1 单个域名转发到后端 Pod

部署流程

  1. 部署后端 Pod 和 Service

    • 部署两个 Deployment 类型的后端 Pod。
    • 部署 ClusterIP 类型的 Service。
    • 创建 Ingress 规则(需先安装 Ingress 控制器)。
    • 双域名支持:复制 Ingress 的 YAML 文件,分开写即可。
  2. 示例代码

    • app1

      yaml复制

      apiVersion: apps/v1kind: Deploymentmetadata: name: magedu-tomcat-app1-deployment namespace: mageduspec: replicas: 1 selector: matchLabels: app: magedu-tomcat-app1-selector template: metadata: labels: app: magedu-tomcat-app1-selector spec: containers: - name: magedu-tomcat-app1-container image: registry.cn-hangzhou.aliyuncs.com/docker-jigaobo/tomcat:7.0.94-alpine imagePullPolicy: Always ports: - containerPort: 8080 protocol: TCP name: http env: - name: \"password\" value: \"123456\" - name: \"age\" value: \"18\" resources: limits: cpu: 1 memory: \"512Mi\" requests: cpu: 500m memory: \"512Mi\"---apiVersion: v1kind: Servicemetadata: name: magedu-tomcat-app1-service namespace: mageduspec: type: ClusterIP ports: - name: http port: 80 protocol: TCP targetPort: 8080 selector: app: magedu-tomcat-app1-selector

      bash复制

      kubectl exec -it -n magedu magedu-tomcat-app1-deployment-86f5cdd876-gntks bashmkdir /usr/local/tomcat/webapps/app1echo app1 > /usr/local/tomcat/webapps/app1/index.jsp
    • app2

      yaml复制

      apiVersion: apps/v1kind: Deploymentmetadata: name: magedu-tomcat-app2-deployment namespace: mageduspec: replicas: 1 selector: matchLabels: app: magedu-tomcat-app2-selector template: metadata: labels: app: magedu-tomcat-app2-selector spec: containers: - name: magedu-tomcat-app2-container image: registry.cn-hangzhou.aliyuncs.com/docker-jigaobo/tomcat:7.0.94-alpine imagePullPolicy: Always ports: - containerPort: 8080 protocol: TCP name: http env: - name: \"password\" value: \"123456\" - name: \"age\" value: \"18\" resources: limits: cpu: 1 memory: \"512Mi\" requests: cpu: 500m memory: \"512Mi\"---apiVersion: v1kind: Servicemetadata: name: magedu-tomcat-app2-service namespace: mageduspec: type: ClusterIP ports: - name: http port: 80 protocol: TCP targetPort: 8080 selector: app: magedu-tomcat-app2-selector

      bash复制

      kubectl exec -it -n magedu magedu-tomcat-app2-deployment-86f5cdd876-gntks bashmkdir /usr/local/tomcat/webapps/app2echo app2 > /usr/local/tomcat/webapps/app2/index.jsp
  3. 创建 Ingress 规则

    yaml复制

    apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: www.jigaobo.com namespace: magedu annotations: kubernetes.io/ingress.class: \"nginx\" nginx.ingress.kubernetes.io/use-regex: \"true\" nginx.ingress.kubernetes.io/proxy-connect-timeout: \"600\" nginx.ingress.kubernetes.io/proxy-send-timeout: \"600\" nginx.ingress.kubernetes.io/proxy-read-timeout: \"600\" nginx.ingress.kubernetes.io/proxy-body-size: \"50m\"spec: rules: - host: www.jigaobo.com http: paths: - pathType: Prefix path: \"/\" backend: service: name: magedu-tomcat-app2-service port:  number: 80
  4. 请求验证

    • 添加 /etc/hosts 解析。

    • 请求域名:

      bash复制

      curl www.jigaobo.com/app2/index.jsp

2.2 实现单个域名和双域名的 HTTPS 请求转发到 Service

部署流程

  1. 部署后端 Pod 和 Service

    • 部署两个 Deployment 类型的后端 Pod。
    • 部署 ClusterIP 类型的 Service。
  2. 创建 Secret

    • 将 HTTPS 证书存入 Secret 中。

    • 示例:

      bash复制

      kubectl create secret tls tls-secret-www --cert=www.jigaobo.com.crt --key=www.jigaobo.com.key -n magedukubectl create secret tls tls-secret-xxx --cert=xxx.jigaobo.cn.crt --key=xxx.jigaobo.cn.key -n magedu
  3. 创建 Ingress 规则

    • 单域名

      yaml复制

      apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: nginx-web namespace: magedu annotations: kubernetes.io/ingress.class: \"nginx\" nginx.ingress.kubernetes.io/ssl-redirect: \"true\"spec: tls: - hosts: - www.jigaobo.com secretName: tls-secret-www rules: - host: www.jigaobo.com http: paths: - pathType: Prefix path: \"/\" backend: service: name: magedu-tomcat-app2-service port:  number: 80
    • 双域名

      yaml复制

      apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: nginx-web-mobile namespace: magedu annotations: kubernetes.io/ingress.class: \"nginx\" nginx.ingress.kubernetes.io/ssl-redirect: \"true\"spec: tls: - hosts: - www.jigaobo.com secretName: tls-secret-www - hosts: - xxx.jigaobo.cn secretName: tls-secret-xxx rules: - host: xxx.jigaobo.cn http: paths: - pathType: Prefix path: \"/\" backend: service: name: magedu-tomcat-app1-service port:  number: 80 - host: www.jigaobo.com http: paths: - pathType: Prefix path: \"/\" backend: service: name: magedu-tomcat-app2-service port:  number: 80
  4. 请求验证

    • 测试 HTTPS 请求:

      bash复制

      curl https://www.jigaobo.com/app2/index.jspcurl https://xxx.jigaobo.cn/app1/index.jsp

2.3 辅助配置

1. 配置相关

  • 添加规则

    • 参考官方文档:Ingress | Kubernetes
  • 签发自定义证书

    bash复制

    kubectl create secret tls tls-secret-mobile --cert=mobile.crt --key=mobile.key -n magedu
  • 修改 Service 类型

    • 将 Service 从 NodePort 修改为 ClusterIP,并测试。
  • 创建 Secret

    • Secret 必须与 Ingress 规则在同一命名空间中。

2. 透传问题

  • 配置方法

    • 配置项均添加到 Ingress YAML 文件的 annotations 中。

    • 示例:

      yaml复制

      annotations: kubernetes.io/ingress.class: \"nginx\" nginx.ingress.kubernetes.io/cors-allow-credentials: \"true\" nginx.ingress.kubernetes.io/cors-allow-headers: \"*\" nginx.ingress.kubernetes.io/cors-allow-methods: \"PUT, GET, POST, OPTIONS\" nginx.ingress.kubernetes.io/cors-allow-origin: \"http://www.jd.com\" nginx.ingress.kubernetes.io/enable-cors: \"true\" nginx.ingress.kubernetes.io/ssl-redirect: \"true\"
  • 注解说明

    • kubernetes.io/ingress.class: \"nginx\":指定使用 Nginx Ingress Controller。
    • nginx.ingress.kubernetes.io/cors-allow-credentials: \"true\":允许跨域请求携带凭证(如 Cookies)。
    • nginx.ingress.kubernetes.io/cors-allow-headers: \"*\":允许所有自定义头。
    • nginx.ingress.kubernetes.io/cors-allow-methods: \"PUT, GET, POST, OPTIONS\":允许的跨域请求方法。
    • nginx.ingress.kubernetes.io/cors-allow-origin: \"http://www.jd.com\":允许来自指定域名的跨域请求。
    • nginx.ingress.kubernetes.io/enable-cors: \"true\":启用 CORS。
    • nginx.ingress.kubernetes.io/ssl-redirect: \"true\":启用 SSL 重定向,将所有 HTTP 请求重定向到 HTTPS。

微信公众号:运维-波子

关注我:大厂趣事和面试题。

私信我:面试全套资料。