背景:在上一次实验中是利用ALB类型的service转到转发流量到后端的POD。采用的架构如下:
但是在实际使用过程中,如果每一个POD都需要一个ALB去进行转发,那将采用大量的资源,所以这里要引入ingress,使得外部流量先达到ingress,然后ingress再根据具体的后缀去进行转发到不同的pod中,架构如下图:
一、实验准备,必须:
1.实验前要先创建EKS集群,如果没有集群的可以查看我之前的文章:
[AWS]EKS集群创建-CSDN博客
2.为部署ingress提供条件,条件不完整必定不能成功
条件一:使用 eksctl
为集群创建 IAM OIDC 身份提供商,
-
确定您的集群的 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
-
确定您的账户中是否已存在具有您的集群发布者 ID 的 IAM OIDC 提供商。
aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
如果返回了输出,则表示您的集群已经有 IAM OIDC 提供商,您可以跳过下一步。如果没有返回输出,则您必须为集群创建 IAM OIDC 提供商。
-
使用以下命令为您的集群创建 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
替换为您的账户 ID,然后运行命令。如果您的集群位于 AWS GovCloud(美国东部)或 AWS GovCloud(美国西部)AWS 区域,则将 111122223333
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中