美文网首页kubernetes
kubernetes之Ingress

kubernetes之Ingress

作者: 淡尝苦涩 | 来源:发表于2020-03-16 22:34 被阅读0次

    ingress是什么?

    是kubernetes的一个资源对象,用于将不同URL的访问请求转发到后端不同的Service,以实现HTTP层的业务路由机制。kubernetes使用了一个ingress策略定义和一个具体的Ingress Controller,两者相互配合才能实现一个完整的ingress负载均衡器。

    ingress-controller又是什么?ingress和ingress-controller如何做CP?

    ingress-controller是ingress资源对象正在做实际动作的执行者,而ingress只是一段配置,是负责告诉ingress-controller如何做负载调度;具体的说就是使用ingress进行负载分发时,ingress controller基于ingress规则将客户端请求直接转发到service对应的后端Endpoint(Pod)上,这样就可以直接跳过kube-proxy的转发功能,kube-proxy不再起作用

    ingress和service的区别?

    ingress可以实现七层,针对HTTP服务,不同的URL地址经常对应到不同的后端服务或者虚拟服务器

    service只能实现四层,也就是IP:Port,即TCP/IP层

    注:在下面的配置测试中,所使用的kubernetes版本是V1.17.1

    配置ingress

    创建ingress目录并进入

    # mkdir ingress && cd ingress

    下载官方ingress-controller服务

    # wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

    #  wget https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/provider/baremetal/service-nodeport.yaml

    启动ingress-controller服务,在启动前可根据自己需求修改service-nodeport配置文件内的对外暴露的端口

    # kubectl apply -f ./

    查看启动情况

    # kubectl get pod -n ingress-nginx

    编写需要被调度的后端服务,这里使用Tomcat,Nginx做测试

    tomcat的Deployment和Service

    # vim tomcat.yaml

    apiVersion: apps/v1

    kind: Deployment

    metadata:

      name: tomcat-deploy

      namespace: ingress-nginx

    spec:

      replicas: 2

      selector:

        matchLabels:

          app: tomcat

      template:

        metadata:

            labels:

              app: tomcat

        spec:

          containers:

          - name: tomcat

            image: tomcat

            ports:

            - containerPort: 8080

              name: httpport

            - containerPort: 8009

              name: ajpport

    ---

    apiVersion: v1

    kind: Service

    metadata:

      name: tomcat-svc

      namespace: ingress-nginx

      labels:

        app: tomcat-svc

    spec:

      selector:

        app: tomcat

      ports:

      - name: http

        port: 80

        targetPort: 8080

        protocol: TCP

    nginx的Deployment和Service

    # vim nginx.yaml

    apiVersion: apps/v1

    kind: Deployment

    metadata:

      name: nginx-deploy

      namespace: ingress-nginx

    spec:

      replicas: 2

      selector:

        matchLabels:

          app: nginx

      template:

        metadata:

          labels:

              app: nginx

        spec:

          containers:

          - name: nginx

            image: nginx

            ports:

            - name: httpport

              containerPort: 80

    ---

    apiVersion: v1

    kind: Service

    metadata:

      name: nginx-svc

      namespace: ingress-nginx

      labels:

        app: nginx-svc

    spec:

      selector:

        app: nginx

      ports:

      - name: http

        port: 80

        targetPort: 80

        protocol: TCP

    以上基础工作已经做好了,下面就要配置Tomcat和Nginx的ingress了

    ingress配置负载分发策略的主要转发策略有:

    1、转发到单个后端服务上,是指当请求到达 ingress controller时都会被转发到后端的唯一service上,在这种配置中无需定义rule

      例如:

        #  vim tomcat-ingress.yaml

        apiVersion: extensions/v1beta1

        kind: Ingress

        metadata:

          name: test-ingress

          namespace: ingress-nginx

        spec:

              backend:

                  serviceName: tomcat-svc

                  servicePort: 80

    2、同一域名下,不同的URL路径被转发到不同的服务上;是指用于一个网站通过不同的路径提供不同的服务场景,例如/tomcat表示请求Tomcat后端程序,/nginx表示请求Nginx后端服务;但是该方法经过测试发现当请求配置的目录时,后端也必须要有相同的目录不然会出现404的情况,简单说就是当请求/nginx时,后端的Nginx的根目录内也必须有nginx目录

      配置实例:

    # vim test-ingress.yaml

    apiVersion: extensions/v1beta1

    kind: Ingress

    metadata:

      name: test1-ingress

      namespace: ingress-nginx

      annotations:

        kubernetes.io/ingress.class: "nginx"

    spec:

      rules:

      - host: test1.meisfuture.com

        http:

          paths:

          - path: /tomcat

            backend:

              serviceName: tomcat-svc

              servicePort: 80

          - path: /nginx

            backend:

              serviceName: nginx-svc

              servicePort: 80

          - path:

            backend:

              serviceName: nginx2-svc

              servicePort: 80

    3、不同域名被转发到不同的服务上;是指用于一个网站通过不同的域名或虚拟主机名提供不同的服务,简单说就是test1.meisfuture.com提供tomcat服务,test2.meisfuture.com提供Nginx服务

      配置实例:

    #  vim test-ingress.yaml

    apiVersion: extensions/v1beta1

    kind: Ingress

    metadata:

      name: test1-ingress

      namespace: ingress-nginx

      annotations:

        kubernetes.io/ingress.class: "nginx"

    spec:

      rules:

      - host: test1.meisfuture.com

        http:

          paths:

          - path: /tomcat

            backend:

              serviceName: tomcat-svc

              servicePort: 80

          - path: /nginx

            backend:

              serviceName: nginx-svc

              servicePort: 80

          - path:

            backend:

              serviceName: nginx2-svc

              servicePort: 80

      - host: test2.meisfuture.com

        http:

          paths:

          - backend:

              serviceName: nginx2-svc

              servicePort: 80

    Ingress使用https的使用方法:

    让Ingress提供HTTPS的方式访问,需要在Ingress域名内开启TLS安全证书配置,配置方式如下:

    1、创建证书的密钥和SSL证书文件(我认为购买的已经认证好的证书和自己做测试自己生成的证书是一样可以放在第二步使用的)

    2、给证书创建一个secret资源对象

    3、将该证书的secret配置到ingress内

    1、创建证书

    # openssl genrsa -out test1meis.key 2048

    # openssl req -new -x509 -key test1meis.key -out test1meis.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=test1.meisfuture.com -days 3650

    2、创建secret资源对象

    # kubectl create secret tls test1meis-ingress-secret --cert=test1meis.crt --key=test1meis.key -n ingress-nginx

    3、将证书的secret配置放到ingress内

    # vim test-ingress-tls.yaml

    apiVersion: extensions/v1beta1

    kind: Ingress

    metadata:

      name: test1-ingress

      namespace: ingress-nginx

      annotations:

        kubernetes.io/ingress.class: "nginx"

    spec:

    tls:

      - hosts:

        - test1.meisfuture.com

        secretName: test1meis-ingress-secret

      rules:

      - host: test1.meisfuture.com

        http:

          paths:

          - path: /tomcat

            backend:

              serviceName: tomcat-svc

              servicePort: 80

          - path: /nginx

            backend:

              serviceName: nginx-svc

              servicePort: 80

          - path:

            backend:

              serviceName: nginx2-svc

              servicePort: 80

    以上配置都是经过测试可返回正确的页面和返回值,测试结果就不再贴图;

    测试过程就是将本地机器绑定hosts,使用http://test1.meisfuture.com:30080;https://test1.meisfuture.com:30443方式测试即可

    (我在service-nodeport配置文件中修改了暴露端口为http:30080,https:30443)

      在ingress配置中,我认为在Ingress.metadata,annotations中的配置非常重要,且在深入使用ingress时肯定要经常增加相关配置,具体相关配置请见官网链接:

    https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

    文章链接:http://blog.meisfuture.com/?p=433

    相关文章

      网友评论

        本文标题:kubernetes之Ingress

        本文链接:https://www.haomeiwen.com/subject/hxcaehtx.html