AWS Marketplace installation

Buoyant Enterprise for Linkerd may be installed via AWS Marketplace. This guide demonstrates how to do so.

Prerequisites

  • The BUOYANT_LICENSE environment variable set, with functioning BEL CLI
  • An EKS cluster with access to the AWS Marketplace Docker registry: 709825985650.dkr.ecr.us-east-1.amazonaws.com
  • eksctl installed locally
  • An EKS cluster with RegisterUsage permissions:
aws_account_id=$(aws sts get-caller-identity --query "Account" --output text)
# Select cluster_name from `aws eks list-clusters`.
cluster_name=[cluster-name]

# Associate an IAM OIDC (OpenID Connect) provider with the specified EKS cluster
# to enable IAM roles for service accounts.
eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve

# Retrieve the OIDC provider URL for the cluster.
oidc_provider=$(
  aws eks describe-cluster --name $cluster_name \
    --query "cluster.identity.oidc.issuer" --output text |
  sed 's|^https://||'
)

# Create a JSON file defining the IAM trust policy for a role that will be
# assumed by pods in the cluster.
cat <<EOF > pod-trust-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::$aws_account_id:oidc-provider/$oidc_provider"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringLike": {
          "$oidc_provider:sub": "system:serviceaccount:*:*",
          "$oidc_provider:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}
EOF

# Create an IAM role for pods in the cluster using the trust policy file.
aws iam create-role \
  --role-name eksPodRole-$cluster_name \
  --assume-role-policy-document file://"pod-trust-policy.json"

# Attach the AWS-managed policy for metering usage to the newly created IAM
# role.
aws iam attach-role-policy \
  --policy-arn arn:aws:iam::aws:policy/AWSMarketplaceMeteringRegisterUsage \
  --role-name eksPodRole-$cluster_name

# Annotate every ServiceAccount in the cluster with the ARN of the IAM role.
kubectl get serviceaccount --all-namespaces --output=jsonpath='{range .items[*]}{.metadata.namespace} {.metadata.name}{"\n"}{end}' |
while read -r namespace name; do
  kubectl annotate --namespace $namespace serviceaccount $name \
    eks.amazonaws.com/role-arn=arn:aws:iam::$aws_account_id:role/eksPodRole-$cluster_name --overwrite
done

Install BEL via AWS Marketplace

curl https://enterprise.buoyant.io/install | sh

linkerd install --crds | kubectl apply -f -
linkerd install \
  --set controllerImage=709825985650.dkr.ecr.us-east-1.amazonaws.com/buoyant-enterprise-for-linkerd/controller \
  --set policyController.image.name=709825985650.dkr.ecr.us-east-1.amazonaws.com/buoyant-enterprise-for-linkerd/policy-controller \
  --set proxy.image.name=709825985650.dkr.ecr.us-east-1.amazonaws.com/buoyant-enterprise-for-linkerd/proxy \
  --set proxyInit.image.name=709825985650.dkr.ecr.us-east-1.amazonaws.com/buoyant-enterprise-for-linkerd/proxy-init |
  kubectl apply -f -
helm repo add linkerd-buoyant https://helm.buoyant.cloud
helm repo update

helm install linkerd-crds \
  --create-namespace \
  --namespace linkerd \
  linkerd-buoyant/linkerd-enterprise-crds

helm install linkerd-control-plane \
  --namespace linkerd \
  --set license=$BUOYANT_LICENSE \
  --set-file identityTrustAnchorsPEM=ca.crt \
  --set-file identity.issuer.tls.crtPEM=issuer.crt \
  --set-file identity.issuer.tls.keyPEM=issuer.key \
  --set controllerImage=709825985650.dkr.ecr.us-east-1.amazonaws.com/buoyant-enterprise-for-linkerd/controller \
  --set policyController.image.name=709825985650.dkr.ecr.us-east-1.amazonaws.com/buoyant-enterprise-for-linkerd/policy-controller \
  --set proxy.image.name=709825985650.dkr.ecr.us-east-1.amazonaws.com/buoyant-enterprise-for-linkerd/proxy \
  --set proxyInit.image.name=709825985650.dkr.ecr.us-east-1.amazonaws.com/buoyant-enterprise-for-linkerd/proxy-init \
  linkerd-buoyant/linkerd-enterprise-control-plane

Post-install

Every service account on the cluster must be annotated with the eksPodRole. After installing BEL, run this command to ensure that the BEL service accounts are annotated. Furthermore, this command must be run whenever a new ServiceAccount is introduced to the cluster.

kubectl get serviceaccount --all-namespaces --output=jsonpath='{range .items[*]}{.metadata.namespace} {.metadata.name}{"\n"}{end}' |
while read -r namespace name; do
  kubectl annotate --namespace $namespace serviceaccount $name \
    eks.amazonaws.com/role-arn=arn:aws:iam::$aws_account_id:role/eksPodRole-$cluster_name --overwrite
done