首页 > 其他分享 >[AWS]EKS简单实战(二)ingress根据路径转发到不同的pod

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

时间:2024-06-19 14:28:36浏览次数:21  
标签:ingress name tomcat -- aws AWS 2048 nginx 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中

标签:ingress,name,tomcat,--,aws,AWS,2048,nginx,pod
From: https://blog.csdn.net/China_Yanhy/article/details/139772746

相关文章

  • 无状态Pod的创建流程
    我们知道无状态工作负载Deployment创建容器组,是通过控制ReplicaSet来实现的,下面我们了解下ReplicaSet创建Pod的详细流程。  图中有三个List-Watch,分别是ControllerManager(运行在Master),Scheduler(运行在Master),kubelet(运行在Node)。它们在进程一启动就会监听(Watch)APIServ......
  • 名称空间,亲和性,pod生命周期,健康检查
    一、名称空间1、切换名称空间[root@masterpod]#kubectlcreatenstestnamespace/testcreated[root@masterpod]#kubectlgetnsNAMESTATUSAGEdefaultActive10hkube-node-leaseActive10hkube-publicActive10hkube-sy......
  • 批量异步上传aws图片脚本(python)
    背景工作中需要上传一些测试图片,于是网上找找资料(官方说明),前置步骤如下。python需要3.8以上,安装最新的boto3库:pipinstallboto3有一个S3权限的aws账户,得到访问密钥ACCESS_KEY与SECRET_KEY,以及上传图片的存储桶位置安装异步编程asyncio,aiohttp库,方便本地异步上传图片代码......
  • kubectl按pod创建时间排序获取列表 _
    按时间排序,可以更快地找到最近更新的pod基于当前ns1kubectlgetpods--sort-by=.metadata.creationTimestampBASH基于整个集群1kubectlgetpods-A--sort-by=.metadata.creationTimestampBASH也可以按Pod的状态排序,快速找到不正常的Pod1......
  • Podman
    Podmanhttps://podman.io/Thebestfree&opensourcecontainertoolsManagecontainers,pods,andimageswithPodman.SeamlesslyworkwithcontainersandKubernetesfromyourlocalenvironment. advantagehttps://www.redhat.com/zh/topics/container......
  • 如何从阿里云ECS迁移到AWS EC2?
    随着云计算技术的迅速发展,众多跨国企业正在考虑将其工作负载迁移到AWSEC2,以获得更多的功能、灵活性和性能。在这个过程中,如何顺利迁移业务主机,并且保障迁移过程中业务的正常稳定访问,成为了一个具有挑战性的问题。九河云凭借丰富的多云迁移经验,借助AWSApplicationMigrationServ......
  • kubernetes-ingress-nginx-controller资源-用于管理和处理集群中的 Ingress 资源
    ingress-nginx-controller是一个常用的KubernetesIngress控制器,它基于NGINX实现,主要用于管理和处理集群中的Ingress资源。Ingress资源是Kubernetes中的一种网络入口资源,用于将外部流量路由到集群内部的服务ingress-nginx-controller的功能作用流量管理和路由#1、......
  • kubernetes-ingress-nginx-rule的配置-将外部流量路由到集群内部的规则配置
    KubernetesIngress资源配置文件主要定义了如何通过NGINXIngress控制器来处理进入集群的HTTP/HTTPS流量apiVersion:networking.k8s.io/v1#表示这是一个Ingress资源,并使用了Kubernetes网络APIv1版本kind:Ingress#kind:定义了资源的类型。在这里是Ingr......
  • 基于 Nginx Ingress + 云效 AppStack 实现灰度发布
    作者:子丑场景简介灰度发布是降低生产部署风险,提升线上服务稳定性的重要手段,这在当前快速迭代的软件研发中尤为重要。相对于K8s默认的滚动部署或者简单的Pod分批,基于流量特征的灰度发布验证更精准,风险更低。在云原生场景下,基于NginxIngress的灰度发布是被广泛使用的方案......
  • k8s_示例_根据CPU使用率自动扩展Pod数量并使Pod分布在不同节点
    我们从制作测试用镜像开始,后续一步一步实现在k8s中使pod根据cpu用量自动扩展pod个数。知识准备在做这个示例之前,需要了解k8s(也叫kubernetes)基本原理,了解k8s是用来干嘛的即可,以及deployment、service、hpa、镜像、docker等概念。不然会有些晕的,不知道这些配置和这些操作......