Este tema le muestra cómo configurar un balanceador de carga de aplicaciones (ALB) de AWS con GKE en AWS.
Antes de empezar
Antes de comenzar a usar GKE en AWS, asegúrese de haber realizado las siguientes tareas:
- Complete los prerrequisitos .
- Tener permisos para crear políticas, roles y usuarios de AWS IAM para el balanceador de carga.
- Instalar un servicio de gestión .
- Cree un clúster de usuarios . Si utiliza la identidad de carga de trabajo, cree un clúster de usuarios con la identidad de carga de trabajo .
- Desde su directorio
anthos-aws
, useanthos-gke
para cambiar el contexto a su clúster de usuarios. Reemplace CLUSTER_NAME con el nombre de su clúster de usuarios.cd anthos-aws env HTTPS_PROXY=http://localhost:8118 \ anthos-gke aws clusters get-credentials CLUSTER_NAME
- Instale la herramienta de línea de comandos
curl
o una herramienta similar.
Etiquetado de subredes
GKE en AWS requiere etiquetas en las subredes que contienen puntos de conexión ALB. GKE en AWS etiqueta automáticamente todas las subredes especificadas en el campo spec.Networking.ServiceLoadBalancerSubnetIDs
del recurso AWSCluster
.
Si instaló GKE en AWS en una VPC existente o desea utilizar subredes adicionales, aplique etiquetas a las subredes en dos o más zonas de disponibilidad de AWS.
Configurar ALB en GKE en AWS
Antes de poder crear un ALB, debe configurar GKE en AWS configurando los permisos de AWS IAM y proporcionando claves de acceso.
Crear permisos de AWS IAM
Para crear un ALB para su clúster de usuarios, debe configurar un usuario de AWS IAM con permisos para crear y operar el ALB.
Descarga una política de IAM para el controlador de entrada ALB. Puedes consultarla en GitHub .
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.0/docs/install/iam_policy.json
Utilice la herramienta de línea de comandos
aws
para crear una política de IAM llamadaALBIngressControllerIAMPolicy
.aws iam create-policy \ --policy-name ALBIngressControllerIAMPolicy \ --policy-document file://iam-policy.json
La respuesta incluye el nombre de recurso de Amazon (ARN) de la política de IAM. Guarde el ARN para su uso posterior.
Otorgar acceso a su balanceador de carga
En esta sección, asocia la política de usuario con un usuario de AWS IAM o con un rol de IAM que tenga una identidad de carga de trabajo configurada.
Usuario de IAM
Utilice la herramienta
aws
para crear un usuario IAM para el controlador de ingreso ALB.aws iam create-user \ --user-name ALB_CONTROLLER_USER_NAME
Reemplace ALB_CONTROLLER_USER_NAME con el nombre de usuario que desea crear para su controlador ALB Ingress.
Adjunte
ALBIngressControllerIAMPolicy
al nombre de usuario.aws iam attach-user-policy \ --user-name ALB_CONTROLLER_USER_NAME \ --policy-arn ALB_IAM_POLICY_ARN
Reemplace lo siguiente:
- ALB_CONTROLLER_USER_NAME con el nombre de usuario que desea crear para su controlador ALB Ingress.
- ALB_IAM_POLICY_ARN con el ARN de la política de IAM que creó anteriormente.
Cree una clave de acceso de AWS IAM para el usuario del controlador de ingreso ALB.
aws iam create-access-key --user-name ALB_CONTROLLER_USER_NAME
Reemplace ALB_CONTROLLER_USER_NAME con el nombre de usuario que desea crear para su controlador ALB Ingress.
La herramienta de línea de comandos
aws
imprime los detalles de la clave de acceso.{ "AccessKey": { "UserName": ALB_CONTROLLER_USER_NAME "AccessKeyId": "AKIAIOSFODNN7EXAMPLE", "Status": "Active", "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "CreateDate": "2020-07-23T17:53:58Z" } }
Guarde la clave de acceso y la clave de acceso secreta en variables de entorno. Las usará para configurar su clúster de usuarios.
ALB_ACCESS_KEY_ID=ACCESS_KEY_ID ALB_SECRET_ACCESS_KEY=SECRET_ACCESS_KEY
Cree un secreto en su clúster con la clave de acceso y la clave de acceso secreta. El controlador de entrada de ALB utiliza este secreto para autenticarse en AWS y administrar los ALB.
env HTTPS_PROXY=http://localhost:8118 \ kubectl create secret generic alb-ingress-controller-creds \ -n kube-system \ --from-literal=access_key_id=$ALB_ACCESS_KEY_ID \ --from-literal=secret_access_key=$ALB_SECRET_ACCESS_KEY
Rol con identidad de carga de trabajo
Complete los pasos de "Creación de un clúster de usuarios con identidad de carga de trabajo" . Al crear una política , utilice el ARN de ALBIngressControllerIAMPolicy
para el valor de EXISTING_AWS_POLICY .
Configurar su clúster
Para configurar un ALB, debe instalar los siguientes componentes en su clúster de usuarios:
- El administrador de certificados de Jetstack para generar y administrar certificados TLS para los recursos ALB de su clúster.
- El controlador de balanceador de carga de AWS para aprovisionar y administrar ALB.
Implemente Jetstack cert-manager instalando el manifiesto desde GitHub.
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
Descargue el manifiesto del controlador de AWS Load Balancer desde GitHub:
curl -Lo v2_4_0_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.0/v2_4_0_full.yaml
Seleccione si está utilizando un usuario o rol de IAM con identidad de carga de trabajo.
Usuario de IAM
Edite el archivo
v2_4_0_full.yaml
y busquekind: Deployment
. Reemplace el objeto `Deployment` con esta versión modificada.kind: Deployment metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system spec: replicas: 1 selector: matchLabels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller template: metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller spec: containers: - args: - --cluster-name=CLUSTER_UID - --aws-region=AWS_REGION - --aws-vpc-id=AWS_VPC_ID - --ingress-class=alb - --disable-restricted-sg-rules=true image: amazon/aws-alb-ingress-controller:v2.4.0 env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: alb-ingress-controller-creds key: access_key_id - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: alb-ingress-controller-creds key: secret_access_key livenessProbe: failureThreshold: 2 httpGet: path: /healthz port: 61779 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 10 name: controller ports: - containerPort: 9443 name: webhook-server protocol: TCP resources: limits: cpu: 200m memory: 500Mi requests: cpu: 100m memory: 200Mi securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsNonRoot: true volumeMounts: - mountPath: /tmp/k8s-webhook-server/serving-certs name: cert readOnly: true priorityClassName: system-cluster-critical securityContext: fsGroup: 1337 serviceAccountName: aws-load-balancer-controller terminationGracePeriodSeconds: 10 volumes: - name: cert secret: defaultMode: 420 secretName: aws-load-balancer-webhook-tls ---
Reemplace lo siguiente:
-
AWS_ACCESS_KEY_ID
: la clave de acceso de AWS generada cuando creó un usuario de AWS IAM -
AWS_SECRET_ACCESS_KEY
: la clave de acceso secreta de AWS generada cuando creó un usuario de AWS IAM
Rol con identidad de carga de trabajo
Edite el archivo
v2_4_0_full.yaml
y busquekind: Deployment
. Reemplace todo el objetoDeployment
con esta versión modificada:apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system spec: replicas: 1 selector: matchLabels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller template: metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller spec: containers: - args: - --cluster-name=CLUSTER_UID - --aws-region=AWS_REGION - --aws-vpc-id=AWS_VPC_ID - --ingress-class=alb - --disable-restricted-sg-rules=true image: amazon/aws-alb-ingress-controller:v2.4.0 env: - name: AWS_ROLE_ARN value: LB_CONTROLLER_ROLE_ARN - name: AWS_WEB_IDENTITY_TOKEN_FILE value: /var/run/secrets/aws-load-balancer-controller/serviceaccount/token livenessProbe: failureThreshold: 2 httpGet: path: /healthz port: 61779 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 10 name: controller ports: - containerPort: 9443 name: webhook-server protocol: TCP resources: limits: cpu: 200m memory: 500Mi requests: cpu: 100m memory: 200Mi securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true runAsNonRoot: true volumeMounts: - mountPath: /tmp/k8s-webhook-server/serving-certs name: cert readOnly: true - mountPath: /var/run/secrets/aws-load-balancer-controller/serviceaccount name: aws-iam-token readOnly: true priorityClassName: system-cluster-critical securityContext: fsGroup: 1337 serviceAccountName: aws-load-balancer-controller terminationGracePeriodSeconds: 10 volumes: - name: cert secret: defaultMode: 420 secretName: aws-load-balancer-webhook-tls - name: aws-iam-token projected: defaultMode: 420 sources: - serviceAccountToken: audience: sts.amazonaws.com expirationSeconds: 86400 path: token ---
Reemplace lo siguiente:
-
CLUSTER_UID
: el UID de su clúster, por ejemplo,bbc7d232-21f6-4bb1-90dd-4b064cf8ccf8
-
AWS_VPC_ID
: el ID de su VPC de AWS; por ejemplo,vpc-1234567890abc
-
LB_CONTROLLER_ROLE_ARN
: el ARN del rol AWSLBControllerRole -
AWS_REGION
: la región de AWS de su clúster, por ejemplo,us-east-1
-
Aplique el controlador a su clúster.
env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f v2_4_0_full.yaml
GKE en AWS instala el controlador de ingreso ALB.
Creando un ALB
En esta sección crearás un ALB de ejemplo que sirva como remake del juego 2048 .
Copia la siguiente configuración YAML en un archivo llamado
2048.yaml
. Esta configuración crea un espacio de nombres, un servicio y una implementación de Kubernetes. La implementación se expone mediante un Ingress.apiVersion: v1 kind: Namespace metadata: name: "2048-game" --- apiVersion: v1 kind: Service metadata: name: "service-2048" namespace: "2048-game" spec: ports: - port: 80 targetPort: 80 protocol: TCP type: NodePort selector: app: "2048" --- apiVersion: apps/v1 kind: Deployment metadata: name: "2048-deployment" namespace: "2048-game" spec: selector: matchLabels: app: "2048" replicas: 5 template: metadata: labels: app: "2048" spec: containers: - image: alexwhen/docker-2048 imagePullPolicy: Always name: "2048" ports: - containerPort: 80 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: "2048-ingress" namespace: "2048-game" annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internet-facing labels: app: 2048-ingress spec: rules: - http: paths: - path: /* backend: serviceName: "service-2048" servicePort: 80
Utilice
kubectl
para aplicar la configuración a su clúster.env HTTPS_PROXY=http://localhost:8118 \ kubectl apply -f 2048.yaml
Utilice
kubectl
para comprobar el estado del recurso Ingress.env HTTPS_PROXY=http://localhost:8118 \ kubectl get ingress -n 2048-game 2048-ingress
Se muestra el estado de su Ingress. La columna
ADDRESS
contiene el punto final de su Ingress.NAME HOSTS ADDRESS PORTS AGE 2048-ingress * 123456-2048game-2048ingr-6fa0-abcdefg.us-east-1.elb.amazonaws.com 80 2m19s
Navegue hasta el punto final de ALB en un navegador. Por ejemplo:
http://123456-2048game-2048ingr-6fa0-abcdefg.us-east-1.elb.amazonaws.com
. Aparece el juego 2048.
¿Qué sigue?
- Lea la documentación del controlador ALB Ingress .