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

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

环境检查清单

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

csharp 复制代码
# 检查节点状态
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创建命名空间和服务帐⼾:

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

ns-and-sa.yaml

yaml 复制代码
YAML
apiVersion: v1
kind: Namespace
metadata:
 name: njet-ingress
---
apiVersion: v1
kind: ServiceAccount
metadata:
 name: njet-ingress
 namespace: njet-ingress

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

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

创建 IngressClass 资源

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

njet-class.yaml

vbnet 复制代码
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资源创 建自定义资源定义:

bash 复制代码
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

创建全局配置

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

njet-configMap.yaml

makefile 复制代码
kind: ConfigMap
apiVersion: v1
metadata:
name: njet-config
namespace: njet-ingress
data:

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

四、部署 OpenNJet KIC

部署kic-deploy

bash 复制代码
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" 指定。
yaml 复制代码
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

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

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

创建kic-svc

NodePort方式

bash 复制代码
kubectl apply -f service/nodeport.yaml

nodeport.yaml

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

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

五、总结与展望

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

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

相关推荐
iru1 小时前
nginx被报CVE-2025-1695漏洞,检查后反馈是误报
运维·nginx
cnskylee9 小时前
【Nginx】Nginx-1.28.1版本已恢复对CentOS 7的兼容性
运维·nginx·centos
Knight_AL1 天前
Docker 中的端口映射原理:为什么 Nginx 要 `listen 80`,而不是“随便写端口”
nginx·docker·容器
虹梦未来1 天前
【运维心得】Ubuntu2404编译nginx隐藏Server信息
运维·服务器·nginx
tgethe1 天前
Nginx笔记
运维·笔记·nginx
invicinble1 天前
对于nginx(一,认识nginx)
运维·nginx
徒手千行代码无bug1 天前
Nginx upstream 负载均衡 404,单节点转发正常的根因与解决
运维·nginx·负载均衡
irisart1 天前
第二章【NGINX 开源功能】—— 七层反向代理(下)
运维·nginx
xixiyuguang1 天前
nginx tar离线安装 ubuntu22.04
运维·nginx
丁丁丁梦涛1 天前
nginx解决域名代理到IP+端口的平台静态资源和接口地址问题
运维·tcp/ip·nginx