nginx-ingress部署+跨命名空间转发

该文详细介绍了如何在k8s1.23.6版本的集群中,基于CentOS系统和Docker服务部署nginx-ingress。首先,通过替换镜像源将deploy.yaml文件中的外部镜像替换为国内源。接着,修改负载方式为NodePort并应用部署。然后,创建service-nodeport.yaml文件并部署,确保可以通过指定IP:NodePort访问。最后,创建service和ingress规则,实现对特定业务的外部访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、环境信息

  • k8s集群版本:1.23.6
  • ingress版本:1.1.1
  • 操作系统版本:CentOS Linux release 7.9.2009 (Core)
  • docker服务:Docker version 20.10.21, build baeda1f
  • k8s控制节点IP:xxx.xxx.150.14
  • 网站地址:xxxops.cn

二、k8s环境搭建

参考链接:K8s 1.23.6版本部署:kubelet-1.23.6+kube-proxy-1.17.6


三、ingress环境搭建

3.1 deploy.yaml文件

1、下载deploy.yaml文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml

2、替换镜像源,修改为国内源
k8s.gcr.io/ingress-nginx/controller:v1.1.1
替换为
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.1.1
k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1
替换为
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1

sed -i 's/k8s.gcr.io\/ingress-nginx\/controller:v1.1.1\@sha256:0bc88eb15f9e7f84e8e56c14fa5735aaa488b840983f87bd79b1054190e660de/registry.cn-hangzhou.aliyuncs.com\/google_containers\/nginx-ingress-controller:v1.1.1/g' deploy.yaml;
sed -i 's/k8s.gcr.io\/ingress-nginx\/kube-webhook-certgen:v1.1.1\@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660/registry.cn-hangzhou.aliyuncs.com\/google_containers\/kube-webhook-certgen:v1.1.1/g' deploy.yaml;

3、修改负载方式,修改负载方式为NodePort,注释externalTrafficPolicy

sed -i 's/type: LoadBalancer/type: NodePort/g' deploy.yaml;
sed -i 's/externalTrafficPolicy: Local/#externalTrafficPolicy: Local/g' deploy.yaml;

4、执行部署

kubectl apply -f deploy.yaml

5、查看部署结果

kubectl get pod -n ingress-nginx
[root@k8s-master ~]# kubectl get pod -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-2m6cn        0/1     Completed   0          75m
ingress-nginx-admission-patch-x9x2m         0/1     Completed   0          75m
ingress-nginx-controller-74c6bcdc65-425jf   1/1     Running     0          75m

3.2 service-nodeport.yaml文件

1、下载deploy.yaml文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

2、执行deploy.yaml文件

kubectl apply -f service-nodeport.yaml

3、查看执行结果

kubectl get svc -n ingress-nginx
[root@k8s-master ~]# kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP                                PORT(S)                      AGE
ingress-nginx                        NodePort       10.107.28.54     <none>                                     80:30716/TCP,443:31305/TCP   72m
ingress-nginx-controller             NodePort       10.100.159.4     <none>                                     80:31247/TCP,443:31575/TCP   73m
ingress-nginx-controller-admission   ClusterIP      10.106.162.218   <none>                                     443/TCP                      73m

验证
访问xxx.xxx.150.14:31247验证是否可以出现404提示,出现404提示表示部署正常
在这里插入图片描述

四、按照业务建立service及ingress

4.1 业务信息

  • 前端服务的service名称:xxxops-frontend
  • 前端服务所处命名空间名称:xxxops
  • 前端服务暴露端口:8080

前端服务service信息图如下
在这里插入图片描述

4.2 建立service

1、准备部署文件

这里的service是要引用其他命名空间的服务,所以type是ExternalName
配置文件:xxxops-dashboard.yaml

apiVersion: v1
kind: Service
metadata:
  name: xxxops-frontend      #service的名字
  namespace: ingress-nginx   #ingress-controller所在的namespace
spec:
  type: ExternalName     
  sessionAffinity: None
  externalName: xxxops-frontend.xxxops.svc.cluster.local 
  #servicename.namespacename.scv.cluster.local

2、执行部署

kubectl apply -f xxxops-dashboard.yaml

3、检查部署结果

[root@k8s-master ingress-1.1.1]# kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP                                PORT(S)                      AGE
ingress-nginx                        NodePort       10.107.28.54     <none>                                     80:30716/TCP,443:31305/TCP   4h37m
ingress-nginx-controller             NodePort       10.100.159.4     <none>                                     80:31247/TCP,443:31575/TCP   4h37m
ingress-nginx-controller-admission   ClusterIP      10.106.162.218   <none>                                     443/TCP                      4h37m
xxxops-frontend                      ExternalName   <none>           xxxops-frontend.xxxops.svc.cluster.local   <none>                       4h36m

在这里插入图片描述

4.3 创建ingress

1、准备部署文件

配置文件:xxxops-dashboard-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: xxxops-ingress    #ingress名称
  namespace: xxxops       #这里写前端服务运行所在的命名空间名称
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: xxxops.cn       #设置域名
    http:
      paths:
      - path: /
        pathType: Prefix    # 前缀匹配
        backend:
          service:
            name: xxxops-frontend     #填写上一步service的名称
            port:
              number: 8080            #填写服务暴漏的端口

2、执行部署

kubectl apply -f xxxops-dashboard-ingress.yaml

3、检查部署结果

在前端服务业务命名空间内查看ingress

[root@k8s-master ingress-1.1.1]# kubectl get ingress -n xxxops
NAME             CLASS    HOSTS       ADDRESS        PORTS   AGE
xxxops-ingress   <none>   xxxops.cn   10.100.159.4   80      4h39m

在这里插入图片描述

五、验证结果

本地机器修改host,增加dns
192.168.150.14 xxxops.cn

使用浏览器访问
http://xxxops.cn:31247/
在这里插入图片描述
可以访问成功

<think>好的,我现在要解决的问题是关于Kubernetes中使用Nginx Gateway API实现命名空间转发Service的情况。用户可能想知道如何配置,或者有哪些注意事项。首先,我需要回忆一下Kubernetes中的Gateway API是什么,它和传统的Ingress有什么不同。 首先,Gateway API是一个更高级别的API,旨在改进Ingress的功能,提供更多的灵活性和扩展性。它引入了GatewayClass、Gateway、HTTPRoute等资源,这些资源允许更细粒度的控制,比如命名空间的路由。 接下来,命名空间转发Service,这意味着一个在命名空间A的HTTPRoute可能需要指向命名空间B中的Service。传统Ingress通常要求Service和Ingress在同一个命名空间,但Gateway API可能支持命名空间引用,但需要确认具体的实现和支持情况。 然后,我需要考虑Nginx Gateway的具体实现是否支持这个功能。Nginx作为Gateway的实现者,可能对命名空间的引用有特定的要求。例如,可能需要配置策略允许命名空间的引用,或者需要在HTTPRoute中显式声明允许的命名空间。 另外,安全方面也很重要。命名空间访问可能涉及RBAC的问题,需要确保相关的服务账号或角色有权限访问其他命名空间的资源。此外,网络策略是否允许命名空间的流量也需要检查。 接下来,可能需要具体步骤。比如,如何创建Gateway资源,如何配置HTTPRoute来引用不同命名空间的Service。这里可能需要示例YAML文件,展示如何在不同的命名空间中设置这些资源,并确保它们正确关联。 还需要注意,Gateway API的版本可能影响功能。例如,v1alpha1、v1alpha2或更高版本的支持情况不同,需要确认Nginx Gateway支持哪个版本,并相应调整配置。 此外,可能遇到的一些常见问题,比如无法解析服务名称,可能是由于没有正确指定后端服务的命名空间,或者Gateway没有权限路由到该命名空间。这时候需要检查HTTPRoute中的backendRef是否包含namespace字段,并且是否正确。 最后,验证配置是否正确,可以通过部署测试应用,发送请求并观察流量是否被正确路由到目标命名空间的服务。可能需要使用curl或类似的工具进行测试,并查看Nginx Gateway的日志以排除故障。 总结一下,我需要整理这些思路,提供一个清晰的步骤说明,包括必要的YAML示例,注意事项,以及验证方法,确保用户能够理解并成功配置命名空间转发。</think>在 Kubernetes 中使用 **Nginx Gateway API** 实现命名空间转发 Service,需结合 **Gateway API** 的命名空间路由能力。以下是关键步骤和配置示例: --- ### 1. **Gateway API 核心概念** - **GatewayClass**:定义网关类型(如 `nginx`)。 - **Gateway**:实例化网关,指定监听器(Listener)和绑定的命名空间- **HTTPRoute**:定义路由规则,支持命名空间引用后端 Service。 --- ### 2. **前提条件** - **安装 Nginx Gateway Controller**:例如 [nginx-kubernetes-gateway](https://github.com/nginxinc/nginx-kubernetes-gateway) 或兼容 Gateway API 的 Nginx Ingress Controller。 - **Gateway API CRD**:确保集群已安装 `GatewayClass`、`Gateway`、`HTTPRoute` 等自定义资源定义。 --- ### 3. **配置示例:命名空间路由** 假设需将请求路由到命名空间 `backend-ns` 中的服务 `my-service`,步骤如下: #### **步骤 1:创建 Gateway** 在网关命名空间(如 `gateway-ns`)中创建 `Gateway` 资源: ```yaml # gateway.yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: my-gateway namespace: gateway-ns spec: gatewayClassName: nginx listeners: - name: http protocol: HTTP port: 80 allowedRoutes: namespaces: from: All # 允许路由来自所有命名空间 ``` #### **步骤 2:创建 HTTPRoute** 在任意命名空间(如 `frontend-ns`)中创建 `HTTPRoute`,引用命名空间的 Service: ```yaml # httproute.yaml apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: cross-ns-route namespace: frontend-ns spec: parentRefs: - name: my-gateway namespace: gateway-ns # 指定父网关的命名空间 rules: - matches: - path: type: PathPrefix value: / backendRefs: - name: my-service namespace: backend-ns # 目标 Service 的命名空间 kind: Service port: 80 ``` --- ### 4. **关键注意事项** - **命名空间权限**: - Gateway 的 `allowedRoutes` 需允许命名空间路由(如设置为 `All` 或指定命名空间列表)。 - 确保 Nginx Gateway 控制器有权限监听目标命名空间- **Service 暴露**: - 目标 Service 需在 `backend-ns` 中正确定义,且端口与 `backendRefs.port` 一致。 - **网络策略**: - 确保网络策略(NetworkPolicy)允许流量从网关 Pod 到目标 Service 的 Pod。 --- ### 5. **验证配置** 1. **检查 Gateway 状态**: ```bash kubectl get gateway my-gateway -n gateway-ns ``` 确认 `Accepted` 状态为 `True`。 2. **发送测试请求**: ```bash curl http://<GATEWAY_EXTERNAL_IP>/path ``` 观察请求是否被路由到 `backend-ns` 中的 Pod。 3. **查看日志**: ```bash kubectl logs -n gateway-ns <nginx-gateway-pod> ``` 检查是否有路由错误或拒绝记录。 --- ### 6. **常见问题** - **无法路由**:检查 `HTTPRoute` 中的 `namespace` 字段是否与目标 Service 的命名空间一致。 - **权限不足**:确保 Gateway 控制器具有命名空间的 `RBAC` 权限。 - **端口不匹配**:确认 `backendRefs.port` 与 Service 端口一致。 --- 通过上述步骤,可实现基于 **Nginx Gateway API** 的命名空间流量转发,适用于多团队协作、微服务隔离等场景。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值