介绍
TargetGroupBinding是一种自定义资源(CR),可以使用现有的ALB TargetGroup或NLB TargetGroup公开您的pod。
这将允许您完全在Kubernetes之外配置负载平衡器基础设施,但仍然使用Kubernetes服务管理目标。
使用场景
在 Amazon EKS(Elastic Kubernetes Service)环境中,TargetGroupBinding 是 AWS Load Balancer Controller(ALB Ingress Controller)的一部分,用于将 Kubernetes Service 与 AWS Application Load Balancer(ALB)的目标组关联起来。这个控制器的主要作用是简化在 EKS 中使用 ALB 进行负载均衡的过程。
1. 多服务应用负载均衡: 如果你在 EKS 上运行多个微服务,可以使用 TargetGroupBinding 将每个微服务关联到 ALB 中的不同目标组。这样,ALB 将能够根据负载均衡策略将流量分发到不同的后端服务。
2. 路径和主机基础的路由:ALB 具有丰富的路由功能,你可以使用 TargetGroupBinding配置不同路径或主机名的路由规则。例如,将一个路径映射到一个服务,而将另一个路径映射到另一个服务。
3. SSL 终止:通过在 ALB 中配置 SSL 终止,可以使用 TargetGroupBinding 将不同的 Kubernetes 服务关联到使用不同 SSL 证书的目标组,以实现安全的 HTTPS 通信。
4. 自动扩展: 你可以根据负载的增减动态调整目标组中的实例数量,以满足应用程序的性能需求。
TargetGroupBinding 在 EKS 中充当了 ALB Ingress Controller 的一部分,简化了与 ALB 的集成,提供了更灵活的路由和负载均衡配置。这对于在 Kubernetes 中部署和扩展应用程序提供了方便。
官网参考: TargetGroupBinding
ALB控制器使用
安装ALB的方法,可以查看之前的内容EKS部署ALB负载均衡
部署一个小游戏
# 部署一个小游戏应用
cat >2048_full.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: default
name: deployment-2048
spec:
selector:
matchLabels:
app.kubernetes.io/name: app-2048
replicas: 2
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
---
apiVersion: v1
kind: Service
metadata:
namespace: default
name: service-2048
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app.kubernetes.io/name: app-2048
EOF
部署两个web应用
# 应用一
cat > myapp.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx:1.22
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: "myapp-svc"
spec:
selector:
app: myapp
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 80
EOF
# 应用二
cat > httpd.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
labels:
app: httpd
name: httpd
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- image: httpd
imagePullPolicy: Always
name: httpd
---
apiVersion: v1
kind: Service
metadata:
name: "httpd-svc"
spec:
selector:
app: httpd
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 80
EOF
创建ingress规则
cat > ingress.yaml <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: default
name: ingress-2048
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/backend-protocol: HTTP
alb.ingress.kubernetes.io/subnets: "subnet-07916a34475c608ad,subnet-0544a891d4fc8b4c5,subnet-0785a911aa890b86d"
spec:
ingressClassName: alb
rules:
- host: app.dreamrui.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-svc
port:
number: 80
- host: backend.dreamrui.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: httpd-svc
port:
number: 80
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-2048
port:
number: 80
EOF
查看对应规则
kubectl get ingress
控制台查看规则
访问测试
1.访问小游戏应用
2.访问app.dreamrui.com
3.访问backend.dreamrui.com
TargetGroupBinding
自建目标组
注意事项
1.目标类型为IP地址
2.vpc必须和eks集群在同一个
不指定ipv4地址. 创建一个空的目标组
目标组和容器的svc相关联
cat > tgb.yaml <<EOF
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: nginx-svc-tgb
spec:
serviceRef:
name: nginx-svc
port: 80
targetGroupARN: arn:aws:elasticloadbalancing:us-east-1:917958955567:targetgroup/nginx-tgb/e48046f037c54a78
EOF
再次到控制台查看,可以发现svc的pod已经关联到了目标组上
绑定到ALB
这里可以选择现有alb,可以自建alb进行绑定
访问测试
自我判定
序号 | 判定描述 | 自我判定(是/否) |
|---|---|---|
1 | 在各搜索引擎中是否能找到知识信息(包括但不限于Google、百度、Bing) | 是 |
2 | 是否需要代码集成开发 | 否 |














