写点什么

如何从 Ingress NGINX 无缝迁移到 OpenNJet KIC

作者:通明湖
  • 2025-12-04
    北京
  • 本文字数:3370 字

    阅读完需:约 11 分钟

一.为什么要迁移到 OpenNJet KIC

Ingress NGINX 退役引发开发者们的强烈关注,OpenNJet 作为一款基于 NGINX 开发的云原生 流量管理平台,在保留 NGINX 稳定性的基础上,针对云原生场景进行了深度优化。根据 OpenNJet 官方测试数据,其 K8s Ingress Controller (KIC)在高并发场景下的请求处理延迟比 Ingress NGINX 降低 15%,内存占用减少 20%,这对于大规模集群来说意味着显著的资源节省和性能提升。

二.迁移前的环境准备

在开始迁移前,需要确保环境满足以下要求:

运行环境要求

  • Kubernetes 集群版本:1.21+(推荐 1.26 或更高版本以获得最佳兼容性)

  • 集群节点资源:每个节点至少 2 CPU 核心 和 4 GB 内存

镜像文件准备

OpenNJet KIC 的镜像文件可以从 dockerhub 上获取,目前版本 tmlake/njet-ingress:2.0 。如果 k8s 集群使用企业内部自己的 docker 镜像仓库,请下载镜像后自行上传到企业自己的镜像仓库。

注:k8s 集群所有 node 节点都需要有此镜像

OpenNJet deployments 压缩包解压后,部署需要的 yaml 文件在 deployments/目录下。

压缩包中的文件列表: ├── common

│ ├── crds

│ │ ├── k8s.njet.org_policies.yaml (⾃定义资源 policies)

│ │ ├── k8s.njet.org_transportservers.yaml (⾃定义资源 transportservers)

│ │ ├── k8s.njet.org_virtualserverroutes.yaml (⾃定义资源 VirtualServerRoute)

│ │ └── k8s.njet.org_virtualservers.yaml (⾃定义资源 VirtualServer)

│ ├── njet-class.yaml ( IngressClass 资源)

│ ├── njet-configMap.yaml ( configMap 资源)

│ └── ns-and-sa.yaml (Namespace 和 ServiceAccount 服务)

├── deployment

│ └── njet-ingress.yaml (kic-Deployment⽂件)

├── rbac

│ └── rbac.yaml (ClusterRole ⽂件)

├── secret

│ ├── a.test.com.crt (openssl⽣成的所需证书 crt⽂件)

│ ├── a.test.com.key (openssl⽣成的所需证书 key⽂件)

│ └── secret-a.test.com.yaml (创建的证书⽂件)

└── service

├── cafe-ingress.yaml (举例⽤到的服务所关联的 ingress)├── cafe-svc.yaml (部署举例服务的⽂档,Service、Deployment)

├── cafe-vs.yaml (举例服务的 VirtualServer)

├── loadbalancer.yaml (LoadBalancer 类型的 kic Service⽂件)

└── nodeport.yaml (NodePort 类型的 kic Service⽂件

环境检查清单

在执⾏迁移前,建议运⾏以下命令检查集群状态:

# 检查节点状态kubectl get nodes# 检查现有 Ingress 资源kubectl get ingress --all-namespaces# 检查现有Ingress NGINX 部署kubectl get deployment -n ingress-nginx
复制代码

确保所有节点状态为 Ready,且现有 Ingress 资源运⾏正常。同时,建议备份当前的 Ingress 配置,以便在迁移过程中出现问题时可以快速回滚。

三、基础资源创建

迁移到 OpenNJet KIC 的第⼀步是创建必要的基础资源,包括命名空间、服务账⼾和 RBAC 权 限配置。

创建基础资源

OpenNJet -KIC 部署时需要添加命名空间,服务账号及设置⻆⾊权限,请具有集群管理权限的 ⼈员执⾏以下步骤的操作。

为 kic 创建命名空间和服务帐⼾:

# 执⾏以下命令进⾏相关部署 :cd deployments/kubectl apply -f common/ns-and-sa.yaml
复制代码

ns-and-sa.yaml

YAMLapiVersion: v1kind: Namespacemetadata: name: njet-ingress---apiVersion: v1kind: ServiceAccountmetadata: name: njet-ingress namespace: njet-ingress
复制代码


为服务帐户创建集群角色和群集角色绑定:

kubectl apply -f rbac/rbac.yaml
复制代码

创建 IngressClass 资源

kubectl apply -f rbac/rbac.yaml

复制代码

njet-class.yaml

apiVersion: networking.k8s.io/v1kind: IngressClassmetadata:name: njet# annotations:# ingressclass.kubernetes.io/is-default-class: "true"spec:controller: njet.org.cn/ingress-controller
复制代码

创建自定义资源

为 VirtualServer 和 VirtualServerRoute、TransportServer 和 Policy 资源创 建自定义资源定义:

kubectl apply -f common/crds/k8s.njet.org_virtualservers.yamlkubectl apply -f common/crds/k8s.njet.org_virtualserverroutes.yamlkubectl apply -f common/crds/k8s.njet.org_policies.yamlkubectl apply -f common/crds/k8s.njet.org_transportservers.yaml

复制代码

创建全局配置

kubectl apply -f common/njet-configMap.yaml
复制代码

njet-configMap.yaml

kind: ConfigMapapiVersion: v1metadata:name: njet-confignamespace: njet-ingressdata:
复制代码

目前 njet 一些全局配置均使用默认值,提供一个空的 ConfigMap 即可。

四、部署 OpenNJet KIC

部署 kic-deploy

kubectl apply -f deployment/njet-ingress.yaml
复制代码

njet-ingress.yaml

  • kic 实例需指定 IngressClass:此文件中指定的 ingress-class=“ ” 要与上述 IngressClass 资源中的 metadata.name 保持一致

  • Ingress Controller 在高负载的情况下,需要配置足够的 CPU/MEM 限额以保证代理的性能,建议能够提供 CPU"16"核,MEM 512M。

  • Ingress Controller 监听的 IngressClass 通过应用的命令行参数 “-ingress-class=njet” 指定。

apiVersion: apps/v1kind: Deploymentmetadata:name: njet-ingressnamespace: njet-ingressspec:replicas: 1selector:matchLabels:app: njet-ingresstemplate:metadata:labels:app: njet-ingress#annotations:#prometheus.io/scrape: "true"#prometheus.io/port: "9113"#prometheus.io/scheme: httpspec:serviceAccountName: njet-ingressautomountServiceAccountToken: truecontainers:- image: tmlake/njet-ingress:2.0 #imagePullPolicy: IfNotPresentname: njet-ingressports:- name: httpcontainerPort: 80- name: httpscontainerPort: 443- name: readiness-portcontainerPort: 8081- name: prometheuscontainerPort: 9113readinessProbe:httpGet:path: /nginx-readyport: readiness-portperiodSeconds: 1resources:换成镜像的对应版本requests:cpu: "1"memory: "128Mi"limits:cpu: "16"memory: "512Mi"securityContext:allowPrivilegeEscalation: trueprivileged: true #You can use sudorunAsUser: 101 #nginxrunAsNonRoot: truecapabilities:drop:- ALLadd:- NET_BIND_SERVICEenv:- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.nameargs:- -njet-configmaps=$(POD_NAMESPACE)/njet-config- -ingress-class=njet- -v=2- -ingress-version=networking/v1- -watch-endpointslices=true #true: k8s version > 1.21- -global-configuration=$(POD_NAMESPACE)/njet-configuration

复制代码

根据业务情况可选择创建 kic 多副本 将以上 yaml 中“spec.replicas ”值设置成非 1 ,如设置 3 个副本, replicas:3

Bash#node ip + kic port请求curl http://192.168.40.130:31830/ -vv
复制代码


根据请求可以发现流量是可以到达所有正常状态的 kic-pod


创建 kic-svc

NodePort 方式

kubectl apply -f service/nodeport.yaml

复制代码

nodeport.yaml

apiVersion: v1kind: Servicemetadata:name: njet-ingressnamespace: njet-ingressspec:type: NodePortports:- port: 80targetPort: 80protocol: TCPname: http- port: 443targetPort: 443protocol: TCP复制name: httpsselector:app: njet-ingress


复制代码

检验部署是否成功

执行以下命令进行查看 pod 运行情况,STATUS 为“running” “READY 1/1” 即为成功 同时可获取 kic 的对外暴露端口为:31214

kubectl get pods -n njet-ingress -owidekubectl get svc -n njet-ingress -owide
复制代码


五、总结与展望

从 Ingress NGINX 迁移到 OpenNJet KIC 是一个渐进式过程,通过本文介绍的步骤,可以实现平滑迁移并充分利用 OpenNJet 带来的性能优势和高级功能。根据 OpenNJet 社区的反馈,大多数企业在迁移后 2-4 周内即可完成所有验证和优化工作,并开始享受资源节省和性能提升带来的好处。

随着云原生技术的不断发展,流量管理作为关键基础设施,其重要性不言而喻。OpenNJet 凭借其轻量级架构、丰富的插件生态和针对云原生场景的深度优化,正逐渐成为下一代流量管理的首选方案。对于正在考虑替换 Ingress NGINX 的企业来说,现在正是评估和迁移的理想时机。

发布于: 2025-12-04阅读数: 3
用户头像

通明湖

关注

让应用永远在线! 2022-10-13 加入

持续科技创新,信创应用交付领域的排头兵

评论

发布
暂无评论
如何从Ingress NGINX无缝迁移到OpenNJet KIC_通明湖_InfoQ写作社区