k8s Ingress、Service配置各样例大全

在这里插入图片描述

壹、k8s Ingress 样例大全

以下为 Kubernetes Ingress 的典型配置样例大全,涵盖常见生产场景,结合最佳实践和关键注释说明,便于直接复用或调整:


🔧 一、基础路由与 TLS 终止

场景:将不同路径的 HTTP/HTTPS 流量路由到后端服务,并启用 TLS 加密。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  tls:                            # TLS 配置部分
  - hosts:
      - example.com
    secretName: example-tls-secret  # 证书需提前存入 Secret
  rules:
  - host: example.com              # 域名匹配
    http:
      paths:
      - path: /app1                # 路径匹配
        pathType: Prefix
        backend:
          service:
            name: app1-service      # 后端服务名
            port: 
              number: 80
      - path: /app2
        pathType: Prefix
        backend:
          service:
            name: app2-service
            port: 
              number: 8080

关键点

  • tls.secretName 需提前通过 kubectl create secret tls 创建证书
  • 若无域名可省略 host 字段,匹配所有域名请求

🔄 二、高级路由控制

1. URL 重写(适用后端服务路径与入口路径不一致)
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1  # 重写路径
spec:
  rules:
  - host: go-app.example.com
    http:
      paths:
      - path: /api(/|$)(.*)       # 捕获路径参数
        pathType: Prefix
        backend:
          service:
            name: go-service
            port: 
              number: 80

效果
请求 go-app.example.com/api/user → 后端实际接收路径 /user


2. 多路径路由到不同服务
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: "/foo"
        backend:
          serviceName: service-foo  # 服务1
          servicePort: 80
      - path: "/bar"
        backend:
          serviceName: service-bar  # 服务2
          servicePort: 80

适用场景
微服务架构按功能拆分路径


🚦 三、流量治理策略

1. 金丝雀发布(灰度发布)
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "15"  # 15%流量到新版本
spec:
  rules:
  - host: canary.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: new-service      # 新版本服务
            port: 80

说明
剩余 85% 流量仍走旧服务


2. 粘性会话(会话保持)
metadata:
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "user-route"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"  # 有效期2天
spec:
  rules:
  - host: shop.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: cart-service
            port: 80

适用场景
购物车、用户登录态保持


🔐 四、安全增强配置

1. 强制 HTTPS 跳转
metadata:
  annotations:
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"  # HTTP自动跳HTTPS
spec:
  tls:
  - hosts:
      - secure.example.com
    secretName: tls-secret
  rules:
  - host: secure.example.com
    http:
      paths:
      - path: /
        backend: ...

2. 通配符域名证书
spec:
  tls:
  - hosts:
      - "*.example.com"           # 支持所有子域名
    secretName: wildcard-tls-secret
  rules:
  - host: app1.example.com        # 子域名1
    http: ...
  - host: app2.example.com        # 子域名2
    http: ...

注意
证书需包含通配符 *


🌐 五、跨命名空间路由

场景:将流量路由到其他 Namespace 的服务

spec:
  rules:
  - host: cross-ns.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: other-service   
            port: 80
            namespace: dev-team  # 指定目标命名空间

权限要求
Ingress Controller 需有访问目标 Namespace 的权限


⚙️ 六、云厂商集成(华为云 CCI 示例)

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/elb.id: "2d48d034-..."  # 绑定云 ELB 实例 ID
    kubernetes.io/elb.port: '6071'         # ELB 监听端口
  labels:
    isExternal: "true"                    # 必填标识
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 8080

适用场景
公有云托管 Kubernetes 服务


💎 总结对比表:按场景选择配置

场景配置要点关键注解/字段
基础 HTTPS 路由TLS 证书 + 路径匹配tls.secretName, spec.rules.paths
灰度发布按权重分流流量canary: "true", canary-weight
会话保持基于 Cookie 的亲和性affinity: "cookie", session-cookie-name
跨命名空间访问指定后端服务 Namespacebackend.service.namespace
云厂商 ELB 集成绑定云负载均衡器 ID 和端口kubernetes.io/elb.id, kubernetes.io/elb.port
通配符域名泛域名证书 + 多 host 规则tls.hosts: ["*.domain.com"]

💡 调试提示

  • 使用 kubectl describe ingress <name> 查看事件及错误
  • 若配置未生效,检查 Ingress Controller 日志(如 kubectl logs -n ingress-nginx <pod>
  • 生产环境推荐托管 Ingress 控制器(如 AWS ALB、GCE L7)降低运维成本

贰、k8s Service 样例大全

以下是 Kubernetes Service 四种核心类型(ClusterIPNodePortLoadBalancerExternalName)的配置样例大全,附带使用场景和关键参数解析:

🔧 一、ClusterIP(默认类型)

场景:集群内服务间通信(东西流量)

apiVersion: v1
kind: Service
metadata:
  name: redis-service  # 集群内访问地址:redis-service:6379
spec:
  type: ClusterIP      # 可省略(默认类型)
  selector:
    app: redis         # 关联标签为 app=redis 的 Pod
  ports:
    - name: tcp-port   # 端口命名(可选)
      protocol: TCP
      port: 6379       # Service 暴露的端口
      targetPort: 6379 # Pod 监听端口

特点

  • 分配一个集群内部虚拟 IP(如 10.96.0.1
  • 仅限集群内访问,无法从外部直接连接
  • 服务发现:通过 DNS 名称 <service-name>.<namespace>.svc.cluster.local

🌐 二、NodePort

场景:通过节点 IP 暴露服务(开发测试常用)

apiVersion: v1
kind: Service
metadata:
  name: web-nodeport
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80          # Service 端口(集群内访问)
      targetPort: 80     # Pod 端口
      nodePort: 30080    # 节点开放端口(范围 30000-32767)

访问方式

  • 集群内:web-nodeport:80
  • 集群外:<任意节点IP>:30080 → 自动路由到后端 Pod
    注意:生产环境需配合负载均衡器使用

☁️ 三、LoadBalancer(云厂商集成)

场景:公有云环境自动创建外部负载均衡器

apiVersion: v1
kind: Service
metadata:
  name: api-loadbalancer
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb" # AWS NLB 注解
spec:
  type: LoadBalancer
  selector:
    app: api-server
  ports:
    - protocol: TCP
      port: 443         # LB 监听端口
      targetPort: 8080   # Pod 端口
  externalTrafficPolicy: Local # 保留客户端真实 IP

云厂商行为

  • AWS → 创建 NLB/ALB
  • GCP → 创建 Network LB
  • Azure → 创建 Azure LB
    访问方式
  • 通过云厂商分配的 LB 公网 IP 访问(如 https://<LB-IP>:443

🔗 四、ExternalName(CNAME 代理)

场景:将服务映射到外部 DNS 名称(如云数据库)

apiVersion: v1
kind: Service
metadata:
  name: mysql-external
spec:
  type: ExternalName
  externalName: mysql.prod.example.com  # 外部服务地址

访问方式

  • 集群内访问 mysql-external → 自动解析为 mysql.prod.example.com
    典型用途
  • 代理 RDS、ElastiCache 等托管服务
  • 简化迁移(无需修改应用配置)

⚙️ 高级配置样例

1. 多端口 Service(如 Web + Metrics)
apiVersion: v1
kind: Service
metadata:
  name: multi-port-svc
spec:
  type: ClusterIP
  selector:
    app: monitoring
  ports:
    - name: http
      port: 80
      targetPort: 8080
    - name: metrics
      port: 9100
      targetPort: 9100
2. 会话保持(Session Affinity)
spec:
  type: NodePort
  sessionAffinity: ClientIP  # 基于客户端 IP 会话保持
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 3600   # 会话保持超时
3. 指定静态 ClusterIP
spec:
  type: ClusterIP
  clusterIP: 10.96.0.100     # 手动指定固定 IP

💎 四类 Service 核心对比

类型访问范围典型场景网络层外部依赖
ClusterIP集群内部微服务间通信L4
NodePort节点IP + 端口开发测试、临时暴露L4节点网络可达
LoadBalancer云厂商 LB 公网 IP生产环境对外暴露L4云厂商 LB 服务
ExternalName集群内部代理外部服务(如 RDS)L7 (DNS)外部 DNS 解析

🔧 调试命令

# 查看 Service 详情
kubectl describe svc <service-name>

# 检查 Endpoints 是否正常
kubectl get endpoints <service-name>

# 集群内访问测试
kubectl run curl --image=curlimages/curl -it --rm -- \
  curl http://<service-name>:<port>

💡 生产建议

  • 优先使用 Ingress + ClusterIP 管理 HTTP 流量(L7 路由)
  • LoadBalancer 用于 TCP/UDP 服务(如数据库)
  • 避免直接用 NodePort 暴露生产服务(安全风险高)
<think>好的,用户现在问的是关于Kubernetes Ingress如何跨命名空间访问Service,并且需要详细说明配置文件字段的含义。之前用户问过关于ExternalName类型的Service,现在转向了Ingress,这可能意味着他们在尝试不同的跨命名空间通信方法,或者想了解更高级的路由机制。 首先,我需要确认用户对Ingress的基本概念是否了解。Ingress用于管理外部访问集群内部服务的HTTP和HTTPS路由,通常通过定义规则来实现。而跨命名空间访问的关键点在于Ingress规则中如何指定不同命名空间下的Service。 接下来,用户可能需要了解Ingress配置文件结构,特别是如何引用其他命名空间的Service如,在Ingress的规则中,需要指定service.name和service.namespace字段,以及对应的端口。这里需要注意的是,某些Kubernetes版本或Ingress控制器可能对跨命名空间的支持有所不同,可能需要特定的配置或权限。 然后,我需要详细解释每个字段的含义,比如apiVersion、kind、metadata中的name和annotations,以及spec中的ingressClassName、rules等。特别是要强调host、http.paths.backend中的service.name和service.namespace,这些是跨命名空间的关键字段。此外,annotations部分可能会有特定的配置,比如重写路径或SSL设置,这些也会影响跨命名空间访问的行为。 用户可能潜在的需求是希望在不同的命名空间之间路由流量,比如前端和后端服务分别部署在不同的命名空间,或者多租户环境下的服务隔离。需要提醒用户注意Ingress控制器的能力,如是否支持跨命名空间,以及是否需要额外的RBAC配置或网络策略。 还要考虑用户可能遇到的问题,比如配置正确但流量无法到达,这时候需要检查Ingress控制器的日志,确认服务是否存在,端口是否正确,以及是否有网络策略限制。此外,提到TLS部分,如果用户需要HTTPS,需要说明如何配置证书。 最后,总结使用场景和注意事项,帮助用户更好地应用这些配置,避免常见错误。比如典型场景是微服务跨命名空间路由,统一入口管理,以及灰度发布等。注意事项包括版本兼容性、控制器支持、服务存在性检查等。</think>以下是对Kubernetes Ingress实现跨命名空间访问Service配置文件字段详细说明,按功能模块分类解析: $$ \begin{array}{|c|c|l|} \hline \text{模块} & \text{字段} & \text{含义及注意事项} \\ \hline \text{基础定义} & apiVersion: networking.k8s.io/v1 & \text{必须使用此API版本(旧版本可能使用extensions/v1beta1)} \\ & kind: Ingress & \text{资源类型标识} \\ & metadata.name: my-cross-ns-ingress & \text{Ingress资源名称(集群内唯一)} \\ & metadata.namespace: ns-frontend & \text{Ingress本身部署的命名空间} \\ \hline \text{关键配置} & spec.ingressClassName: nginx & \text{指定Ingress控制器类型(如nginx/traefik等)} \\ & spec.rules[].host: demo.example.com & \text{定义外部访问的域名} \\ & spec.rules[].http.paths[].path: /api & \text{URL路径匹配规则(支持正则表达式)} \\ & spec.rules[].http.paths[].pathType: Prefix & \text{路径匹配类型(Exact/Prefix/ImplementationSpecific)} \\ \hline \text{跨命名空间核心} & spec.rules[].http.paths[].backend.service.name: backend-svc & \text{目标Service名称(位于其他命名空间)} \\ & spec.rules[].http.paths[].backend.service.port.number: 8080 & \text{目标Service的端口号} \\ & spec.rules[].http.paths[].backend.service.namespace: ns-backend & \text{显式指定目标Service的命名空间} \\ \hline \text{高级配置} & metadata.annotations: & \text{控制器特有配置为nginx配置)} \\ & \quad nginx.ingress.kubernetes.io/rewrite-target: /\$1 & \text{路径重写规则} \\ & \quad nginx.ingress.kubernetes.io/proxy-connect-timeout: "30" & \text{连接超时设置(单位:秒)} \\ \hline \text{TLS配置} & spec.tls[].secretName: tls-secret & \text{SSL证书的Secret名称(需提前创建)} \\ & spec.tls[].hosts: demo.example.com & \text{证书对应的域名} \\ \hline \end{array} $$ ### 跨命名空间工作原理 1. **服务发现机制**:当指定$\texttt{spec.rules.http.paths.backend.service.namespace}$字段时,Ingress控制器会通过Kubernetes DNS解析跨命名空间的Service地址,格式为: $$ \texttt{<service-name>.<namespace>.svc.cluster.local} $$ 2. **流量走向示**: ```plaintext 外部请求 -> Ingress Controller -> 根据路由规则 -> 目标Service(ns-backend:backend-svc:8080) ``` ### 典型配置 ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cross-ns-ingress namespace: ns-frontend annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: ingressClassName: nginx rules: - host: app.example.com http: paths: - path: /v1/(.*) pathType: Prefix backend: service: name: data-service # 目标服务名称 namespace: ns-backend # 显式指定其他命名空间 port: number: 8080 tls: - hosts: - app.example.com secretName: example-tls ``` ### 使用场景 1. **微服务架构**:前端服务(ns-frontend)通过统一入口访问后端服务(ns-backend) 2. **多租户隔离**:不同团队的服务部署在不同命名空间,共享同一个Ingress控制器 3. **灰度发布**:通过路径分流到不同命名空间的版本服务 ### 注意事项 1. **版本兼容性**: - Kubernetes 1.19+ 开始正式支持$\texttt{spec.rules.http.paths.backend.service.namespace}$字段 - 旧版本需要使用$\texttt{serviceName}$格式:$\texttt{<namespace>/<service>}$ 2. **控制器限制**: - 需确认Ingress控制器支持跨命名空间(默认多数控制器支持) - 某些云厂商的托管Ingress可能需要额外配置 3. **权限要求**: ```bash # 需要RBAC授权允许Ingress控制器读取其他命名空间的Service kubectl create rolebinding ingress-controller \ --clusterrole=view \ --serviceaccount=ingress-nginx:ingress-nginx \ --namespace=ns-backend ``` 4. **调试技巧**: ```bash # 查看Ingress解析状态 kubectl describe ingress -n ns-frontend cross-ns-ingress # 检查控制器日志 kubectl logs -n ingress-nginx deploy/ingress-nginx-controller ``` 5. **网络策略**:如果启用NetworkPolicy,需确保允许Ingress控制器到目标命名空间的流量 建议实际部署时,先通过$\texttt{kubectl get svc -n <target-namespace>}$确认目标Service存在且端口匹配。
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小马过河R

自从你的糖,从此咖啡有点甜^^

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值