Ingress实战

发布时间:2020-03-24 10:13:49编辑:admin阅读(2942)

    一、概述

    Ingress

    Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。Ingress 具备如下特性:集群外部可访问的 URL、负载均衡、SSL Termination、按域名路由(name-based virtual hosting)。

    Ingress Controller (通常需要负载均衡器配合)负责实现 Ingress API 对象所声明的能力。如下图所示:

    1. Ingress Controller 监听所有 worker 节点上的 80/443 端口

    2. Ingress Controller 将所有对域名为 a.kuboard.cn 的 HTTP/HTTPS 请求路由到 Service B 的 9080 端口

    3. Service B 将请求进一步转发到其标签所选择的 Pod 容器组(通过 targetPort 指定容器组上的端口号)

    该图中,请求被转发的过程为:

    1. 假设您将 a.kuboard.cn 的 DNS 解析到了集群中的一个 worker 节点的 IP 地址 192.168.2.69。(如果您的 worker 节点有外网地址,请使用外网地址,这样您可以从外网访问您的服务)

    2. 从客户端机器执行命令 curl http://a.kuboard.cn/abc/,该请求您将被转发到 192.168.2.69 这个地址的 80 端口,并被 Ingress Controller 接收

    3. Ingress Controller 根据请求的域名 a.kuboard.cn 和路径 abc 匹配集群中所有的 Ingress 信息,并最终找到 Ingress B 中有这个配置,其对应的 Service 为 Service B 的 9080 端口

    4. Ingress Controller 通过 kube-proxy 将请求转发到 Service B 对应的任意一个 Pod 上 与 Service B 的 9080 端口对应的容器端口上。(从 Ingress Controller 到 Pod 的负载均衡由 kube-proxy + Service 实现)

    1.png

     

    Ingress Controller

    如上所述,您必须在 Kubernetes 集群中安装了 Ingress Controller,您配置的 Ingress 才能生效。

    划重点
    
    Ingress 只是 Kubernetes 中的一种配置信息;Ingress Controller 才是监听 80/443 端口,并根据 Ingress 上配置的路由信息执行 HTTP 路由转发的组件。

    Ingress Controller 有多种实现可供选择,请参考 Kubernetes 官方文档 Additional controllers,比较常用的有 Traefic 、 Nginx Ingress Controller for Kubernetes 等。

    如果您参考 https://kuboard.cn 网站上提供的文档安装了 Kubernetes,您应该已经完成了 Nginx Ingress Controller for Kubernetes 在您 Kubernetes 集群中的安装。该 Ingress Controller 以 DaemonSet 的类型部署到 Kubernetes,且监听了 hostPort 80/443

     

    二、安装Ingress Controller

    环境介绍

    系统dockerip主机名配置
    centos 7.619.03.5192.168.31.150k8s-master2核4G
    centos 7.619.03.5192.168.31.183k8s-node012核4G
    centos 7.619.03.5192.168.31.178k8s-node022核4G

     

     

     

     

     

    安装

    在 master 节点上执行

    kubectl apply -f https://kuboard.cn/install-script/v1.17.x/nginx-ingress.yaml

    配置域名解析

    将域名 *.demo.yourdomain.com 解析到 demo-worker-a-2 的 IP 地址 z.z.z.z (也可以是 demo-worker-a-1 的地址 y.y.y.y)

    验证配置

    在浏览器访问 a.demo.yourdomain.com,将得到 404 NotFound 错误页面

     

    发布应用

    应用yaml

    这里以flaskapp为例

    vi flaskapp.yaml

    内容如下:

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        k8s.eip.work/displayName: flaskapp
        k8s.eip.work/ingress: 'false'
        k8s.eip.work/service: ClusterIP
        k8s.eip.work/workload: svc-flaskapp
      labels:
        k8s.eip.work/layer: svc
        k8s.eip.work/name: svc-flaskapp
      name: svc-flaskapp
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          k8s.eip.work/layer: svc
          k8s.eip.work/name: svc-flaskapp
      template:
        metadata:
          labels:
            k8s.eip.work/layer: svc
            k8s.eip.work/name: svc-flaskapp
        spec:
          containers:
            -
              image: jcdemo/flaskapp
              imagePullPolicy: Always
              name: flaskapp
          restartPolicy: Always
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        k8s.eip.work/displayName: flaskapp
        k8s.eip.work/workload: svc-flaskapp
      labels:
        k8s.eip.work/layer: svc
        k8s.eip.work/name: svc-flaskapp
      name: svc-flaskapp
      namespace: default
    spec:
      ports:
        - name: wjaz2a
          nodePort: 0
          port: 5000
          protocol: TCP
          targetPort: 5000
      selector:
        k8s.eip.work/layer: svc
        k8s.eip.work/name: svc-flaskapp
      type: ClusterIP

    注意:此段yaml内容,使用Kuboard生成的,创建工作负载,可以预览yaml文件。

    关于Kuboard的使用,请参考链接:

    https://www.cnblogs.com/xiao987334176/p/12060855.html

     

    ingress yaml

    vi flaskapp-ingress.yaml

    内容如下:

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: svc-flaskapp
      namespace: default
      annotations:
        kubernetes.io/ingress.class: "nginx"
    spec:
      rules:
      - host: flaskapp.baidu.com
        http:
          paths:
          - path:
            backend:
              serviceName: svc-flaskapp
              servicePort: 5000

    注意: Kuboard也可以生成ingress,但是有bug,外部无法访问。

    因此这段,我是手动编写的。注意修改上面的红色文字。

     

    执行yaml

    kubectl apply -f flaskapp.yaml
    kubectl apply -f flaskapp-ingress.yaml

     

    查看pod

    # kubectl get pods -o wide
    NAME                          READY   STATUS    RESTARTS   AGE    IP              NODE         NOMINATED NODE   READINESS GATES
    svc-flaskapp-774c665d-c42ft   1/1     Running   0          113m   10.244.58.194   k8s-node02   <none>           <none>

     

    查看svc

    # kubectl get svc
    NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    kubernetes     ClusterIP   10.1.0.1       <none>        443/TCP        56d
    svc-flaskapp   ClusterIP   10.1.116.148   <none>        5000/TCP       123m

     

    查看ingresses

    # kubectl get ingresses.extensions
    NAME           HOSTS                ADDRESS   PORTS   AGE
    svc-flaskapp   flaskapp.baidu.com             80      106m

     

    设置域名解析

    如果没有dns,修改windows 10的hosts,添加一条记录

    192.168.31.164 flaskapp.baidu.com

    注意:解析到任意node节点都可以!

     

    访问页面

    http://flaskapp.baidu.com/

    效果如下:

    1.png

     

     

     

    本文参考链接:

    https://www.kuboard.cn/learning/k8s-intermediate/service/ingress.html#ingress

    https://www.kuboard.cn/install/install-k8s.html#%E5%AE%89%E8%A3%85-ingress-controller


关键字