Kubernetes(九) Ingress 与安全机制详解
一、Ingress 服务
1. Ingress 简介
在 Kubernetes 中,Service 负责集群内部的服务发现和负载均衡,但 Pod IP 和 Service 的 ClusterIP 仅在集群内部可见。为了让外部应用能够访问集群内服务,Kubernetes 提供了多种方案:
服务暴露方案对比
方案 | 特点 | 适用场景 |
---|---|---|
NodePort | 将服务暴露在节点网络上,端口范围固定(30000-32767) | 测试环境,端口管理困难 |
LoadBalancer | 需要云厂商支持,自动创建负载均衡器 | 公有云环境,需要额外费用 |
externalIPs | 为 Service 分配外部 IP | 需要精细控制 IP 分配的场景 |
Ingress | 七层反向代理,基于域名/URL路径转发 | 生产环境,多个HTTP/HTTPS服务 |
Ingress 可以理解为"Service 的 Service",它仅用一个或少量的公网 IP/LB,即可同时将多个 HTTP/HTTPS 服务暴露到外网。
核心概念分离:Ingress 负责规则定义,Ingress Controller 负责按规则转发。
2. Ingress 的组成
Ingress(规则定义)
-
以 YAML 配置的 API 对象
-
定义请求如何转发到 Service 的规则
-
提供外部 URL、负载均衡、SSL/TLS、基于域名的反向代理功能
Ingress Controller(转发器)
-
解析 Ingress 规则并实现反向代理与负载均衡
-
不是 K8s 自带组件,有多种实现:
-
官方维护:GCE、ingress-nginx
-
第三方实现:Traefik、Contour、HAProxy Ingress 等
-
典型的工作形态:一个 Pod 内同时运行守护进程(监控集群并生成配置)与反向代理程序(如 Nginx)。
3. Ingress 工作原理
-
动态感知:Ingress Controller 与 APIServer 交互,感知 Ingress 规则变化
-
配置生成:读取规则并按模板生成 Nginx 配置
-
配置写入:将配置写入
/etc/nginx.conf
文件 -
重载生效:执行 reload 使配置生效,实现域名分流
4. Ingress 暴露服务的三种方式
方式一:Deployment + LoadBalancer Service
-
适用场景:公有云环境
-
特点:LB 自动创建并绑定公网 IP,域名解析指向该地址
-
优势:云厂商托管,管理简便
-
劣势:产生额外费用
方式二:DaemonSet + HostNetwork + nodeSelector(推荐生产环境)
-
适用场景:大并发生产环境
-
特点:使用宿主机网络,直接占用 80/443 端口
-
优势:链路最短、性能最好
-
劣势:一个节点只能部署一个 Controller Pod
实施步骤:
# 1. 节点打标签
kubectl label node node02 ingress=true# 2. 修改配置启用 HostNetwork
# 在 mandatory.yaml 中设置 hostNetwork: true 和 nodeSelector# 3. 部署并验证
kubectl apply -f mandatory.yaml
netstat -lntp | grep nginx
方式三:Deployment + NodePort Service
-
适用场景:测试环境或需要前置负载均衡器的场景
-
特点:通过 NodePort 暴露,通常前置 LB
-
优势:配置相对简单
-
劣势:多一层 NAT,大流量场景影响性能
5. Ingress 高级功能
HTTPS 代理访问
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx-https
spec:tls:- hosts:- www3.benet.comsecretName: tls-secretrules:- host: www3.benet.comhttp:paths:- path: /backend:service:name: nginx-svcport:number: 80
认证与重写
-
BasicAuth:基于 HTTP 基本认证
-
Rewrite:URL 重写和重定向
-
路径匹配:Prefix(前缀匹配)和 Exact(精确匹配)
6. 总结与最佳实践
Ingress 选择建议:
-
公有云:优先选择 LoadBalancer 方式
-
私有云大并发:DaemonSet + HostNetwork 方式
-
测试环境:NodePort 方式
生产环境建议:
-
配合多节点部署 + 前置 LB
-
完善的监控告警(Prometheus 采集 10254 端口)
-
证书管理与访问控制加固
二、Kubernetes 安全机制
1. 安全机制概述
Kubernetes 安全机制围绕保护 API Server 设计,客户端请求需要经过三道关卡:
-
认证(Authentication):确认身份
-
鉴权(Authorization):权限检查
-
准入控制(Admission Control):请求验证和变更
2. 认证机制
支持的认证方式
-
HTTP Token 认证:携带 Token 进行认证
-
HTTP Basic 认证:用户名密码 Base64 编码
-
HTTPS 证书认证:基于 CA 根证书的双向 TLS 认证(最安全)
Service Account
用于解决 Pod 到 API Server 的认证问题:
# 查看默认 Service Account
kubectl get sa# 查看 Pod 中挂载的认证信息
kubectl exec -it <pod-name> -- ls /var/run/secrets/kubernetes.io/serviceaccount/
# ca.crt namespace token
3. 鉴权机制(RBAC)
RBAC(基于角色的访问控制)是 Kubernetes 1.6 之后的默认鉴权机制。
核心资源对象
-
Role/ClusterRole:定义权限集合
-
RoleBinding/ClusterRoleBinding:将角色绑定到主体
RBAC 配置示例
# 定义 Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: defaultname: pod-reader
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list"]# 绑定 Role 到用户
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-podsnamespace: default
subjects:
- kind: Username: zhangsanapiGroup: rbac.authorization.k8s.io
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
4. 实践:创建命名空间受限用户
步骤概述
-
创建用户证书:使用 cfssl 工具生成用户证书
-
生成 kubeconfig:配置集群、用户认证和上下文
-
RBAC 授权:创建 Role 和 RoleBinding 限制权限
-
权限验证:测试用户权限范围
关键命令
# 生成用户证书
cfssl gencert -ca=ca.crt -ca-key=ca.key -profile=kubernetes zhangsan-csr.json | cfssljson -bare zhangsan# 创建 kubeconfig
kubectl config set-credentials zhangsan \--client-key=zhangsan-key.pem \--client-certificate=zhangsan.pem \--embed-certs=true \--kubeconfig=zhangsan.kubeconfig
5. 准入控制
准入控制器是 API Server 的插件链,用于在对象持久化前进行验证和变更。
常用准入控制器
-
NamespaceLifecycle:命名空间生命周期管理
-
LimitRanger:资源配额限制
-
ServiceAccount:自动注入 ServiceAccount
-
ResourceQuota:命名空间级资源配额
-
NodeRestriction:限制节点权限
三、总结
Ingress 核心要点
-
概念分离:Ingress 定义规则,Controller 实现转发
-
暴露方式:根据环境选择合适方案(LB/HostNetwork/NodePort)
-
生产推荐:DaemonSet + HostNetwork 方式性能最优
-
功能丰富:支持 HTTPS、认证、重写等高级功能
安全机制核心要点
-
三层防护:认证 → 鉴权 → 准入控制
-
RBAC 主流:基于角色的细粒度权限控制
-
证书认证:HTTPS 证书认证安全性最高
-
实践原则:遵循最小权限原则,定期审计权限
最佳实践结合
在生产环境中,应该:
-
使用安全的 Ingress 暴露方式
-
实施严格的 RBAC 权限控制
-
定期轮换证书和 Token
-
启用合适的准入控制器
-
建立完善的监控和审计日志
通过合理配置 Ingress 和安全机制,可以构建既高效又安全的 Kubernetes 集群环境。