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

Ingress Controller

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

划重点

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

Ingress Controller 有多种实现可供选择,请参考 Kubernetes 官方文档 Additional controllers

,比较常用的有 Nginx Ingress Controller for Kubernetes等。

在 Kubernetes中安装Nginx Ingress Controller for Kubernetes

在您 Kubernetes 集群中的安装。该 Ingress Controller 以 DaemonSet 的类型部署到 Kubernetes,且监听了 hostPort 80/443,YAML 片段如下所示:

如果您打算使用其他 Ingress Controller,您可以 卸载 Nginx Ingress Controller;如果您尚未安装任何 Ingress Controller,请参考 安装 Nginx Ingress Controller,以便可以完成本教程的后续内容。

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: nginx-ingress
namespace: nginx-ingress
# ...
spec:
selector:
matchLabels:
app: nginx-ingress
template:
metadata:
labels:
app: nginx-ingress
spec:
serviceAccountName: nginx-ingress
containers:
- image: nginx/nginx-ingress:1.5.3
name: nginx-ingress
ports:
- name: http
containerPort: 80
hostPort: 80
- name: https
containerPort: 443
hostPort: 443

TIP

  • Ingress Controller 并非只能监听 80/443 端口,您可以根据自己网络拓扑的需要,选择合适的端口
  • 根据您安装 Ingress Controller 的方式不同,您的 Ingress Controller 并不一定监听了所有 worker 节点的 80/443 端口(本教程不涉及此主题)
  • 您也可以在 Kubernetes 集群中安装多种 Ingress Controller,请参考 Using multiple Ingress controllers

融入到网络拓扑中

如前所述,Kubernetes Ingress 只能监听到节点的 80/443 端口,且 Ingress 可以完成 L7 路由的功能。由于 Kubernetes Ingress 配置更便捷,推荐使用 Kubernetes Ingress 替代常规的互联网应用架构中的 Nginx 反向代理。那么,如何使部署在内网的 Kubernetes 集群上的 Ingress Controller 的 80/443 端口可以在外网访问到呢?

本教程推荐如下两种做法,结合您自己对安全性、可靠性等因素的考量,您可以演化出适合自己的拓扑结构。

暴露单worker节点

如下图所示,暴露单个 worker 节点的步骤如下:

  • 为您 Kubernetes 集群中的某一个 worker 节点配置外网 IP 地址 Z.Z.Z.Z
  • 将您在 Ingress 中使用到的域名(假设是a.demo.kuboard.cn)解析到该外网 IP 地址 Z.Z.Z.Z
  • 设置合理的安全组规则(开放该外网 IP 地址 80/443 端口的入方向访问)

文档 安装 Kubernetes 单Master节点 中使用的就是这种拓扑结构。这种方式下,Ingress Controller 存在单点故障的可能性。

使用外部负载均衡器

如下图所示,使用外部负载均衡器的步骤如下:

  • 创建一个集群外部的负载均衡器,该负载均衡器拥有一个外网 IP 地址 Z.Z.Z.Z,并监听 80/443 端口的 TCP 协议
  • 将负载均衡器在 80/443 端口上监听到的 TCP 请求转发到 Kubernetes 集群中所有(或某些)worker 节点的 80/443 端口,可开启按源IP地址的会话保持
  • 将您在 Ingress 中使用到的域名(假设是a.demo.kuboard.cn)解析到该负载均衡器的外网 IP 地址 Z.Z.Z.Z

文档 安装 Kubernetes 高可用 中使用的就是这种拓扑结构。

实战:通过 Ingress 使您的应用程序在互联网可用

前提

  • 假设您已经完成了 公布应用程序 中的实战部分
  • 假设您已经将 Ingress 融入到您的网络拓扑中,并且将 *.demo.kuboard.cn (请使用您自己的域名)解析到对应的外网 IP 地址 (暂时可以通过修改主机hosts文件的方式来实现)
  • 使用kubectl

创建文件 nginx-deployment.yaml

vim nginx-deployment.yaml

文件内容如下

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9

创建文件 nginx-service.yaml

vim nginx-service.yaml

文件内容如下

apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
selector:
app: nginx
ports:
- name: nginx-port
protocol: TCP
port: 80
nodePort: 32600
targetPort: 80
type: NodePort

创建文件 nginx-ingress.yaml

vim nginx-ingress.yaml

文件内容如下

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress-for-nginx # Ingress 的名字,仅用于标识
spec:
rules: # Ingress 中定义 L7 路由规则
- host: a.demo.kuboard.cn # 根据 virtual hostname 进行路由(请使用您自己的域名)
http:
paths: # 按路径进行路由
- path: /
backend:
serviceName: nginx-service # 指定后端的 Service 为之前创建的 nginx-service
servicePort: 80

执行命令

kubectl apply -f nginx-deployment.yaml
kubectl apply -f nginx-service.yaml
kubectl apply -f nginx-ingress.yaml

检查执行结果

kubectl get ingress -o wide

可查看到名称为 my-ingress-for-nginx 的 Ingress。

从互联网访问

# 请使用您自己的域名,或者使用浏览器访问(前提是已经修改了主机的hosts文件)
curl a.demo.kuboard.cn

示例:Ingress通过互联网访问应用的更多相关文章

  1. [转帖]在 k8s 中通过 Ingress 配置域名访问

    在 k8s 中通过 Ingress 配置域名访问 https://juejin.im/post/5db8da4b6fb9a0204520b310 在上篇文章中我们已经使用 k8s 部署了第一个应用,此 ...

  2. 使用kubeoperator自带的nginx-ingress-controller设置服务的ingress规则进行访问

    情况说明 当使用kubeoperator安装k8s集群的时候,在组件设置部分选择的ingress 类型是nginx-ingress yaml文件 k8s集群安装后,可以在节点的master主机的这个目 ...

  3. 表单填写示例(通过JavaScript访问DOM)

    自己写就的代码,再烂也是自己的- 实现代码 <!DOCTYPE html><html lang="en"><head> <meta cha ...

  4. GPS坐标转百度地图并且加载地图示例.支持微信端访问

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Wx_VehicleLoca ...

  5. 示例:Service连接应用程序

    整体思路: 1.创建pod 2.创建关联上一步pod的service 3.使用不同的方式配置service从而能够在集群内部访问 4.使用ssl方式加密访问service 5.配置service为no ...

  6. Ingress 访问日志分析与监控

    阿里云Ingress除了提供外部可访问的 URL.负载均衡.SSL.基于名称的虚拟主机外,还支持将所有用户的HTTP请求日志记录到标准输出中.同时Ingress访问日志与阿里云日志服务打通,您可以使用 ...

  7. Kubernetes K8S之Ingress详解与示例

    K8S之Ingress概述与说明,并详解Ingress常用示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...

  8. 转载NodePort,LoadBalancer还是Ingress?我该如何选择 - kubernetes

    原文:http://mp.weixin.qq.com/s/dHaiX3H421jBhnzgCCsktg ClusterIP ClusterIP服务是Kuberntets的默认服务.它在集群内部生成一个 ...

  9. NodePort,LoadBalancer还是Ingress?我该如何选择 - kubernetes

    原文:http://mp.weixin.qq.com/s/dHaiX3H421jBhnzgCCsktg 当我们使用k8s集群部署好应用的Service时,默认的Service类型是ClusterIP, ...

随机推荐

  1. Qt+ECharts开发笔记(三):ECharts的柱状图介绍、基础使用和Qt封装Demo

    前言   上一篇成功是EChart随着Qt窗口变化而变化,本篇将开始正式介绍柱状图介绍.基础使用,并将其封装一层Qt.  本篇的demo实现了隐藏js代码的方式,实现了一个条形图的基本交互方式,即Qt ...

  2. 5-17 ELK 日志采集查询保存

    ELK简介 什么是ELK ELK: E:Elasticsearch 全文搜索引擎 L:logstash 日志采集工具 K:Kibana ES的可视化工具 ELK是当今业界非常流行的日志采集保存和查询的 ...

  3. IDEA中web项目打成war包并在本地tomcat部署(超细版)

    准备工作:相关软件及插件IDEA(2021.1.3).tomcat(8.5.50)且在IDEA中调用tomcat运行时没有任何错误的,如何下载安装百度都有详细的介绍,这里就不过多的介绍了,版本不同操作 ...

  4. 注解_概念和注解_JDK内置注解

    注解: 概念:说明程序的,给计算机看的 注解:用文字描述程序的,给程序员看的 定义:注解(Annotation),也叫元数据.一种代码级别的说明.他是JDK1.5及以后的版本引入的一个特性,与类,接口 ...

  5. SpringBoot 集成 FreeMarker 导出 Word 模板文件(底部附源码)

    思路解说 word 模板文件(doc 或 docx 文件)另存为 xml 文件 将后缀 xml 改成 html:大部分文档会改成 ftl(FreeMarker 的后缀名),因为 word 文件另存为 ...

  6. 无法访问mybatis.dto.StudengInVO-使用maven编译报错-2022新项目

    一.问题由来 最近一次拉代码后,合并代码然后进行编译时出现一个问题,使用maven在进行编译的时候报一个错,无法访问mybatis.dto.StudengInVO. 突然出现这个错误让自己感觉很奇怪, ...

  7. Docker部署kafka|Go操作实践

    前言 写作本文的背景是由于字节的暑期青训营中,某个项目要求编写一个简易的流处理引擎(flink),开发语言不限,推荐Java,本着好奇心的驱使,我打算使用Go语言进行部分尝试. 既然是流处理引擎,那么 ...

  8. 万答#21,如何查看 MySQL 数据库一段时间内的连接情况

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 查看方式 已知至少有两种方式可以实现 1.开启 general_log 就可以观察到 开启命令 mysql> set ...

  9. Android 自定义View - 柱状波形图 wave view

    前言 柱状波形图是一种常见的图形.一个个柱子按顺序排列,构成一个波形图. 柱子的高度由输入数据决定.如果输入的是音频的音量,则可得到一个声波图. 在一些音频软件中,我们也可以左右拖动声波,来改变音频的 ...

  10. Ansible yaml 剧本(傻瓜式)

    优化ansible安装MySQL: Ansible部署MySQL编译安装 - xiao智 - 博客园 (cnblogs.com) Ansible yaml 剧本(傻瓜式): --- - hosts: ...