Configuring Yandex Application Load Balancer logging via an ingress controller
You can configure logging for L7 load balancers created with Application Load Balancer ingress controllers
Tip
We recommend using the new Yandex Cloud Gwin controller instead of an Application Load Balancer Ingress controller.
This tutorial explains how to create three L7 load balancers with different logging settings:
- Save logs to the default log group.
- Save logs to a custom log group.
- Save no logs.
To configure L7 load balancers:
- Create a test application.
- Create Ingress resources.
- Specify the settings for the Ingress resource groups.
- Check the result.
If you no longer need the resources you created, delete them.
Required paid resources
The support cost for this solution includes:
- Fee for a DNS zone and DNS requests (see Cloud DNS pricing).
- Fee for using the master and outgoing traffic in a Managed Service for Kubernetes cluster (see Managed Service for Kubernetes pricing).
- Fee for using computing resources, OS, and storage in cluster nodes (VMs) (see Compute Cloud pricing).
- Fee for using computing resources of each L7 load balancer (see Application Load Balancer pricing).
- Fee for public IP addresses for cluster nodes and L7 load balancers (see Virtual Private Cloud pricing).
- Cloud Logging fee for data logging and storage (see Cloud Logging pricing).
Getting started
Set up your infrastructure
If you do not have the Yandex Cloud CLI installed yet, install and initialize it.
By default, the CLI uses the folder specified when creating the profile. To change the default folder, use the yc config set folder-id <folder_ID> command. You can also set a different folder for any specific command using the --folder-name or --folder-id parameter.
-
Create the following service accounts for the Managed Service for Kubernetes cluster:
-
Service account for resources with the
k8s.clusters.agentandvpc.publicAdminroles for the folder to host the new Managed Service for Kubernetes cluster. -
Service account for nodes with the container-registry.images.puller role for the folder with the Docker image registry. The nodes will use this account to pull the required Docker images from the registry.
-
Service account for the Application Load Balancer ingress controller with the following roles:
- alb.editor: To create the required resources.
- vpc.publicAdmin: To manage external connectivity.
- certificate-manager.certificates.downloader: To use certificates registered in Yandex Certificate Manager.
- compute.viewer: To use Managed Service for Kubernetes cluster nodes in the load balancer’s target groups.
You can use the same service account for all operations.
-
-
Create an authorized key for the ingress controller's service account in JSON format and save it to the
key.jsonfile:yc iam key create \ --service-account-name <name_of_service_account_for_ingress_controller> \ --output key.jsonYou need the key data to install the ALB ingress controller.
-
Create security groups for the Managed Service for Kubernetes cluster and its node groups.
Also configure the security groups required for Application Load Balancer.
Warning
The configuration of security groups determines the performance and availability of the cluster and the services and applications running in it.
-
Create a Managed Service for Kubernetes cluster. Use these settings:
- Specify the previously created service account for resources as well as security groups.
- For Yandex Cloud internal network usage, your cluster does not need a public IP address. To enable internet access to your cluster, assign it a public IP address.
-
Create a node group. Use these settings:
- Specify the previously created service account for nodes as well as security groups.
- To enable internet access for your node group (e.g., for Docker image pulls), assign it a public IP address.
-
If you do not have Terraform yet, install it.
-
Get the authentication credentials. You can add them to environment variables or specify them later in the provider configuration file.
-
Configure and initialize a provider. There is no need to create a provider configuration file manually, you can download it
. -
Place the configuration file in a separate working directory and specify the parameter values. If you did not add the authentication credentials to environment variables, specify them in the configuration file.
-
Download the k8s-and-registry-for-alb.tf
configuration file to the same working directory.This file describes:
-
Managed Service for Kubernetes cluster.
-
Security groups which contain rules required for the Managed Service for Kubernetes cluster and its node groups.
Some rules are required for Application Load Balancer to work correctly.
Warning
The configuration of security groups determines the performance and availability of the cluster and the services and applications running in it.
-
Service account for Managed Service for Kubernetes resources and nodes.
-
Service account for the Application Load Balancer ingress controller.
-
Authorized key for the service account of the ingress controller.
-
Creating a local
key.jsonfile with the authorized key data. You need the key data to install the ALB ingress controller.
-
Specify the following in the
k8s-and-registry-for-alb.tffile:- Folder ID.
- Kubernetes version for the Managed Service for Kubernetes cluster and node groups.
- Name of the service account for Kubernetes resources and nodes.
- Name of the service account for the Application Load Balancer ingress controller.
- Name of the custom Cloud Logging log group.
-
Make sure the Terraform configuration files are correct using this command:
terraform validateTerraform will show any errors found in your configuration files.
-
Create the required infrastructure:
-
Run this command to view the planned changes:
terraform planIf you described the configuration correctly, the terminal will display a list of the resources to update and their parameters. This is a verification step that does not apply changes to your resources.
-
If everything looks correct, apply the changes:
-
Run this command:
terraform apply -
Confirm updating the resources.
-
Wait for the operation to complete.
-
All the required resources will be created in the specified folder. You can check resource availability and their settings in the management console
. -
Get ready to use the Managed Service for Kubernetes cluster
-
Install kubect
and configure it to work with the new cluster.If a cluster has no public IP address assigned and
kubectlis configured via the cluster's private IP address, runkubectlcommands on a Yandex Cloud VM that is in the same network as the cluster.
Register a domain zone
Register a public domain zone and delegate your domain.
Install the Application Load Balancer ingress controller
Install the ALB ingress controller by following this guide. During the installation, use key.json you created when setting up your infrastructure.
Create a test application
Create the ConfigMap
-
Create the
app.yamlfile:app.yaml
apiVersion: v1 kind: ConfigMap metadata: name: alb-demo-1 data: nginx.conf: | worker_processes auto; events { } http { server { listen 80 ; location = /_healthz { add_header Content-Type text/plain; return 200 'ok'; } location / { add_header Content-Type text/plain; return 200 'Index'; } location = /app1 { add_header Content-Type text/plain; return 200 'This is APP#1'; } } } --- apiVersion: apps/v1 kind: Deployment metadata: name: alb-demo-1 labels: app: alb-demo-1 version: v1 spec: replicas: 2 selector: matchLabels: app: alb-demo-1 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 template: metadata: labels: app: alb-demo-1 version: v1 spec: terminationGracePeriodSeconds: 5 volumes: - name: alb-demo-1 configMap: name: alb-demo-1 containers: - name: alb-demo-1 image: nginx:latest ports: - name: http containerPort: 80 livenessProbe: httpGet: path: /_healthz port: 80 initialDelaySeconds: 3 timeoutSeconds: 2 failureThreshold: 2 volumeMounts: - name: alb-demo-1 mountPath: /etc/nginx readOnly: true resources: limits: cpu: 250m memory: 128Mi requests: cpu: 100m memory: 64Mi --- apiVersion: v1 kind: Service metadata: name: alb-demo-1 spec: selector: app: alb-demo-1 type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP nodePort: 30081 -
Create an app:
kubectl apply -f app.yamlResult:
configmap/alb-demo-1 created deployment.apps/alb-demo-1 created service/alb-demo-1 created
Create Ingress resources
Create three Ingress
-
Create a file named
ingress.yamlwith the load balancer settings and domain name:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: logs-demo-nondefault annotations: ingress.alb.yc.io/group-name: non-default ingress.alb.yc.io/subnets: <list_of_subnet_IDs> ingress.alb.yc.io/security-groups: <list_of_security_group_IDs> ingress.alb.yc.io/group-settings-name: non-default-settings ingress.alb.yc.io/external-ipv4-address: auto spec: rules: - host: <domain_name> http: paths: - pathType: Prefix path: "/" backend: service: name: alb-demo-1 port: name: http --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: logs-demo-disabled annotations: ingress.alb.yc.io/group-name: logs-disabled ingress.alb.yc.io/subnets: <list_of_subnet_IDs> ingress.alb.yc.io/security-groups: <list_of_security_group_IDs> ingress.alb.yc.io/group-settings-name: logs-disabled-settings ingress.alb.yc.io/external-ipv4-address: auto spec: rules: - host: <domain_name> http: paths: - pathType: Prefix path: "/" backend: service: name: alb-demo-1 port: name: http --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: logs-demo-default annotations: ingress.alb.yc.io/group-name: default ingress.alb.yc.io/subnets: <list_of_subnet_IDs> ingress.alb.yc.io/security-groups: <list_of_security_group_IDs> ingress.alb.yc.io/external-ipv4-address: auto spec: rules: - host: <domain_name> http: paths: - pathType: Prefix path: "/" backend: service: name: alb-demo-1 port: name: httpWhere:
-
ingress.alb.yc.io/group-name: Group name. Ingress resources are grouped so that a separate Application Load Balancer serves each group. -
ingress.alb.yc.io/subnets: One or more subnets to host the load balancer. -
ingress.alb.yc.io/security-groups: One or more security groups for the load balancer. If you skip this parameter, the default security group will be used. -
ingress.alb.yc.io/external-ipv4-address: Public access to the load balancer from the internet. Enter the IP address you got earlier or setautoto get a new IP address automatically.If you set
auto, deleting the load balancer from the cloud removes its IP address. To avoid this, use a reserved IP address. -
ingress.alb.yc.io/group-settings-name: Name for the Ingress resource group settings to describe in theIngressGroupSettingsoptional resource.
Optionally, specify the additional controller settings:
Note
The settings listed below will only apply to the virtual hosts of the Ingress resource in which the corresponding annotations are configured.
They will not apply to the virtual hosts of the group's other Ingress resources.
-
ingress.alb.yc.io/internal-ipv4-address: Provide internal access to the load balancer. Enter the internal IP address or useautoto get the IP address automatically.Note
You can only use one type of access to the load balancer at a time:
ingress.alb.yc.io/external-ipv4-addressoringress.alb.yc.io/internal-ipv4-address. -
ingress.alb.yc.io/internal-alb-subnet: Subnet to host the load balancer. This parameter is required if you selectingress.alb.yc.io/internal-ipv4-address. -
ingress.alb.yc.io/protocol: Protocol for connections between the load balancer and backends:http: HTTP/1.1. This is a default value.http2: HTTP/2.grpc: gRPC.
-
ingress.alb.yc.io/transport-security: Encryption protocol for connections between the load balancer and backends.Warning
For ALB Ingress Controller 0.2.0 and later, you can only use this annotation in the Service object.
Annotations specified in
Ingressresources sharing a single service with the same backend group settings apply correctly. However, this feature is deprecated and will be discontinued.The acceptable value is
tls: TLS without certificate validation.If this annotation is not specified, the load balancer will connect to the backends without encryption.
-
ingress.alb.yc.io/prefix-rewrite: Replace the path with the specified value. -
ingress.alb.yc.io/upgrade-types: Valid values of theUpgradeHTTP header, e.g.,websocket. -
ingress.alb.yc.io/request-timeout: Maximum connection request timeout. -
ingress.alb.yc.io/idle-timeout: Maximum connection idle timeout.Make sure to provide the
request-timeoutandidle-timeoutvalues with units of measurement, e.g.,300msor1.5h. Acceptable units of measurement include:ns, nanosecondsus, microsecondsms, millisecondss, secondsm, minutesh, hours
For more information about the Ingress resource settings, see Ingress resource fields and annotations.
-
-
Create Ingress resources:
kubectl apply -f ingress.yamlResult:
ingress.networking.k8s.io/logs-demo-nondefault created ingress.networking.k8s.io/logs-demo-disabled created ingress.networking.k8s.io/logs-demo-default createdThe system will automatically deploy three L7 load balancers based on the Ingress resource configurations.
Specify the settings for the Ingress resource groups
Create the IngressGroupSettings resource with these logging settings for the Ingress resource groups:
non-default-settings: Logging to the previously created custom log group with defined rules.logs-disabled-settings: No logging.
If you want to have logs saved to the default log group, skip these settings.
-
Create the
settings.yamlfile with the log group ID:apiVersion: alb.yc.io/v1alpha1 kind: IngressGroupSettings metadata: name: non-default-settings logOptions: logGroupID: <custom_log_group_ID> discardRules: - discardPercent: 50 grpcCodes: - OK - CANCELLED - UNKNOWN - discardPercent: 67 httpCodeIntervals: - HTTP_1XX - discardPercent: 20 httpCodes: - 200 - 404 --- apiVersion: alb.yc.io/v1alpha1 kind: IngressGroupSettings metadata: name: logs-disabled-settings logOptions: disable: true -
Create the resources:
kubectl apply -f settings.yamlResult:
ingressgroupsettings.alb.yc.io/non-default-settings created ingressgroupsettings.alb.yc.io/logs-disabled-settings created
The settings from those resources will apply to the Ingress resource groups in line with the ingress.alb.yc.io/group-settings-name annotations specified for the Ingress resources.
Check the result
Get the log group IDs for the new L7 load balancers and make sure they match the settings in settings.yaml:
- For one of the load balancers, select the custom log group you created with defined rules.
- Use the default log group for another.
- For the third load balancer, disable logging.
Delete the resources you created
Some resources are not free of charge. Delete the resources you no longer need to avoid paying for them:
- Delete the Managed Service for Kubernetes cluster.
- Delete the cluster public static IP address if you reserved one.
- Delete the service accounts.
- Delete the log group.
-
In the terminal window, go to the directory containing the infrastructure plan.
Warning
Make sure the directory has no Terraform manifests with the resources you want to keep. Terraform deletes all resources that were created using the manifests in the current directory.
-
Delete resources:
-
Run this command:
terraform destroy -
Confirm deleting the resources and wait for the operation to complete.
All the resources described in the Terraform manifests will be deleted.
-