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


                                                                                                                                                <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
img

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

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
img

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

img

创建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
img

五、总结与展望

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

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

                                                                                </div>



Source link

未经允许不得转载:紫竹林-程序员中文网 » 如何从Ingress NGINX无缝迁移到OpenNJet KIC

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
关于我们 免责申明 意见反馈 隐私政策
程序员中文网:公益在线网站,帮助学习者快速成长!
关注微信 技术交流
推荐文章
每天精选资源文章推送
推荐文章
随时随地碎片化学习
推荐文章
发现有趣的