实验项目:Kubernetes Ingress 实战演练
实验目标
- 部署 Nginx Ingress Controller
- 创建多版本应用及服务
- 配置 Ingress 实现域名路由
- 启用 TLS 加密保护传输
- 添加 HTTP 基本认证限制访问
实验环境准备
确保已部署 Kubernetes 集群( 1 Master + 2 node节点),并配置 kubectl
命令行工具。本地需绑定测试域名到 Ingress Controller 节点 IP(如修改 /etc/hosts
)。
【k8s】实验搭建及pod控制器运用-CSDN博客
1,部署 Nginx Ingress Controller
Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力
Ingress 需要通过 Ingress Controller 实现路由功能
# 创建命名空间
kubectl create namespace ingress-nginx # 部署 Nginx Ingress Controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml kubectl get pods -n ingress-nginx # 验证 Pod 状态为 Running # 查看 Ingress Controller 暴露的端口(通常是 NodePort 类型)
kubectl get svc -n ingress-nginx
ps:这个部署是我询问的ai,只是想整合一下实验步骤,具体如何配置在
【K8s】微服务类型配置实验-CSDN博客4.1-4.3这一块
(导入一个镜像压缩包)上传了两个镜像,ingress-nginx和Cotroller,是跟着一起配置的,不知道单独配置如何
同理这些步骤都是AI帮我整理的,只是想实验思路和原理,具体配置不懂的可以去微服务文章那一块
2,部署多版本测试应用
创建两个应用版本(v1 和 v2),分别通过 Service 暴露端口。
v1 版本部署(示例 YAML)
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-v1
spec:replicas: 2selector:matchLabels:app: myappversion: v1template:metadata:labels:app: myappversion: v1spec:containers:- name: myappimage: nginx:alpineports:- containerPort: 80# 写入标识版本的首页command: ['sh', '-c', 'echo "Hello MyApp | Version: v1" > /usr/share/nginx/html/index.html && nginx -g "daemon off;"']
---
apiVersion: v1
kind: Service
metadata:name: myapp-v1
spec:selector:app: myappversion: v1ports:- port: 80targetPort: 80
kubectl apply -f myapp-v1.yaml
部署v2版本
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-v2
spec:replicas: 2selector:matchLabels:app: myappversion: v2template:metadata:labels:app: myappversion: v2spec:containers:- name: myappimage: nginx:alpineports:- containerPort: 80# 写入标识版本的首页(区别于 v1)command: ['sh', '-c', 'echo "Hello MyApp | Version: v2" > /usr/share/nginx/html/index.html && nginx -g "daemon off;"']
---
apiVersion: v1
kind: Service
metadata:name: myapp-v2
spec:selector:app: myappversion: v2ports:- port: 80targetPort: 80
kubectl apply -f myapp-v2.yaml
验证应用状态
kubectl get pods -l app=myapp-v1
kubectl get svc myapp-v1-svc
或者
# 查看 Pod
kubectl get pods | grep myapp
# 查看 Service
kubectl get svc | grep myapp
3,配置基础 Ingress 路由(HTTP)
定义 Ingress 规则,将不同域名路由到对应服务。
创建 Ingress 资源,实现基于域名的路由(myapp-v1.example.com 指向 v1 服务,myapp-v2.example.com 指向 v2 服务)。
Ingress 配置示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: myapp-ingress-basicannotations:nginx.ingress.kubernetes.io/rewrite-target: / # 路径重写(可选,根据需求调整)
spec:ingressClassName: nginx # 关联 Nginx Ingress Controllerrules:- host: myapp-v1.example.com # v1 版本域名http:paths:- path: /pathType: Prefixbackend:service:name: myapp-v1port:number: 80- host: myapp-v2.example.com # v2 版本域名http:paths:- path: /pathType: Prefixbackend:service:name: myapp-v2port:number: 80
kubectl apply -f ingress-basic.yaml# 验证 Ingress 状态
kubectl get ingress myapp-ingress-basic
# 预期输出:规则中包含两个域名的路由配置
验证HTTP路由
# 访问 v1 版本(需提前配置 /etc/hosts 绑定域名到节点 IP)
curl http://myapp-v1.example.com
# 预期输出:Hello MyApp | Version: v1# 访问 v2 版本
curl http://myapp-v2.example.com
# 预期输出:Hello MyApp | Version: v2
4,启用 TLS 加密
为域名启用 HTTPS 加密,需创建 TLS 证书 Secret 并更新 Ingress 配置。
生成证书
# 生成私钥和证书(替换域名)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout tls.key \-out tls.crt \-subj "/CN=myapp-v1.example.com" # 证书绑定的域名(可添加多个,用逗号分隔)# 创建 TLS Secret
kubectl create secret tls myapp-tls-secret --cert=tls.crt --key=tls.key
更新 Ingress 配置
在原有规则中添加 tls
字段:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: myapp-ingress-tlsannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:ingressClassName: nginxtls: # 新增 TLS 配置- hosts:- myapp-v1.example.com # 与证书绑定的域名一致secretName: myapp-tls-secret # 关联 TLS 证书 Secretrules:- host: myapp-v1.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: myapp-v1port:number: 80- host: myapp-v2.example.com # v2 暂不启用 TLShttp:paths:- path: /pathType: Prefixbackend:service:name: myapp-v2port:number: 80
kubectl apply -f ingress-tls.yaml
测试 HTTPS
访问 v1(HTTPS,自签名证书需加 -k 忽略验证)
curl -k https://myapp-v1.example.com
# 预期输出:Hello MyApp | Version: v1访问 v2(仍为 HTTP)
curl http://myapp-v2.example.com
# 预期输出:Hello MyApp | Version: v2
5,配置 HTTP 基本认证
为 v1 版本服务添加用户名 / 密码认证,增强安全性。
使用 htpasswd
创建认证文件并关联到 Ingress。
生成认证 Secret
# 安装工具(RHEL)
dnf install httpd-tools -y# 创建认证文件(用户:admin,密码自定义)
htpasswd -cm auth admin
# 输入密码并确认(如:Admin@123)# 创建认证 Secret
kubectl create secret generic myapp-auth-secret --from-file=auth
更新 Ingress 注解启用认证
添加以下注解:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: myapp-ingress-auth-tlsannotations:nginx.ingress.kubernetes.io/rewrite-target: /# 基本认证配置nginx.ingress.kubernetes.io/auth-type: basicnginx.ingress.kubernetes.io/auth-secret: myapp-auth-secret # 关联认证 Secretnginx.ingress.kubernetes.io/auth-realm: "请输入管理员账号密码" # 认证提示信息
spec:ingressClassName: nginxtls:- hosts:- myapp-v1.example.comsecretName: myapp-tls-secretrules:- host: myapp-v1.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: myapp-v1port:number: 80- host: myapp-v2.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: myapp-v2port:number: 80
kubectl apply -f ingress-auth-tls.yaml
验证认证
# 未带认证信息访问 v1
curl -k https://myapp-v1.example.com
# 预期输出:401 Authorization Required# 带正确认证信息访问
curl -k -u admin:Admin@123 https://myapp-v1.example.com
# 预期输出:Hello MyApp | Version: v1# 带错误认证信息访问
curl -k -u admin:WrongPass https://myapp-v1.example.com
# 预期输出:401 Authorization Required
6,环境清理
kubectl delete ingress myapp-ingress-auth-tls
kubectl delete -f myapp-v1.yaml -f myapp-v2.yaml
kubectl delete secret myapp-tls-secret myapp-auth-secret
kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
实验总结
- Ingress Controller 作为路由入口,通过规则匹配域名和路径。
- TLS 加密需绑定证书 Secret 到 Ingress。
- 认证通过注解关联
htpasswd
生成的 Secret(存储证书和认证信息)。
功能实现:
- 基于域名的 HTTP 路由(v1 和 v2 版本分离)
- TLS 加密保护(v1 启用 HTTPS)
- HTTP 基本认证(限制 v1 访问)
扩展方向:可进一步配置路径路由(同一域名不同路径指向不同服务)、重定向规则、限流等高级功能。具体配置看另一篇文章【K8s】微服务类型配置实验-CSDN博客