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

一. 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355