实验目标

  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: 2
  selector:
    matchLabels:
      app: myapp
      version: v1
  template:
    metadata:
      labels:
        app: myapp
        version: v1
    spec:
      containers:
      - name: myapp
        image: nginx:alpine
        ports:
        - 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: myapp
    version: v1
  ports:
  - port: 80
    targetPort: 80
kubectl apply -f myapp-v1.yaml

部署v2版本

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      version: v2
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
      - name: myapp
        image: nginx:alpine
        ports:
        - 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: myapp
    version: v2
  ports:
  - port: 80
    targetPort: 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-basic
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /  # 路径重写(可选,根据需求调整)
spec:
  ingressClassName: nginx  # 关联 Nginx Ingress Controller
  rules:
  - host: myapp-v1.example.com  # v1 版本域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-v1
            port:
              number: 80
  - host: myapp-v2.example.com  # v2 版本域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-v2
            port:
              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-tls
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  tls:  # 新增 TLS 配置
  - hosts:
    - myapp-v1.example.com  # 与证书绑定的域名一致
    secretName: myapp-tls-secret  # 关联 TLS 证书 Secret
  rules:
  - host: myapp-v1.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-v1
            port:
              number: 80
  - host: myapp-v2.example.com  # v2 暂不启用 TLS
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-v2
            port:
              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-tls
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    # 基本认证配置
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: myapp-auth-secret  # 关联认证 Secret
    nginx.ingress.kubernetes.io/auth-realm: "请输入管理员账号密码"  # 认证提示信息
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - myapp-v1.example.com
    secretName: myapp-tls-secret
  rules:
  - host: myapp-v1.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-v1
            port:
              number: 80
  - host: myapp-v2.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-v2
            port:
              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博客

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐