美文网首页
Ingress-Nginx 安装部署和导入外部流量

Ingress-Nginx 安装部署和导入外部流量

作者: 6ea566508d0d | 来源:发表于2019-07-10 11:31 被阅读0次

    一. Ingress 简介

    首先,简单了解下 Ingress 和 Ingress Controller

    Ingress

    Ingress 是 Kubernetes 1.1 版本新增的资源对象,用于将不用 URL 的访问请求转发到后端不同的 Service,以实现 HTTP 层的业务路由机制。简单点说:Ingress 是 HTTP 层的服务暴露规则。官方的介绍如下:

    Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.

    Ingress Controller

    Ingress Controller 是一个统称,作用是为所有后端 Service 提供统一的入口。简单点说:Ingress Controller 是服务的入口网关。Ingress Controller 的实现有很多种,常见有以下几种:Ingress-Nginx、Traefik、Kong、HAProxy、Voyager、Contour、Ambassador

    下面是官方文档中提到的 Ingress Controller 实现:
    https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/#additional-controllers


    二. Ingress-Nginx 的安装

    Ingress-Nginx 的安装说简单也简单,说麻烦也麻烦,这里主要从以下两点说明:

    1. Ingress-Nginx 的安装方式
    2. Ingress-Nginx 的安装配置

    1. Ingress-Nginx 的安装方式

    Ingress-Nginx 的安装方式,基本上有两种:

    • 基于 ingress-nginx github 项目安装
    • 基于 Helm 的安装
    kubectl apply -f https://github.com/kubernetes/ingress-nginx/blob/master/deploy/static/mandatory.yaml "mandatory.yaml"
    
    • 基于 Helm 的安装
    helm install stable/nginx-ingress
    

    注意!注意!!!,虽然这两种方式都是官方给出的,但这两种安装方式都不能用以上的命令直接进行安装,都需要做一些配置才行

    在这里,我们将采用以 Helm 的形式安装,所以请确保 Helm 已安装(原因:第一种安装方式,工作量相对而言会多一点,不管是该配置文件还是后期的维护和升级都比较麻烦)

    2. Ingress-Nginx 的安装配置

    在安装 Ingress-Nginx 的时候,我们会根据外部流量导入的方式做一些配置,外部流量导入的方式一般有以下两种:

    • 以 LoadBalancer 的方式导入流量
    • 以 hostPort 暴露 Pod 的方式导入流量

    以 LoadBalancer 导入流量的方式,进行安装配置

    Ingress Controller 使用 Deployment 部署,Service 类型指定为 LoadBalancer
    这种方式最为简单,一句就搞定了:

    helm install --name nginx-ingress --namespace kube-system stable/nginx-ingress
    

    但是。。。LoadBalancer 的方式,一般都是购买云厂商托管提供的 Kubernetes 集群才会所提供的,因为这样云厂商才会给你分配外网 IP 作为集群的 EXTERNAL-IP,否则安装后会发现 nginx-ingress service 的 EXTERNAL-IP 一直是 <Pending> 状态:

    NAME                            TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
    nginx-ingress-controller        LoadBalancer   10.3.255.138   <Pending>   80:30113/TCP,443:32564/TCP        21h
    

    当然,你也可以手动指定 EXTERNAL-IP,像下面这样:

    helm install --name nginx-ingress --namespace kube-system \
    --set "rbac.create=true,controller.service.externalIPs[0]=192.168.0.123,controller.service.externalIPs[1]=192.168.0.122,controller.service.externalIPs[2]=192.168.0.121" stable/nginx-ingress
    

    但是,这样也有问题,因为指定的 EXTERNAL-IP 是内网 IP,所以不能接入外部网络

    以 hostPort 暴露 Pod 导入流量的方式,进行配置

    Ingress Controller 使用 DeamonSet 部署,Pod 指定 hostPort 来暴露端口

    • 为要部署 nginx-ingress 的服务器打上标签(注意:这台服务器必须有外网ip,才能作为边缘路由器使用)
    kubectl label node 47.44.99.125 node=edge
    
    • 以传参覆盖的方式,安装 nginx-ingress
    helm install stable/nginx-ingress \
    --name nginx-ingress \
    --namespace kube-system \
    --set rbac.create=true \
    --set controller.kind=DaemonSet \
    --set controller.hostNetwork=true \
    --set controller.daemonset.useHostPort=false \
    --set controller.daemonset.hostPorts.http=80 \
    --set controller.daemonset.hostPorts.https=443 \
    --set controller.service.type=ClusterIP \
    --set controller.nodeSelector.node=edge \
    
    • 当然,这么多需要覆盖的参数,也可以使用配置文件覆盖的方式:

    首先,获取 nginx-ingress 的默认配置,并写入 nginx-ingress-custom.yaml(这个文件,即我们将自定义配置的文件):

    helm inspect values stable/nginx-ingress > nginx-ingress-custom.yaml
    

    然后,修改 nginx-ingress-custom.yaml,删除不需要覆盖的参数和没用的注释,最后结果如下:

    controller:
      hostNetwork: true
      daemonset:
        useHostPort: false
        http: 80
        https: 443
      kind: DaemonSet
      nodeSelector:
        - node: edge
      service:
        type: ClusterIP
    rbac:
      create: true
    

    最后,使用配置文件覆盖的方式,安装 nginx-ingress 即可

    helm install stable/nginx-ingress \
    --name nginx-ingress \
    --namespace kube-system \
    -f nginx-ingress-custom.yaml
    

    关于打标签:

    # 为 kubernetesnode1 节点打上 node=edge 的标签
    kubectl label node kubernetesnode1 node=edge
    # 取消 kubernetesnode1 节点上 node 的标签
    kubectl label node kubernetesnode1 node-
    

    参考:
    https://kubernetes.io/docs/concepts/services-networking/ingress/
    https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
    https://github.com/kubernetes/ingress-nginx

    相关文章

      网友评论

          本文标题:Ingress-Nginx 安装部署和导入外部流量

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