Skip to content

doitintl/eks-lens-agent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

8073816 · Sep 5, 2023

History

41 Commits
May 10, 2023
Sep 5, 2023
May 21, 2023
Sep 5, 2023
May 18, 2023
May 14, 2023
Mar 7, 2023
Mar 19, 2023
May 10, 2023
Mar 7, 2023
May 11, 2023
May 15, 2023
Sep 5, 2023
Sep 5, 2023

Repository files navigation

docker Go Report Card GitHub all releases

EKS Lens Agent

The eks-lens-agent is a Kubernetes controller that watches for workload and infrastructure change events and sends them to the S3 bucket though Amazon Kinesis Data Firehose.

Deployment

Set the following environment variables:

  • AWS_REGION - AWS region where the Kinesis Data Firehose Delivery Stream is located
  • AWS_ACCOUNT - AWS account ID where the Kinesis Data Firehose Delivery Stream is located

Setup AWS Account

Export AWS account ID:

export AWS_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)

Create S3 bucket for storing events:

aws s3api create-bucket \
    --bucket eks-lens \
    --create-bucket-configuration LocationConstraint=${AWS_REGION}

Create the IAM role that grants Kinesis Data Firehose permission to put data into the bucket.

aws iam create-role \
        --role-name eks-lens-agent \
        --assume-role-policy-document file://./schema/iam-role-trust-policy.json

Keep the IAM role ARN for later use.

export FIREHOSE_ROLE_ARN=arn:aws:iam::$AWS_ACCOUNT:role/eks-lens-firehose

Create Amazon Glue database for storing events:

aws glue create-database \
    --database-input "Name=eks-lens, Description=eks-lens, LocationUri=s3://eks-lens/events/, Parameters={}" \
    --region ${AWS_REGION}

Create Amazon Glue schema for storing events:

 aws glue create-schema \
    --schema-name eks-lens \
    --data-format 'AVRO' \
    --compatibility 'BACKWARD' \
    --schema-definition 'file://./schema/schema.json'

Create Amazon Glue table for storing events:

aws glue create-table \
    --database-name eks-lens \
    --table-input "file://./schema/table.json"

Keep the Amazon Glue table ARN for later use: arn:aws:glue:$AWS_REGION:123456789012:table/eks-lens/events

export GLUE_TABLE_ARN=arn:aws:glue:$AWS_REGION:$AWS_ACCOUNT:table/eks-lens/events

Create Kinesis Data Firehose Delivery Stream with S3 destination and automatic conversion to Parquet format:

aws firehose create-delivery-stream \
    --delivery-stream-name eks-lens \
    --extended-s3-destination-configuration \
        "RoleARN=$FIREHOSE_ROLE_ARN, \
        BucketARN=arn:aws:s3:::eks-lens, \
        BufferingHints={SizeInMBs=128, IntervalInSeconds=60}, \
        CompressionFormat=UNCOMPRESSED, \
        Prefix=events/, \
        ErrorOutputPrefix=errors/, \
        S3BackupMode=Disabled, \
        CloudWatchLoggingOptions={ \
          Enabled=true, \
          LogGroupName=/aws/kinesisfirehose/eks-lens, \
          LogStreamName=DeliveryStream \
        }, \
        ProcessingConfiguration={Enabled=false}, \
        DataFormatConversionConfiguration={ \
            Enabled=true, \
            InputFormatConfiguration={ \
                Deserializer={ \
                    OpenXJsonSerDe={ \
                        ConvertDotsInJsonKeysToUnderscores=false \
                    } \
                } \
            }, \
            OutputFormatConfiguration={ \
                Serializer={ \
                    ParquetSerDe={} \
                } \
            }, \
            SchemaConfiguration={ \
                RoleARN=$FIREHOSE_ROLE_ARN, \
                DatabaseName=eks-lens, \
                TableName=events, \
                Region=$AWS_REGION, \
                VersionId=LATEST \
            } \
        }" \
    --region $AWS_REGION

Keep the Kinesis Data Firehose Delivery Stream ARN for later use.

export FIREHOSE_ARN=arn:aws:firehose:$AWS_REGION:$AWS_ACCOUNT:deliverystream/eks-lens

Create IAM Policy document that will be used by the eks-lens-agent to push events to Kinesis Data Firehose:

cat <<EOF > schema/iam-role-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "FirehoseAccess",
            "Effect": "Allow",
            "Action": [
                "firehose:DeleteDeliveryStream",
                "firehose:PutRecord",
                "firehose:PutRecordBatch",
                "firehose:UpdateDestination"
            ],
            "Resource": "$FIREHOSE_ARN"
        },
        {
            "Sid": "GlueAccess",
            "Effect": "Allow",
             "Action": [
                "glue:GetTable",
                "glue:GetTableVersion",
                "glue:GetTableVersions",
                "glue:GetSchema",
				"glue:GetSchemaVersion"
            ],
            "Resource": [
              "arn:aws:glue:$AWS_REGION:$AWS_ACCOUNT:database/eks-lens",
              "arn:aws:glue:$AWS_REGION:$AWS_ACCOUNT:catalog",
              "arn:aws:glue:$AWS_REGION:$AWS_ACCOUNT:table/eks-lens/events",
              "arn:aws:glue:$AWS_REGION:$AWS_ACCOUNT:schema/default-registry/eks-lens"
            ]
        },
        {
            "Sid": "S3Access",
            "Effect": "Allow",      
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:PutObject"
            ],      
            "Resource": [        
                "arn:aws:s3:::eks-lens",
                "arn:aws:s3:::eks-lens/*"		    
            ]
        }
    ]
} 
EOF

Create IAM Policy that will be used by the eks-lens-agent to push events to Kinesis Data Firehose:

aws iam create-policy \
    --policy-name eks-lens-agent \
    --policy-document file://./schema/iam-role-policy.json

Create IAM role that will be used by the eks-lens-agent to push events to Kinesis Data Firehose:

aws iam attach-role-policy \
    --role-name eks-lens-agent \
    --policy-arn arn:aws:iam::$AWS_ACCOUNT:policy/eks-lens-agent

Configure ServiceAccount

Create a new ServiceAccount, ClusterRole and ClusterRoleBinding:

kubectl apply -f deploy/rbac.yaml

Annotate the ServiceAccount with the IAM role ARN:

kubectl annotate serviceaccount eks-lens-agent eks.amazonaws.com/role-arn=arn:aws:iam::$AWS_ACCOUNT:role/eks-lens-agent --namespace eks-lens

Deploy eks-lens-agent

Deploy the eks-lens-agent to the cluster:

kubectl apply -f deploy/deployment.yaml

How to build

Run the following command to build the eks-lens-agent binary:

make

Build Docker image

Use Docker buildx plugin to build multi-architecture Docker image.

docker buildx build --platform=linux/arm64,linux/amd64 -t eks-lens-agent -f Dockerfile .

CI/CD

GitHub Actions are used for CI/CD. The following workflows are defined:

  • docker - builds and pushes Docker image to GitHub Container Registry
  • release - creates a new GitHub release with changelog and binaries
  • test - runs linters and unit tests

Required GitHub secrets

Please specify the following GitHub secret:

  • GITHUB_TOKEN - GitHub Personal Access Token (with write/read packages permission)