前言

当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress。

LoadBalancer类型得结合各个Cloud Provider提供的LB来使用,如果需要暴露的service很多,需要很多LB以及公网IP,比较浪费cost。

NodePort 方式一个端口只能一个服务使用,根据端口划分服务,可用端口范围:30000~32767, 同样如果在暴露的servicie很多的情况下会导致节点要开的端口越来越多,不好管理,平时测试可以用用。

Ingress是自kubernetes1.1版本后引入的资源类型,在这个资源中我们可以去配置我们的服务路由规则,但是要真正去实现识别这个 Ingress 并提供代理路由功能,还需要安装一个对应的控制器Ingress controller才能实现。Ingress nginx controller 本质上就是kubernetes 部署的pod 里面有一个 Nginx container,只不过它能根据 Ingress 资源的定义动态生成 Nginx 的配置文件,然后动态 Reload。可以理解成 Ingress controller是由Kubernetes管理的负载均衡器。

Ingress controller是以一种插件的形式提供,有多种实现,有基于 Nginx 的,也有基于 HAProxy的,还有现在很流行的Envoy,详见:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/, 我后面文章也会介绍基于 Envoy的 Ingress controller。

本文使用Kubernetes 社区推出的 Ingress Controller: Ingress-nginx (github.com/kubernetes/ingress-nginx) 它是基于Nginx 的扩展版 OpenResty 及诸多第三方模块构建的,其基于 OpenResty 的 Lua 嵌入式编程能力,扩展了 Nginx 的功能,并基于 balancer_by_lua 模块实现了 Pod 变化的动态变更功能。

要注意区分另外一个名字相近由Nginx公司推出的Nginx ingress controller (github.com/nginxinc/kubernetes-ingress)。Nginx 官方版本提供其基于Go语言开发的 Ingress 控制器,并与 Nginx 集成分为 Nginx 开源版和 Nginx Plus 版,开源版仅基于 Nginx 的原始功能,不支持 Pod 变化的动态变更。Nginx Plus 版则提供了诸多完善的商业功能,其支持 Nginx 原生配置指令、JWT 验证、Pod 变化的动态配置及主动健康检查等功能。

 
关键词:Ingress nginx入门,Ingress nginx安装,同一集群多Ingress Nginx安装,Ingress nginx使用
 

安装

测试环境

  • Kubernetes 1.22(GKE)
  • Ingress Nginx 1.3.0
  • Kustomize 3.10.0

安装及使用

安装方式有多种,我这里介绍使用Kustomize 安装, Kustomize入门可以参考我这篇文章【云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize

k8s manifests 参考 my repo

根据需要修改自己所需,这里的例子是为 atlantis namespace 下面的 atlantis serivce 配置一个Ingress

由于Ingress controller 和 Ingress 均安装在dmz namespace, 和 atlantis 不在同一个namespace下面,我们需要为atlantis serivce 加了一个 ExternalName 类型的service 相当于别名。

这样dmz namespace 下面 Ingress 就指向 -> ExternalName 类型的service -> 指向 atlantis ns 下面  atlantis svc。

(Optional)Ingress 和 atlantis 放在同一个namespace 下面,就不需要多一个 ExernalName service了。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sre-ingress-resource
annotations:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
nginx.ingress.kubernetes.io/proxy-body-size: 100m
nginx.ingress.kubernetes.io/proxy-buffer-size: 512k
nginx.ingress.kubernetes.io/client-body-buffer-size: 512k
ingress.kubernetes.io/ssl-redirect: "true"
ingress.kubernetes.io/force-ssl-redirect: "true" spec:
ingressClassName: nginx
rules:
- host: atlantis-demo.wadexu.cloud
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: atlantis-demo-ext-svc
port:
number: 8080
tls:
- hosts:
- atlantis-demo.wadexu.cloud
secretName: wade-tls-secret
---
apiVersion: v1
kind: Service
metadata:
name: atlantis-demo-ext-svc
spec:
type: ExternalName
externalName: atlantis.atlantis.svc.cluster.local
ports:
- name: http
port: 8080
targetPort: 4141
protocol: TCP

因为用了 https ,所以需要一个tls-secret

kubectl create secret -n dmz tls wade-tls-secret \
--key ./xxx.key \
--cert ./xxx.pem

build and apply

kustomize build ingress-nginx-public/sre-mgmt-dev/ > ~/deploy.yaml

kubectl apply -f ~/deploy.yaml

多个 Ingress Nginx Controller 部署

同一个cluster 如果要安装另一个ingress nginx controller,比如作为内部API网关,该怎么实现呢?

为了避免多个ingress controller 以一种困惑的方式同时争抢更新 ingress status字段,需要使用IngressClasses 官方文档

另外还要注意资源重名的情况,需要改name,否则后部署的Ingress controller 会覆盖前者, 比如 ClusterRoleBinding

参考 my manifests 部署在app namespace的internal Ingress nginx 针对以上资源的修改。

总结

一般来说,Ingress nginx 足以应付大部分场景了,除非你想用到一些高阶功能,比如流量管理,熔断等等。那么我会推荐 后起之秀基于Enovy的那些Ingress controller,比如Ambassador 现在叫Emissary, CNCF的incubating 项目。

感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以打赏和推荐,您的鼓励是我创作的动力。

云原生之旅 - 8)云原生时代的网关 Ingress Nginx的更多相关文章

  1. 云原生之旅 - 5)Kubernetes时代的包管理工具 Helm

    前言 上一篇文章 [基础设施即代码 使用 Terraform 创建 Kubernetes] 教会了你如何在Cloud上面建Kubernetes资源,那么本篇来讲一下如何在Kubernetes上面部署应 ...

  2. 云原生之旅 - 9)云原生时代网关的后起之秀Envoy Proxy 和基于Envoy 的 Emissary Ingress

    前言 前一篇文章讲述了基于Nginx代理的Kuberenetes Ingress Nginx[云原生时代的网关 Ingress Nginx]这次给大家介绍下基于Envoy的 Emissary Ingr ...

  3. 云原生之旅 - 7)部署Terrform基础设施代码的自动化利器 Atlantis

    前言 前面有几篇文章讲述了如何使用Terraform创建资源 (基础设施即代码 Terraform 快速入门, 使用 Terraform 创建 Kubernetes) 以及 Kubernetes时代的 ...

  4. 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes

    前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...

  5. 云原生之旅 - 6)不能错过的一款 Kubernetes 应用编排管理神器 Kustomize

    前言 相信经过前一篇文章的学习,大家已经对Helm有所了解,本篇文章介绍另一款工具 Kustomize,为什么Helm如此流行,还会出现 Kustomize?而且 Kustomize 自 kubect ...

  6. 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents

    前言 上一篇文章 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes 我们介绍了在 Kubernetes 上安装 Jenkins,本文介绍下如何设置k8s pod作为Je ...

  7. 持续优化云原生体验,阿里云在Serverless容器与多云上的探索

    近日,阿里云宣布推出Serverless Kubernetes服务此举意在降低容器技术的使用门槛.简化容器平台运维.并同时发布阿里云服务对Open Service Broker API标准支持,通过一 ...

  8. 微信小程序(七)-项目实例(原生框架 MINA转云开发)==02-云开发-配置

    云开发:1.就是用云函数的型式来使用云存储和云数据库完成各种操作!     2.只关注调什么函数,完成什么功能即可,无需关心HTTP请求哪一套!     3.此模式不代表没有服务器,只是部署在云环境中 ...

  9. Kindle:自动追更之云上之旅

    2017年5月27: 原来的程序是批处理+Python脚本+Calibre2的方式,通过设定定时任务的方式,每天自动发动到自己的邮箱中.缺点是要一直开着电脑,又不敢放到服务器上~~ 鉴于最近公司查不关 ...

随机推荐

  1. 关于stm32f10xRB系列的PB5和PB12外设冲突问题

      上周在公司做了一个项目,调试一个mcu,本以为很简单的调试一下裸机驱动,但是调试过程中遇到了一些问题让我觉得比较有意思,记录一下. 1.关于stm32的SMBUS功能的介绍   由于笔者也没有玩过 ...

  2. Java-随机数据生成器(造数据)

    概述 简单易用的随机数据生成器.一般用于开发和测试阶段的数据填充.模拟.仿真研究.演示等场景.可以集成到各种类型的java项目中使用. 优点 非常轻量级(不到1M),容易集成,无需过多第三方依赖 简单 ...

  3. Linux之Samba服务器搭建

    一,samba的基本概念 SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务. ...

  4. 读完 RocketMQ 源码,我学会了如何优雅的创建线程

    RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时.高可靠的消息发布与订阅服务. 这篇文章,笔者整理了 RocketMQ 源码中创建线程的几点技巧,希望大家读完之后,能 ...

  5. QT学习(四)----360界面制作(1)

    参照网上的资料,模仿了一份360新特效的界面. 源代码在:http://download.csdn.net/detail/zhangyang1990828/5238013 360真实效果:(最好自己打 ...

  6. JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport的park/unpark)

    一.前言 在多线程的场景下,我们会经常使用加锁,来保证线程安全.如果锁用的不好,就会陷入死锁,我们以前可以使用Object的wait/notify来解决死锁问题.也可以使用Condition的awai ...

  7. Elasticsearch:Elasticsearch SQL介绍及实例(二)

    转载自:https://blog.csdn.net/UbuntuTouch/article/details/105699014

  8. 第六章:Django 综合篇 - 3:使用MySQL数据库

    在实际生产环境,Django是不可能使用SQLite这种轻量级的基于文件的数据库作为生产数据库.一般较多的会选择MySQL. 下面介绍一下如何在Django中使用MySQL数据库. 一.安装MySQL ...

  9. Beats:运用 Logstash 来加工 Metricbeat 数据

    文章转载自:https://elasticstack.blog.csdn.net/article/details/116496272

  10. Logstash:解析 JSON 文件并导入到 Elasticsearch 中

    转载自:https://elasticstack.blog.csdn.net/article/details/114383426 在今天的文章中,我们将详述如何使用 Logstash 来解析 JSON ...