You need to enable JavaScript to run this app.
导航

注册节点安装 Ingress Nginx 实践

最近更新时间2024.04.26 15:29:02

首次发布时间2024.04.26 15:29:02

分布式云原生平台提供的注册节点服务通过在注册节点池部署 Nginx Ingress Controller,为边缘单元下的服务提供外部访问及负载均衡等功能,能够有效解决云边协同场景中边缘节点下服务呈现本单元访问闭环的情况。本文为您介绍注册节点安装 Ingress Nginx 的详细使用方法。

场景介绍

分布式云原生平台的注册节点服务,提供远程节点接入和管理能力,解决企业自有 IDC 闲散服务器无法高效利用和运维的难题,以及存在大量局点的服务器管理与应用发布升级问题。

通过使用分布式云原生平台的注册节点服务,可省去搭建和维护本地 Kubernetes 集群的成本,将本地或 IDC 中的服务器注册到云上,提供统一的节点管理与应用发布能力。

背景信息

部署 Ingress ,需要考虑以下几个方面:ingress-controller 作为 Pod 运行时,应当采用什么方式部署?Ingress 解决了如何把请求路由到集群内部的问题,那如何暴露给外部?云边协同场景下,因云边网络连通限制,ingress-controller 是否需要在边缘单元内部署?

综上所述,Ingress-Nginx 的常见工作模式和适用性如下:

  • 【不适用】Deployment+LoadBalancer 模式的 Service+注册节点部署

使用 Deployment 部署 ingress-controller,然后创建一个 type 为 LoadBalancer 的 service 关联这组 Pod,最后为 LoadBalancer 的 service 自动创建一个负载均衡器,并绑定公网地址。此时,只需要将域名解析指向该地址,就实现了集群服务的对外暴露。此方式适用于需要将 Ingress 部署到公有云的场景,并不适用于注册节点部署。

  • 【可选方案】Deployment+NodePort 模式的 Service+注册节点部署

使用 deployment 模式结合 nodeselector 将 ingress-controller 部署到特定注册节点,并创建对应的 NodePort 类型服务,此时,Ingress 就会暴露在注册节点 IP 的特定端口上。由于 NodePort 通过随机端口暴露,可再搭建一套负载均衡器来转发请求。此方式通常适用于宿主机相对固定,IP 地址不变的场景。NodePort 方式暴露 Ingress 虽然简单方便,但 NodePort 多了一层 NAT,请求量较大时可能对性能造成一定影响。

  • 【可选方案】DaemonSet+HostNetwork+注册节点部署

使用 DaemonSet 模式结合 nodeselector 将 ingress-controller 部署到特定注册节点,然后使用 HostNetwork 打通 Pod 与宿主机 Node 间的网络,直接使用宿主机 80/433 端口即可访问服务。此时,ingress-controller 所在的 Node 机器类似传统架构的边缘节点(例如:机房入口的 Nginx 服务器)。此方式的整个请求链路最简单,性能相对 NodePort 模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个 Node 只能部署一个 ingress-controller pod,比较适合大并发的生产环境使用。

前提条件

  • 注册火山引擎账号并完成 实名认证,并前往 分布式云原生控制台 按照首次使用指引开通分布式云原生平台。
  • 已经开通分布式云原生平台依赖的服务,例如:提供容器集群的 容器服务、用于托管容器镜像的 镜像仓库 服务。
  • 已经准备待添加节点(例如:云下站点/IDC 中的主机),并保证网络连通性。

使用限制

  • 目前仅支持使用 Kubernetes 版本为 v1.20、v1.24 或 v1.26 的 VKE 托管集群作为控制面。
  • 目前支持添加节点的主机 OS 及内核为:Centos 7.9 (3.10)、Alibaba Cloud Linx 2.1903(4.19)、ubuntu 18.04(4.15)、ubuntu 20.04(5.4)。
  • 目前支持将 CPU 架构为 x86_64 的主机添加为注册节点。

操作步骤

本文从 0 到 1 为您详细介绍注册节点安装 Ingress Nginx 并通过外部访问,可参考如下步骤依次执行。

步骤一:搭建注册节点服务基础环境

  1. 创建并注册 VKE 集群:登录 分布式云原生控制台,前往容器集群管理页面,创建符合要求的 VKE 集群并注册到分布式云原生平台。

alt

本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建集群

配置项说明
地域VKE 集群所属的地域,可在顶部导航栏切换。本场景选择 华北2(北京)地域,与后续注册节点服务所属地域保持一致。
Kubernetes 版本根据实际情况选择即可,可用于注册节点服务的控制面集群支持的 Kubernetes 版本包括:v1.20、v1.24 或 v1.26。
容器网络模型容器集群使用的网络模型,根据实际情况选择即可,可用于注册节点服务的控制面集群支持的网络模型包括:VPC-CNI、Flannel。
API Server 公网访问默认关闭,本场景需要开启此配置,确保后续能够通过公网连接到集群的 API Server 地址。
  1. 启用注册节点服务:登录 分布式云原生控制台,选择方才创建并注册的 VKE 集群,启动注册节点服务。更多详细介绍参见:启用注册节点服务

alt

  1. 创建注册节点池:前往注册节点服务管理页,创建一个 网络模型为公网 的注册节点池。更多详细介绍参见:创建注册节点池

alt

  1. 注册节点池添加节点:基于指定注册节点池可添加注册节点,并将下图中的脚本信息在目标待接入节点中运行,注册节点成功接入后可查看节点信息。更多详细介绍参见:注册节点池添加节点

alt

步骤二:在注册节点安装 Ingress Nginx

  1. 登录 容器服务控制台
  2. 在左侧导航栏,选择 应用中心 > 应用模板
  3. 在 应用模板 页面,找到 Ingress-nginx 应用模板,鼠标悬停在该应用模板区域,然后单击 部署
  4. 在 部署应用 页面,根据如下表参数说明,配置参数。

alt

部署应用时指定注册节点服务管控 VKE 集群,并选择 Chart 模板版本,同时考虑到 Ingress-Nginx 在注册节点配置的差异性,需要手动修改 values.yaml 参数。

以容器服务应用中心的 ingress-nginx 应用模板为例(版本:v1.8.4-vke.1) ,不同部署模式下的配置参数说明如下:

配置类型配置说明

部署模式

Ingress Nginx Controller 负载类型,可选 Deployment、DaemonSet。

服务类型

Ingress Nginx Controller 负载服务暴露方式可调整为 NodePort 类型,如果负载通过 HostNetwork 访问,此处可以配置为 ClusterIP。

HostNetwork 访问

Ingress Nginx Controller 负载实例访问方式,可配置为HostNetwork: true

注册节点选择

Ingress Nginx Controller 负载实例期望调度的目标注册节点,可通过内置或者自定义注册节点标签选择。内置标签参考:

  • node.kubernetes.io/instance-type: dcp-node,注册节点类型的节点。

  • apps.openyurt.io/nodepool: ${注册节点池ID},指定注册节点池下所有注册节点。

  • kubernetes.io/hostname: ${注册节点名},指定一个注册节点,本文示例使用该方式。

admissionWebhooks

需要关闭 Ingress Nginx Controller 的 admissionWebhooks,否则会因为云上云下网络不通导致 Ingress 资源创建失败,配置如下:
enable: false

VPC-CNI 网络模型配置

如果使用了 VPC-CNI 模式的 VKE 集群作为注册服务管控,需要在 Controller 的 podlabels 添加以下 label,让 webhook 不要自动注入 eni-require。
component: general-webhook

步骤三:注册节点服务通过 Ingress 外部访问

  1. 登录 分布式云原生控制台,创建一个运行在注册节点池的应用。

本场景涉及的关键配置说明如下,其他按需配置即可,详细操作步骤和配置项说明参见:创建无状态负载

配置项说明
容器镜像创建工作负载所需的镜像,本场景使用 nginx,需确保此镜像已经添加到镜像仓库。
容器版本创建工作负载所需镜像的版本,本场景使用 alpine,需确保此版本的镜像已经添加到镜像仓库。

强制调度

调度策略中需要强制调度到注册节点中,可通过以下标签配置(本场景使用第二种方式,指定注册节点池安装)。

  • node.kubernetes.io/instance-type: dcp-node,注册节点类型的节点。

  • apps.openyurt.io/nodepool: ${注册节点池ID},指定注册节点池下所有注册节点。

  • kubernetes.io/hostname: ${注册节点名},指定一个注册节点。

说明

工作负载创建成功后,需要前往工作负载详情页,查看节点 IP,确保实例成功调度到了注册节点上运行。

  1. 前往注册节点管控 VKE 集群,为工作负载创建一个 ClusterIP 类型的 Service。更多详细介绍参见:集群内访问(ClusterIP)

alt

  1. 为工作负载的服务添加一个 Ingress 路由规则,要求 Ingress Class 指定为以上部署安装的 Ingress Nginx,同时配置转发规则域名和目标服务。更多详细介绍参见:通过控制台创建 Nginx Ingress

alt

  1. 在本地 host 文件配置中配置以上创建 Ingress 路由规则中的「域名(dcp.node.com)」 和 「Ingress Nginx Controller 所在注册节点 IP」 的映射,同时从 Controller 的 Service 中获取暴露的 NodePort。

说明

本场景中的域名属于测试域名,必须在本地 host 文件配置中配置以上创建 Ingress 路由规则中的「域名(dcp.node.com)」 和 「Ingress Nginx Controller 所在注册节点 IP」 的映射,否则不能访问,此步骤不能省略。

alt

此时,可通过 Ingress 域名及端口可以成功访问注册节点上的应用。

alt

  1. 前往容器服务的 Helm 应用页面,更新 Ingress Nginx 模板应用的配置,将 values.yaml 中的 hostNetwork 设置为 true 后重新部署。即可将 Ingress Nginx Controller 通过 HostNetwork 访问。更多详细介绍参见:更新 Heml 应用

alt

此时,因 Controller 实例可直接通过注册节点的 80、443 端口暴露,基于以上配置的域名和 IP 映射,直接访问域名(无需指定 Service NodePort)即可访问到注册节点上的应用。

alt

步骤四:多个注册节点池安装 Ingress Nginx 并访问

  1. 重复步骤一中的《创建节点池》和《注册节点池添加节点》,新建一个节点池并注册一个新节点。
  2. 重复步骤二,在容器服务应用中心部署一个新的 Ingress Nginx 模板应用。

注意

本次配置需要注意:在ingressClassResource配置项中设置namecontrollerValue,并在同一个集群中多次部署 ingress-nginx 时,确保每次部署的namecontrollerValue唯一。

  1. 参考步骤三,创建一个运行在新注册节点池的应用,为新的注册节点应用创建 Service 并暴露 Ingress。值得注意的是:IngressClass 需要指定新建的,域名指定为 dcp.node2.com。

alt

  1. 通过 Ingress 域名+ Controller 暴露 NodePort 端口访问应用。

alt