在k8s中: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 部署

  • 解释
  • 部署步骤
    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
  • 注意事项
    • 如果使用 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/v1
      kind: Deployment
      metadata:
        name: magedu-tomcat-app1-deployment
        namespace: magedu
      spec:
        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: v1
      kind: Service
      metadata:
        name: magedu-tomcat-app1-service
        namespace: magedu
      spec:
        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 bash
      mkdir /usr/local/tomcat/webapps/app1
      echo app1 > /usr/local/tomcat/webapps/app1/index.jsp
      
    • app2

      yaml复制

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: magedu-tomcat-app2-deployment
        namespace: magedu
      spec:
        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: v1
      kind: Service
      metadata:
        name: magedu-tomcat-app2-service
        namespace: magedu
      spec:
        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 bash
      mkdir /usr/local/tomcat/webapps/app2
      echo app2 > /usr/local/tomcat/webapps/app2/index.jsp
      
  3. 创建 Ingress 规则

    yaml复制

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      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 magedu
      kubectl 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/v1
      kind: Ingress
      metadata:
        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/v1
      kind: Ingress
      metadata:
        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.jsp
      curl https://xxx.jigaobo.cn/app1/index.jsp
      

2.3 辅助配置

1. 配置相关

  • 添加规则

  • 签发自定义证书

    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。

微信公众号:运维-波子

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

私信我:面试全套资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值