当前位置: 首页 > news >正文

实验项目:Kubernetes Ingress 实战演练

实验目标

  1. 部署 Nginx Ingress Controller
  2. 创建多版本应用及服务
  3. 配置 Ingress 实现域名路由
  4. 启用 TLS 加密保护传输
  5. 添加 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博客

http://www.dtcms.com/a/355771.html

相关文章:

  • Cesium入门教程(三)环境搭建(Vue版)
  • 蓝凌研究院《2025上市公司AI数智化转型白皮书》发布
  • 【力扣】2725. 间隔取消
  • linux 环境 批量发送get请求
  • 大模型常用术语
  • 机器视觉学习-day10-图像添加水印
  • 帕萨特盘式制动器cad+设计说明书
  • TensorFlow 面试题及详细答案 120道(41-50)-- 数据输入与管道
  • workflow/http_parser源码解密:HTTP解析器的双倍扩容与零拷贝策略
  • 【C#】征服 .NET Framework 4.8 中的“古董”日期格式:/Date(1754548600000)/ 和 ISO 8601
  • 【Nacos】优雅规范的使用和管理yml配置文件
  • 苍穹外卖项目笔记day01
  • 工业级TF卡NAND + 北京君正 + Rk瑞芯微的应用
  • 本地大模型部署(下载) vs. 从头训练大模型
  • APP手游使用游戏盾SDK为何能有效抵御各类攻击?
  • ApiFox高并发测试用例
  • hintcon2025 IMGC0NV
  • 2024中山大学研保研上机真题
  • 多模态融合新纪元:Ovis2.5 本地部署教程,实现文本、图像与代码的深度协同推理
  • 力扣hot100:滑动窗口最大值优化策略及思路讲解(239)
  • MySQL 索引失效全解析与优化指南
  • 【软考】中级网络工程师历年真题合集下载(2015-2024)
  • Java多线程超详学习内容
  • Python 中的反射机制与动态灵活性
  • Spring学习笔记:Spring JDBC(jdbc Template)的深入学习和使用
  • 行业前瞻:在线教育系统源码与网校APP开发的技术进化方向
  • C++学习笔记之异常处理
  • Pruning-Guided Curriculum Learning
  • 机器视觉学习-day06-图像旋转
  • MPPT的基本原理