• k8s 使用ingress-nginx访问集群内部应用


    k8s搭建和部署应用完成后,可以通过NodePort,Loadbalancer,Ingress方式将应用端口暴露到集群外部,提供外部访问。
    缺点:
    NodePort占用端口,大量暴露端口非常不安全,并且有端口数量限制【不推荐】;
    Loadbalancer 非常好用,但是得加钱才行【视情况定】
    Ingress 配置稍微复杂,并且需要内部DNS解析转发【推荐】

    Ingress-nginx-controller 安装部署见k8s安装ingress-nginx DaemonSet + HostNetwork + nodeSelector
    因为Ingress-nginx-controller是部署在k8s集群内部以pod方式运行,是可以访问到集群内部k8s的各个服务的,而只需要将Ingress-nginx-controller监听的80/443端口提供暴露给外部访问,并安装一定规则进行代理转发,即可实现外部通过Ingress-nginx-controller访问到内部应用中。

    简易理解ingress 同 svc,pod关系,ingress --转发–> svc --转发–> pods
    这里简易部署nginx、tomcat为例:
    vi nginx-tomcat-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx-pod
      template:
        metadata:
          labels:
            app: nginx-pod
        spec:
          containers:
            - name: nginx-container
              image: nginx:latest
              ports:
                - name: nginx-port
                  containerPort: 80
                  protocol: TCP
    
    ---
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tomcat-deployment
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: tomcat-pod
      template:
        metadata:
          labels:
            app: tomcat-pod
        spec:
          containers:
            - name: tomcat-container
              image: tomcat:8.5-jre10-slim
              ports:
                - name: tomcat-port
                  containerPort: 8080
                  protocol: TCP
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    执行部署
    kubectl apply -f nginx-tomcat-deployment.yaml

    配置nginx和tomcat访问服务svc脚本,监听nginx-80/tomcat-8080端口nginx-tomcat-service.yaml
    vi nginx-tomcat-service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-svc
      namespace: default
    spec:
      selector:
        app: nginx-pod
      type: ClusterIP     # 默认使用ClusterIP不使用NodePort方式
    #  clusterIP: None
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80  # 部署的nginx端口
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: tomcat-svc
      namespace: default
    spec:
      selector:
        app: tomcat-pod
      type: ClusterIP       # 默认使用ClusterIP不使用NodePort方式
    #  clusterIP: None
      ports:
        - protocol: TCP
          port: 8080
          targetPort: 8080  # 部署的tomcat端口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    执行部署
    kubectl apply -f nginx-tomcat-service.yaml

    编写ingress脚本,ingress目的就是访问将指定访问url或域名的配置提交给ingress-nginx-controller做反向代理转发到选择绑定的service中,实现pod应用暴露给外部访问。
    nginx-tomcat-ingress.yaml由nginx代理转发到nginx/tomcat的svc端口
    vi nginx-tomcat-ingress.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-nginx-http
      annotations:
        kubernetes.io/ingress.class: "nginx"  # 必须添加防止访问404
    spec:
      rules:
      - host: ng.yunzaixin.top                # 配置转发地址
        http:
          paths:
          - path: /
            pathType: Prefix                   # 前缀匹配
            backend:
              service:
                name: nginx-svc                # 转发到那个svc中
                port:
                  number: 80                   # 转发到svc中绑定的端口
                  
    ---
    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-tomcat-http
      annotations:
        kubernetes.io/ingress.class: "nginx"  # 必须添加防止访问404
    spec:
      rules:
      - host: tomcat.yunzaixin.top            # 配置转发地址
        http:
          paths:
          - path: /
            pathType: Prefix                   # 前缀匹配
            backend:
              service:
                name: tomcat-svc               # 转发到那个svc中
                port:
                  number: 8080                 # 转发到svc中绑定的端口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    执行部署
    kubectl apply -f nginx-tomcat-ingress.yaml

    相当于访问tomcat.yunzaixin.top 或者ng.yunzaixin.top ,ingress-nginx-controller将会转发到nginx-svc或tomcat-svc,nginx-svc或tomcat-svc转发到对应得nginx或tomcat中
    在这里插入图片描述

    在运行ingress-nginx-controller节点主机上访问:
    curl ng.yunzaixin.top
    在这里插入图片描述

    curl tomcat.yunzaixin.top
    在这里插入图片描述
    注意:这里的ng.yunzaixin.top和tomcat.yunzaixin.top在ingress-nginx-controller配置上server:
    server {
    server_name ng.yunzaixin.top;
    }
    server {
    server_name tomcat.yunzaixin.top;
    }
    通过监听 server_name 实现转发到k8s的svc上;这里的 ng.yunzaixin.top tomcat.yunzaixin.top集群内部的DNS映射,通常会需要一台接入公网的主机做统一的转发,相当于解析一个域名,所有的接口都是通过这一个域名作为入口,具体访问那个应用需要自己去定义,cloud.yunzaixian.top/nginx/、cloud.yunzaixian.top/tomcat 、cloud.yunzaixian.top/xxx,做对应的转发和主机内部DNS映射配置。
    vi /etc/hosts

    # 公网入口主机内部DNS转发到ngress-nginx-controller
    1.14.10.23    nginx.yunzaixian.top
    43.139.67.59  nginx.yunzaixian.top
    
    1.14.10.23    tomcat.yunzaixian.top
    43.139.67.59  tomcat.yunzaixian.top
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    配置对外主机nginx

    server {
     	 server_name  ng.yunzaixin.top;
     	 listen       80;
     	 
     	  # tomcat访问 http://cloud.yunzaixian.top/tomcat
    	 location /tomcat {
    	      rewrite ^/tomcat/(.*)$ /$1 break;
    	      proxy_pass  http://tomcat.yunzaixin.top;
    	 }
    	# ng访问 http://cloud.yunzaixian.top/nginx
    	 location /tomcat {
    	      rewrite ^/nginx/(.*)$ /$1 break;
    	      proxy_pass  http://nginx.yunzaixin.top;
    	 }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    浏览器访问:
    http://cloud.yunzaixian.top/tomcat
    http://cloud.yunzaixian.top/nginx

  • 相关阅读:
    ajax请求的时候get 和post方式的区别?
    MySQL事务(Transaction)
    MIPI协议介绍-CPHY
    Python识别验证码----谷歌reCapture 3*3验证码
    搭建web服务器需要哪些步骤?
    TCP/IP协议数据链路层
    华为OD机考算法题:简单的自动曝光
    【vue】@、@/、../和./的区别
    SpringBoot-接口幂等性
    使用LIO-SAM进行点云赋色 与 激光雷达和相机的精细化标定(防止自己忘记的博客)----- 激光雷达和相机的精细化标定
  • 原文地址:https://blog.csdn.net/yxt625520/article/details/133984868