[AWS云]EKS简单实战(二)ingress根据路径转发到不同的pod

背景:在上一次实验中是利用ALB类型的service转到转发流量到后端的POD。采用的架构如下:

但是在实际使用过程中,如果每一个POD都需要一个ALB去进行转发,那将采用大量的资源,所以这里要引入ingress,使得外部流量先达到ingress,然后ingress再根据具体的后缀去进行转发到不同的pod中,架构如下图:

一、实验准备,必须:
1.实验前要先创建EKS集群,如果没有集群的可以查看我之前的文章:
[AWS]EKS集群创建-CSDN博客

2.为部署ingress提供条件,条件不完整必定不能成功

    条件一:使用 eksctl 为集群创建 IAM OIDC 身份提供商

  1. 确定您的集群的 OIDC 发布者 ID。

    检索集群的 OIDC 发布者 ID 并将其存储在变量中。将 my-cluster 替换为您自己的值。

    cluster_name=my-cluster
    oidc_id=$(aws eks describe-cluster --name $cluster_name --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
    echo $oidc_id
  2. 确定您的账户中是否已存在具有您的集群发布者 ID 的 IAM OIDC 提供商。

    aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

    如果返回了输出,则表示您的集群已经有 IAM OIDC 提供商,您可以跳过下一步。如果没有返回输出,则您必须为集群创建 IAM OIDC 提供商。

  3. 使用以下命令为您的集群创建 IAM OIDC 身份提供商。

    eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve

   条件二:安装 AWS Load Balancer Controller
      1、使用 eksctl 创建 IAM 角色

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.7.2/docs/install/iam_policy.json
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
eksctl create iamserviceaccount \ --cluster=my-cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --role-name AmazonEKSLoadBalancerControllerRole \ --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --approve

     请将 my-cluster 替换为您的集群的名称,将 111122223333 替换为您的账户 ID,然后运行命令。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 arn:aws: 替换为 arn:aws-us-gov:

     2、安装 AWS Load Balancer Controller。使用 Helm V3 安装 AWS Load Balancer Controller

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm repo add eks https://aws.github.io/eks-charts
helm repo update eks
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=my-cluster \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller

将 my-cluster 替换为您的集群名称 

     3、验证控制器是否已安装

kubectl get deployment -n kube-system aws-load-balancer-controller

二、进行试验

实验的设想:创建三个不同的Pod,分别是game-2024、nginx、tomcat,由域名ekstest.example.com的不通后缀转发到不同的服务上。
"/"转发到game-2024,"/ng"转发到nginx,"/tomcat"转发到tomcat。

apiVersion: v1
# 定义了一个 Namespace 资源,所有后续的资源都将位于此命名空间内
kind: Namespace
metadata:
  name: game-2048

---

apiVersion: apps/v1
# 定义了一个 Deployment 资源,用于声明式地管理 Nginx Pod 的副本数量
kind: Deployment
metadata:
  namespace: game-2048
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  # 设置 Pod 的副本数量为 1
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        # 指定拉取镜像的策略,IfNotPresent 表示如果本地有则使用本地镜像
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80

---

apiVersion: v1
# 定义了一个 Service 资源,用于访问 Nginx Pod(通过 NodePort 在集群外部访问)
kind: Service
metadata:
  namespace: game-2048
  name: nginx-service
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  # 定义服务类型,NodePort 允许通过每个节点的特定端口从外部访问服务
  type: NodePort
  selector:
    app: nginx

---

# 与 Nginx 类似,以下定义了 Tomcat 的 Deployment 和 Service 资源

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game-2048
  name: tomcat-deployment
spec:
  selector:
    matchLabels:
      app: tomcat
  replicas: 1
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - image: tomcat
        imagePullPolicy: IfNotPresent
        name: tomcat
        ports:
        - containerPort: 8080

---

apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: tomcat-service
spec:
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  type: NodePort
  selector:
    app: tomcat

---

# 定义了 deployment-2048 的 Deployment 资源,与 Nginx 和 Tomcat 类似

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game-2048
  name: deployment-2048
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  replicas: 1
  template:
    metadata:
      labels:
        app.kubernetes.io/name: app-2048
    spec:
      containers:
      - image: public.ecr.aws/l6m2t8p7/docker-2048:latest
        imagePullPolicy: Always
        name: app-2048
        ports:
        - containerPort: 80

---

# 定义了 deployment-2048 对应的 Service 资源

apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: app-2048

---

apiVersion: networking.k8s.io/v1
# 定义了一个 Ingress 资源,用于管理外部到集群内服务的访问规则
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    # 指定 ALB 的方案为 internet-facing,即公开面向互联网
    alb.ingress.kubernetes.io/scheme: internet-facing
    # 指定目标类型为 IP
    alb.ingress.kubernetes.io/target-type: ip
    # 指定使用的 SSL 证书 ARN
    alb.ingress.kubernetes.io/ssl-certificate: arn:aws:acm:us-west-2:637423222550:certificate/2e0e7c3a-7ca4-49bd-a271-ac98dc3f3228
    # 指定 ALB 监听的端口,HTTP 80 和 HTTPS 443
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80, "HTTPS": 443}]'
spec:
  # 指定 Ingress 控制器的类名,这里使用 ALB Ingress Controller
  ingressClassName: alb
  rules:
    - host: ekstest.aime-ai.com
      http:
        paths:
        # 根路径 "/" 转发到 deployment-2048 对应的 Service
        - path: "/"
          pathType: Prefix
          backend:
            service:
              name: service-2048
              port:
                number: 80
        # "/ng" 路径转发到 nginx-service,使用 80 端口
        - path: "/ng"
          pathType: Prefix
          backend:
            service:
              name: nginx-service
              port:
                number: 80
        # "/tom" 路径转发到 tomcat-service,使用 8080 端口
        - path: "/tom"
          pathType: Prefix
          backend:
            service:
              name: tomcat-service
              port:
                number: 8080

每一部分我都写了标注,对应结构图来进行分析。

三、配置route53进行测试

 注意:我到nginx的pod里面创建中,在nginx的页面目录/user/share/nginx/html/ng下创建index.html内容there is ekstest.example.com/ng nginx

 注意:我到tomcat的pod里面创建中,在nginx的页面目录webapps/tom目录下创建index.html内容there is ekstest.aime-ai.com/tom/ tomcat


这里的ingress没有进行地址重写,而是把路径一起转发到了对应的pod中

  • 36
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值