<h2 style="line-height: 34px">一.为什么要迁移到OpenNJet KIC</h2>
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 的企业来说,现在正是评估和迁移的理想时机。
</div>