k8s lngress与安全机制

文章目录

  • [k8s Ingress与安全机制整理](#k8s Ingress与安全机制整理)
    • [一、Ingress 服务概述](#一、Ingress 服务概述)
      • [1. 核心作用](#1. 核心作用)
    • [二、Ingress 组成](#二、Ingress 组成)
      • [1. Ingress(规则定义)](#1. Ingress(规则定义))
      • [2. Ingress Controller(转发器)](#2. Ingress Controller(转发器))
    • [三、Ingress 工作原理](#三、Ingress 工作原理)
    • [四、ingress-nginx-controller 部署](#四、ingress-nginx-controller 部署)
      • [1. 准备清单](#1. 准备清单)
      • [2. 修改ClusterRole配置](#2. 修改ClusterRole配置)
    • [五、Ingress 暴露服务的三种方式](#五、Ingress 暴露服务的三种方式)
      • [方式一:Deployment + Service(type=LoadBalancer)](#方式一:Deployment + Service(type=LoadBalancer))
      • [方式二:DaemonSet + HostNetwork + nodeSelector](#方式二:DaemonSet + HostNetwork + nodeSelector)
      • [方式三:Deployment + Service(type=NodePort)](#方式三:Deployment + Service(type=NodePort))
    • 六、典型功能示例
      • [1. 虚拟主机代理](#1. 虚拟主机代理)
      • [2. HTTPS 代理](#2. HTTPS 代理)
      • [3. BasicAuth 认证](#3. BasicAuth 认证)
      • [4. 路径重写](#4. 路径重写)
    • 七、排错与检查
    • 八、总结

k8s Ingress与安全机制整理

一、Ingress 服务概述

1. 核心作用

  • Service的补充:Service解决集群内部Pod的服务发现与负载均衡,但对外暴露服务需额外方案。
  • 对外暴露方式对比
    • NodePort:暴露节点端口(30000-32767),适合测试,端口管理困难。
    • LoadBalancer:依赖云厂商,自动创建LB,有额外费用,适合公有云。
    • externalIPs:为Service分配外部IP,需路由到集群节点。
    • Ingress:七层反向代理,通过少量公网IP/LB暴露多个HTTP/HTTPS服务,基于域名/URL路径转发(可理解为"Service的Service")。

二、Ingress 组成

1. Ingress(规则定义)

  • 以YAML配置的API对象,定义请求转发规则(外部URL、负载均衡、SSL/TLS、域名代理等)。
  • 功能需依赖Ingress Controller实现。

2. Ingress Controller(转发器)

  • 解析Ingress规则,实现反向代理与负载均衡,非K8s自带组件。
  • 常见实现:官方(GCE、ingress-nginx)、第三方。
  • 典型形态:Pod内运行"守护进程(监控集群生成配置)+ 反向代理(如Nginx)",例如ingress-nginx动态生成Nginx配置并reload。

三、Ingress 工作原理

  1. Ingress Controller与APIServer交互,动态感知Ingress规则变化。
  2. 按规则生成Nginx配置,写入ingress-controller Pod的/etc/nginx.conf
  3. 执行reload使配置生效,实现域名/路径分流与动态更新。

四、ingress-nginx-controller 部署

1. 准备清单

bash 复制代码
mkdir -p /opt/ingress && cd /opt/ingress
# 官方/国内镜像获取部署清单
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.0/deploy/static/mandatory.yaml
# 或国内镜像:wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.25.0/deploy/static/mandatory.yaml

2. 修改ClusterRole配置

mandatory.yaml中为networking.k8s.io添加Ingress资源权限(0.25版本及以上):

yaml 复制代码
apiGroups:
  - "extensions"
  - "networking.k8s.io"  # 新增,支持networking.k8s.io API组
resources:
  - ingresses
verbs:
  - get
  - list
  - watch

五、Ingress 暴露服务的三种方式

方式一:Deployment + Service(type=LoadBalancer)

  • 适用场景:公有云。
  • 原理:通过Deployment部署Controller,创建LoadBalancer类型Service,云厂商自动生成LB并绑定公网IP,域名解析指向该IP即可暴露服务。

方式二:DaemonSet + HostNetwork + nodeSelector

  • 适用场景:大并发生产环境(性能最优)。
  • 特点:特定节点部署Controller,使用宿主机网络(直接占用80/443端口),链路最短,一个节点仅运行一个Controller Pod。
实施步骤:
  1. 给节点打标签(如仅在node02运行):

    bash 复制代码
    kubectl label node node02 ingress=true
  2. 修改mandatory.yaml

    • kind: Deployment改为kind: DaemonSet,删除replicas

    • 启用宿主机网络并指定节点:

      yaml 复制代码
      spec:
        hostNetwork: true
        nodeSelector:
          ingress: "true"
  3. 加载镜像并启动,验证端口(80/443/8181/10254):

    bash 复制代码
    docker load -i ingree.contro.tar
    kubectl apply -f mandatory.yaml
    netstat -lntp | grep nginx  # 检查监听端口
  4. 创建Ingress规则(示例):

    yaml 复制代码
    # networking.k8s.io/v1版本
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-app-ingress
    spec:
      rules:
      - host: www.benet.com
        http:
          paths:
          - path: /
            pathType: Prefix  # 前缀匹配(或Exact完全匹配)
            backend:
              service:
                name: nginx-app-svc
                port:
                  number: 80

方式三:Deployment + Service(type=NodePort)

  • 适用场景:无LB环境,需前置负载均衡。
  • 特点:通过NodePort暴露Controller,端口随机,多一层NAT,大流量可能影响性能。
实施步骤:
  1. 获取清单并部署:

    bash 复制代码
    mkdir -p /opt/ingress-nodeport && cd /opt/ingress-nodeport
    # 下载mandatory.yaml和service-nodeport.yaml(NodePort服务配置)
    wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
    wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
    docker load -i ingress-controller-0.30.0.tar
    kubectl apply -f mandatory.yaml -f service-nodeport.yaml
  2. 测试访问:通过NodePort端口(如32383)访问,需配置hosts解析。

六、典型功能示例

1. 虚拟主机代理

通过不同域名转发到不同Service:

yaml 复制代码
# 示例:www1.benet.com → svc-1;www2.benet.com → svc-2
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
spec:
  rules:
    - host: www1.benet.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: svc-1
              port: {number: 80}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress2
spec:
  rules:
    - host: www2.benet.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: svc-2
              port: {number: 80}

2. HTTPS 代理

  • 生成自签证书并创建secret:

    bash 复制代码
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
    kubectl create secret tls tls-secret --key tls.key --cert tls.crt
  • Ingress配置:

    yaml 复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-https
    spec:
      tls:  # 关联证书secret
        - hosts: [www3.benet.com]
          secretName: tls-secret
      rules:
        - host: www3.benet.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service: {name: nginx-svc, port: {number: 80}}

3. BasicAuth 认证

  • 生成认证文件并创建secret:

    bash 复制代码
    yum install -y httpd
    htpasswd -c auth zhangsan  # 生成auth文件
    kubectl create secret generic basic-auth --from-file=auth
  • Ingress配置(添加认证注解):

    yaml 复制代码
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-auth
      annotations:
        nginx.ingress.kubernetes.io/auth-type: basic
        nginx.ingress.kubernetes.io/auth-secret: basic-auth
        nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
    spec:
      rules:
        - host: auth.benet.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend: {service: {name: nginx-svc, port: {number: 80}}}

4. 路径重写

通过注解配置重定向目标:

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-rewrite
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: http://www1.benet.com:32383  # 重定向目标
spec:
  rules:
    - host: re.benet.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend: {service: {name: nginx-svc, port: {number: 80}}}

七、排错与检查

  1. 查看Controller状态

    bash 复制代码
    kubectl get pod -n ingress-nginx -o wide
    kubectl get cm,daemonset -n ingress-nginx -o wide
  2. 检查Nginx配置

    bash 复制代码
    kubectl exec -it <controller-pod> -n ingress-nginx -- /bin/bash
    more /etc/nginx/nginx.conf  # 查看生成的配置
  3. 调度失败处理 :若因nodeSelector不匹配,可给节点加对应标签或删除nodeSelector

八、总结

  • 核心:Ingress = Ingress资源对象(规则) + Ingress Controller(转发实现)。
  • 选型建议
    • 公有云:优先用Deployment + LoadBalancer
    • 生产环境(大并发):DaemonSet + HostNetwork(高性能)。
    • 无LB环境:Deployment + NodePort(需前置负载均衡)。
  • 生产加固:多节点部署、前置LB/高可用(LVS+keepalived)、监控(Prometheus采集10254端口)、TLS/认证/WAF防护。
相关推荐
三坛海会大神5554 小时前
k8s(八)Ingress详解
云原生·容器·kubernetes
荣光波比5 小时前
K8S(十三)—— Helm3从入门到实战:简化Kubernetes应用部署与管理
云原生·容器·kubernetes
qyhua11 小时前
【Linux运维实战】彻底修复 CVE-2011-5094 漏洞
linux·运维·安全
Andya_net12 小时前
网络安全 | 深入了解 X.509 证书及其应用
服务器·安全·web安全
007php00712 小时前
百度面试题解析:微服务架构、Dubbo、Redis及其一致性问题(一)
redis·百度·docker·微服务·容器·职场和发展·架构
東雪蓮☆12 小时前
K8s 平滑升级
linux·运维·云原生·kubernetes
我狸才不是赔钱货15 小时前
容器:软件世界的标准集装箱
linux·运维·c++·docker·容器
三坛海会大神55517 小时前
k8s(十)Helm详解
云原生·容器·kubernetes
安卓开发者17 小时前
Docker命令大全:从入门到精通
docker·容器·eureka