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

🙈 By 王雪光 2025-11-28

一.为什么要迁移到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

YAML
apiVersion: v1
kind: Namespace
metadata:
 name: njet-ingress
---
apiVersion: v1
kind: ServiceAccount
metadata:
 name: njet-ingress
 namespace: njet-ingress

img

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

kubectl apply -f rbac/rbac.yaml

创建 IngressClass 资源

kubectl apply -f rbac/rbac.yaml

njet-class.yaml

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
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.yaml
kubectl apply -f common/crds/k8s.njet.org_virtualserverroutes.yaml
kubectl apply -f common/crds/k8s.njet.org_policies.yaml
kubectl apply -f common/crds/k8s.njet.org_transportservers.yaml

创建全局配置

kubectl apply -f common/njet-configMap.yaml

njet-configMap.yaml

kind: ConfigMap
apiVersion: v1
metadata:
name: njet-config
namespace: njet-ingress
data:

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

四、部署 OpenNJet KIC

部署kic-deploy

kubectl apply -f deployment/njet-ingress.yaml

njet-ingress.yaml

    1. kic实例需指定IngressClass:此文件中指定的 ingress-class=“ ” 要与上述IngressClass 资源中的metadata.name 保持一致
    1. Ingress Controller 在高负载的情况下,需要配置足够的 CPU/MEM 限额以保证代理的性能,建议能够提供CPU"16"核,MEM 512M。
    1. Ingress Controller 监听的 IngressClass 通过应用的命令行参数 “-ingress-class=njet” 指定。
apiVersion: apps/v1
kind: Deployment
metadata:
name: njet-ingress
namespace: njet-ingress
spec:
replicas: 1
selector:
matchLabels:
app: njet-ingress
template:
metadata:
labels:
app: njet-ingress
#annotations:
#prometheus.io/scrape: "true"
#prometheus.io/port: "9113"
#prometheus.io/scheme: http
spec:
serviceAccountName: njet-ingress
automountServiceAccountToken: true
containers:
- image: tmlake/njet-ingress:2.0 #
imagePullPolicy: IfNotPresent
name: njet-ingress
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: readiness-port
containerPort: 8081
- name: prometheus
containerPort: 9113
readinessProbe:
httpGet:
path: /nginx-ready
port: readiness-port
periodSeconds: 1
resources:
换成镜像的对应版本requests:
cpu: "1"
memory: "128Mi"
limits:
cpu: "16"
memory: "512Mi"
securityContext:
allowPrivilegeEscalation: true
privileged: true #You can use sudo
runAsUser: 101 #nginx
runAsNonRoot: true
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
args:
- -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

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

img

创建kic-svc

NodePort方式

kubectl apply -f service/nodeport.yaml

nodeport.yaml

apiVersion: v1
kind: Service
metadata:
name: njet-ingress
namespace: njet-ingress
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
复制name: https
selector:
app: njet-ingress


检验部署是否成功

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

kubectl get pods -n njet-ingress -owide
kubectl get svc -n njet-ingress -owide

img

五、总结与展望

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

随着云原生技术的不断发展,流量管理作为关键基础设施,其重要性不言而喻。OpenNJet 凭借其轻量级架构、丰富的插件生态和针对云原生场景的深度优化,正逐渐成为下一代流量管理的首选方案。对于正在考虑替换 Ingress NGINX 的企业来说,现在正是评估和迁移的理想时机。最后,迁移过程中遇到任何问题,都可以通过以下渠道获取帮助:

  • OpenNJet社区:https://gitee.com/njet-rd/njet/tags

  • OpenNJet官方文档:https://docs.njet.org.cn/docs/latest/

  • 技术讨论组:QQ 607280080