介绍

TargetGroupBinding是一种自定义资源(CR),可以使用现有的ALB TargetGroupNLB 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

是否需要代码集成开发