文章目录
- [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 暴露服务的三种方式)
- 六、典型功能示例
-
- [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 工作原理
- Ingress Controller与APIServer交互,动态感知Ingress规则变化。
- 按规则生成Nginx配置,写入ingress-controller Pod的
/etc/nginx.conf
。 - 执行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。
实施步骤:
-
给节点打标签(如仅在node02运行):
bashkubectl label node node02 ingress=true
-
修改
mandatory.yaml
:-
把
kind: Deployment
改为kind: DaemonSet
,删除replicas
。 -
启用宿主机网络并指定节点:
yamlspec: hostNetwork: true nodeSelector: ingress: "true"
-
-
加载镜像并启动,验证端口(80/443/8181/10254):
bashdocker load -i ingree.contro.tar kubectl apply -f mandatory.yaml netstat -lntp | grep nginx # 检查监听端口
-
创建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,大流量可能影响性能。
实施步骤:
-
获取清单并部署:
bashmkdir -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
-
测试访问:通过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:
bashopenssl 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配置:
yamlapiVersion: 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:
bashyum install -y httpd htpasswd -c auth zhangsan # 生成auth文件 kubectl create secret generic basic-auth --from-file=auth
-
Ingress配置(添加认证注解):
yamlapiVersion: 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}}}
七、排错与检查
-
查看Controller状态 :
bashkubectl get pod -n ingress-nginx -o wide kubectl get cm,daemonset -n ingress-nginx -o wide
-
检查Nginx配置 :
bashkubectl exec -it <controller-pod> -n ingress-nginx -- /bin/bash more /etc/nginx/nginx.conf # 查看生成的配置
-
调度失败处理 :若因
nodeSelector
不匹配,可给节点加对应标签或删除nodeSelector
。
八、总结
- 核心:Ingress = Ingress资源对象(规则) + Ingress Controller(转发实现)。
- 选型建议 :
- 公有云:优先用
Deployment + LoadBalancer
。 - 生产环境(大并发):
DaemonSet + HostNetwork
(高性能)。 - 无LB环境:
Deployment + NodePort
(需前置负载均衡)。
- 公有云:优先用
- 生产加固:多节点部署、前置LB/高可用(LVS+keepalived)、监控(Prometheus采集10254端口)、TLS/认证/WAF防护。