From 9cf6558863751047fbd040d66812f3c2f8b80fd7 Mon Sep 17 00:00:00 2001 From: cristov Date: Tue, 4 Sep 2018 06:53:45 +0900 Subject: [PATCH] script update for EKS optimized AMI --- .../204-cluster-logging-with-EFK/readme.adoc | 2 +- imgs/Samsung-logo.png | Bin 0 -> 29841 bytes .../Samsung_Electronics_logo_(hangul).svg.png | Bin 0 -> 42144 bytes readme.adoc | 10 +- scripts/amazon-eks-nodegroup.yaml | 299 ++++++++++++++++++ scripts/config.sh | 46 +++ scripts/lab-ide-setup.sh | 25 +- 7 files changed, 369 insertions(+), 13 deletions(-) create mode 100644 imgs/Samsung-logo.png create mode 100644 imgs/Samsung_Electronics_logo_(hangul).svg.png create mode 100644 scripts/amazon-eks-nodegroup.yaml create mode 100644 scripts/config.sh diff --git a/Phase2/204-cluster-logging-with-EFK/readme.adoc b/Phase2/204-cluster-logging-with-EFK/readme.adoc index a85f286..a9f0d86 100644 --- a/Phase2/204-cluster-logging-with-EFK/readme.adoc +++ b/Phase2/204-cluster-logging-with-EFK/readme.adoc @@ -14,7 +14,7 @@ In terms of architecture, Fluentd is deployed as a DaemonSet with the CloudWatch == Prerequisites -In order to perform exercises in this chapter, you’ll need to deploy configurations to a Kubernetes cluster. To create an EKS-based Kubernetes cluster, use the link:../../01-path-basics/102-your-first-cluster#create-a-kubernetes-cluster-with-eks[AWS CLI] (recommended). If you wish to create a Kubernetes cluster without EKS, you can instead use link:../../01-path-basics/102-your-first-cluster#alternative-create-a-kubernetes-cluster-with-kops[kops]. +In order to perform exercises in this chapter, you’ll need to deploy configurations to a Kubernetes cluster. To create an EKS-based Kubernetes cluster, like we already taken Phase1 link:../../Phase1/readme.adoc[ ] (recommended). If you wish to create a Kubernetes cluster without EKS, you can instead use link:../../01-path-basics/102-your-first-cluster#alternative-create-a-kubernetes-cluster-with-kops[kops]. All configuration files for this chapter are in the `.204-cluster-logging-with-EFK` directory. Make sure you change to that directory before giving any commands in this chapter. diff --git a/imgs/Samsung-logo.png b/imgs/Samsung-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..36ea51e2f06ebfec8ba47610b3dfffebf62b4d72 GIT binary patch literal 29841 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�>EF&O6|;L)A`gb6hSX50J6 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 IRLMHze{3>h9{>OV literal 0 HcmV?d00001 diff --git a/readme.adoc b/readme.adoc index 5e42594..091111c 100644 --- a/readme.adoc +++ b/readme.adoc @@ -38,12 +38,12 @@ Please choose the region closest to you. If you choose a region for Cloud9 that |Region | Launch template with a new VPC | Launch template with an existing VPC | *N. Virginia* (us-east-1) -a| image:deploy-to-aws.png[link=https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?stackName=k8s-workshop&templateURL=https://s3.amazonaws.com/cf-templates-oy23hu24c01u-us-east-1/lab-ide-vpc.template-instance-seletable] -a| image:deploy-to-aws.png[link=https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?stackName=k8s-workshop&templateURL=https://s3.amazonaws.com/cf-templates-oy23hu24c01u-us-east-1/lab-ide-novpc.template-instance-seletable] +a| image:deploy-to-aws.png[link=https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?stackName=k8s-workshop-virginia&templateURL=https://s3.amazonaws.com/cf-templates-oy23hu24c01u-us-east-1/lab-ide-vpc.template-instance-seletable] +a| image:deploy-to-aws.png[link=https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?stackName=k8s-workshop-virginia&templateURL=https://s3.amazonaws.com/cf-templates-oy23hu24c01u-us-east-1/lab-ide-novpc.template-instance-seletable] | *Oregon* (us-west-2) -a| image:deploy-to-aws.png[link=https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?stackName=k8s-workshop&templateURL=https://s3.amazonaws.com/cf-templates-oy23hu24c01u-us-east-1/lab-ide-vpc.template-instance-seletable] -a| image:deploy-to-aws.png[link=https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?stackName=k8s-workshop&templateURL=https://s3.amazonaws.com/cf-templates-oy23hu24c01u-us-east-1/lab-ide-novpc.template-instance-seletable] +a| image:deploy-to-aws.png[link=https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?stackName=k8s-workshop-oregon&templateURL=https://s3.amazonaws.com/cf-templates-oy23hu24c01u-us-east-1/lab-ide-vpc.template-instance-seletable] +a| image:deploy-to-aws.png[link=https://console.aws.amazon.com/cloudformation/home?region=us-west-2#/stacks/new?stackName=k8s-workshop-oregon&templateURL=https://s3.amazonaws.com/cf-templates-oy23hu24c01u-us-east-1/lab-ide-novpc.template-instance-seletable] |=== @@ -79,7 +79,7 @@ Once your Cloud9 is ready, download the build script and install in your IDE. Th To install the script, run this command in the "bash" terminal tab of the Cloud9 IDE: - aws s3 cp s3://yjeong-virg/techsummit-scripts/lab-ide-setup.sh . && \ + curl -o https://raw.githubusercontent.com/cristov/aws-techsummit2018-kubernetes-workshop/master/scripts/lab-ide-setup.sh chmod +x lab-ide-setup.sh && \ . ./lab-ide-setup.sh diff --git a/scripts/amazon-eks-nodegroup.yaml b/scripts/amazon-eks-nodegroup.yaml new file mode 100644 index 0000000..97feacf --- /dev/null +++ b/scripts/amazon-eks-nodegroup.yaml @@ -0,0 +1,299 @@ +--- +AWSTemplateFormatVersion: '2010-09-09' +Description: 'Amazon EKS - Node Group - Released 2018-08-30' + +Parameters: + + KeyName: + Description: The EC2 Key Pair to allow SSH access to the instances + Type: AWS::EC2::KeyPair::KeyName + + NodeImageId: + Type: AWS::EC2::Image::Id + Description: AMI id for the node instances. + + NodeInstanceType: + Description: EC2 instance type for the node instances + Type: String + Default: t2.medium + AllowedValues: + - t2.small + - t2.medium + - t2.large + - t2.xlarge + - t2.2xlarge + - m3.medium + - m3.large + - m3.xlarge + - m3.2xlarge + - m4.large + - m4.xlarge + - m4.2xlarge + - m4.4xlarge + - m4.10xlarge + - m5.large + - m5.xlarge + - m5.2xlarge + - m5.4xlarge + - m5.12xlarge + - m5.24xlarge + - c4.large + - c4.xlarge + - c4.2xlarge + - c4.4xlarge + - c4.8xlarge + - c5.large + - c5.xlarge + - c5.2xlarge + - c5.4xlarge + - c5.9xlarge + - c5.18xlarge + - i3.large + - i3.xlarge + - i3.2xlarge + - i3.4xlarge + - i3.8xlarge + - i3.16xlarge + - r3.xlarge + - r3.2xlarge + - r3.4xlarge + - r3.8xlarge + - r4.large + - r4.xlarge + - r4.2xlarge + - r4.4xlarge + - r4.8xlarge + - r4.16xlarge + - x1.16xlarge + - x1.32xlarge + - p2.xlarge + - p2.8xlarge + - p2.16xlarge + - p3.2xlarge + - p3.8xlarge + - p3.16xlarge + ConstraintDescription: Must be a valid EC2 instance type + + NodeAutoScalingGroupMinSize: + Type: Number + Description: Minimum size of Node Group ASG. + Default: 1 + + NodeAutoScalingGroupMaxSize: + Type: Number + Description: Maximum size of Node Group ASG. + Default: 3 + + NodeVolumeSize: + Type: Number + Description: Node volume size + Default: 20 + + ClusterName: + Description: The cluster name provided when the cluster was created. If it is incorrect, nodes will not be able to join the cluster. + Type: String + + BootstrapArguments: + Description: Arguments to pass to the bootstrap script. See files/bootstrap.sh in https://github.com/awslabs/amazon-eks-ami + Default: "" + Type: String + + NodeGroupName: + Description: Unique identifier for the Node Group. + Type: String + + ClusterControlPlaneSecurityGroup: + Description: The security group of the cluster control plane. + Type: AWS::EC2::SecurityGroup::Id + + VpcId: + Description: The VPC of the worker instances + Type: AWS::EC2::VPC::Id + + Subnets: + Description: The subnets where workers can be created. + Type: List + +Metadata: + AWS::CloudFormation::Interface: + ParameterGroups: + - + Label: + default: "EKS Cluster" + Parameters: + - ClusterName + - ClusterControlPlaneSecurityGroup + - + Label: + default: "Worker Node Configuration" + Parameters: + - NodeGroupName + - NodeAutoScalingGroupMinSize + - NodeAutoScalingGroupMaxSize + - NodeInstanceType + - NodeImageId + - NodeVolumeSize + - KeyName + - BootstrapArguments + - + Label: + default: "Worker Network Configuration" + Parameters: + - VpcId + - Subnets + +Resources: + + NodeInstanceProfile: + Type: AWS::IAM::InstanceProfile + Properties: + Path: "/" + Roles: + - !Ref NodeInstanceRole + + NodeInstanceRole: + Type: AWS::IAM::Role + Properties: + AssumeRolePolicyDocument: + Version: '2012-10-17' + Statement: + - Effect: Allow + Principal: + Service: + - ec2.amazonaws.com + Action: + - sts:AssumeRole + Path: "/" + ManagedPolicyArns: + - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy + - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy + - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly + + NodeSecurityGroup: + Type: AWS::EC2::SecurityGroup + Properties: + GroupDescription: Security group for all nodes in the cluster + VpcId: + !Ref VpcId + Tags: + - Key: !Sub "kubernetes.io/cluster/${ClusterName}" + Value: 'owned' + + NodeSecurityGroupIngress: + Type: AWS::EC2::SecurityGroupIngress + DependsOn: NodeSecurityGroup + Properties: + Description: Allow node to communicate with each other + GroupId: !Ref NodeSecurityGroup + SourceSecurityGroupId: !Ref NodeSecurityGroup + IpProtocol: '-1' + FromPort: 0 + ToPort: 65535 + + NodeSecurityGroupFromControlPlaneIngress: + Type: AWS::EC2::SecurityGroupIngress + DependsOn: NodeSecurityGroup + Properties: + Description: Allow worker Kubelets and pods to receive communication from the cluster control plane + GroupId: !Ref NodeSecurityGroup + SourceSecurityGroupId: !Ref ClusterControlPlaneSecurityGroup + IpProtocol: tcp + FromPort: 1025 + ToPort: 65535 + + ControlPlaneEgressToNodeSecurityGroup: + Type: AWS::EC2::SecurityGroupEgress + DependsOn: NodeSecurityGroup + Properties: + Description: Allow the cluster control plane to communicate with worker Kubelet and pods + GroupId: !Ref ClusterControlPlaneSecurityGroup + DestinationSecurityGroupId: !Ref NodeSecurityGroup + IpProtocol: tcp + FromPort: 1025 + ToPort: 65535 + + NodeSecurityGroupFromControlPlaneOn443Ingress: + Type: AWS::EC2::SecurityGroupIngress + DependsOn: NodeSecurityGroup + Properties: + Description: Allow pods running extension API servers on port 443 to receive communication from cluster control plane + GroupId: !Ref NodeSecurityGroup + SourceSecurityGroupId: !Ref ClusterControlPlaneSecurityGroup + IpProtocol: tcp + FromPort: 443 + ToPort: 443 + + ControlPlaneEgressToNodeSecurityGroupOn443: + Type: AWS::EC2::SecurityGroupEgress + DependsOn: NodeSecurityGroup + Properties: + Description: Allow the cluster control plane to communicate with pods running extension API servers on port 443 + GroupId: !Ref ClusterControlPlaneSecurityGroup + DestinationSecurityGroupId: !Ref NodeSecurityGroup + IpProtocol: tcp + FromPort: 443 + ToPort: 443 + + ClusterControlPlaneSecurityGroupIngress: + Type: AWS::EC2::SecurityGroupIngress + DependsOn: NodeSecurityGroup + Properties: + Description: Allow pods to communicate with the cluster API Server + GroupId: !Ref ClusterControlPlaneSecurityGroup + SourceSecurityGroupId: !Ref NodeSecurityGroup + IpProtocol: tcp + ToPort: 443 + FromPort: 443 + + NodeGroup: + Type: AWS::AutoScaling::AutoScalingGroup + Properties: + DesiredCapacity: !Ref NodeAutoScalingGroupMaxSize + LaunchConfigurationName: !Ref NodeLaunchConfig + MinSize: !Ref NodeAutoScalingGroupMinSize + MaxSize: !Ref NodeAutoScalingGroupMaxSize + VPCZoneIdentifier: + !Ref Subnets + Tags: + - Key: Name + Value: !Sub "${ClusterName}-${NodeGroupName}-Node" + PropagateAtLaunch: 'true' + - Key: !Sub 'kubernetes.io/cluster/${ClusterName}' + Value: 'owned' + PropagateAtLaunch: 'true' + UpdatePolicy: + AutoScalingRollingUpdate: + MinInstancesInService: '1' + MaxBatchSize: '1' + + NodeLaunchConfig: + Type: AWS::AutoScaling::LaunchConfiguration + Properties: + AssociatePublicIpAddress: 'true' + IamInstanceProfile: !Ref NodeInstanceProfile + ImageId: !Ref NodeImageId + InstanceType: !Ref NodeInstanceType + KeyName: !Ref KeyName + SecurityGroups: + - !Ref NodeSecurityGroup + BlockDeviceMappings: + - DeviceName: /dev/xvda + Ebs: + VolumeSize: !Ref NodeVolumeSize + VolumeType: gp2 + DeleteOnTermination: true + UserData: + Fn::Base64: + !Sub | + #!/bin/bash + set -o xtrace + /etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments} + /opt/aws/bin/cfn-signal --exit-code $? \ + --stack ${AWS::StackName} \ + --resource NodeGroup \ + --region ${AWS::Region} + +Outputs: + NodeInstanceRole: + Description: The node instance role + Value: !GetAtt NodeInstanceRole.Arn diff --git a/scripts/config.sh b/scripts/config.sh new file mode 100644 index 0000000..440f8b0 --- /dev/null +++ b/scripts/config.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Configure AWS CLI +#availability_zone=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone) +#export AWS_DEFAULT_REGION=${availability_zone%?} + +# Lab-specific configuration +export AWS_AVAILABILITY_ZONES="$(aws ec2 describe-availability-zones --query 'AvailabilityZones[].ZoneName' --output text | awk -v OFS="," '$1=$1')" +export AWS_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) +aws ec2 describe-instances --instance-ids $AWS_INSTANCE_ID > /tmp/instance.json +export AWS_STACK_NAME=$(jq -r '.Reservations[0].Instances[0]|(.Tags[]|select(.Key=="aws:cloudformation:stack-name")|.Value)' /tmp/instance.json) +export AWS_ENVIRONMENT=$(jq -r '.Reservations[0].Instances[0]|(.Tags[]|select(.Key=="aws:cloud9:environment")|.Value)' /tmp/instance.json) +export AWS_MASTER_STACK=${AWS_STACK_NAME%$AWS_ENVIRONMENT} +export AWS_MASTER_STACK=${AWS_MASTER_STACK%?} +export AWS_MASTER_STACK=${AWS_MASTER_STACK#aws-cloud9-} +export KOPS_STATE_STORE=s3://$(aws cloudformation describe-stack-resource --stack-name $AWS_MASTER_STACK --logical-resource-id "KopsStateStore" | jq -r '.StackResourceDetail.PhysicalResourceId') + +# EKS-specific variables from CloudFormation +export EKS_VPC_ID=$(aws cloudformation describe-stacks --stack-name $AWS_MASTER_STACK | jq -r '.Stacks[0].Outputs[]|select(.OutputKey=="EksVpcId")|.OutputValue') +export EKS_SUBNET_IDS=$(aws cloudformation describe-stacks --stack-name $AWS_MASTER_STACK | jq -r '.Stacks[0].Outputs[]|select(.OutputKey=="EksVpcSubnetIds")|.OutputValue') +export EKS_SECURITY_GROUPS=$(aws cloudformation describe-stacks --stack-name $AWS_MASTER_STACK | jq -r '.Stacks[0].Outputs[]|select(.OutputKey=="EksVpcSecurityGroups")|.OutputValue') +export EKS_SERVICE_ROLE=$(aws cloudformation describe-stacks --stack-name $AWS_MASTER_STACK | jq -r '.Stacks[0].Outputs[]|select(.OutputKey=="EksServiceRoleArn")|.OutputValue') + +# Persist lab variables +echo "AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION" >> ~/.bashrc +echo "AWS_AVAILABILITY_ZONES=$AWS_AVAILABILITY_ZONES" >> ~/.bashrc +echo "AWS_STACK_NAME=$AWS_STACK_NAME" >> ~/.bashrc +echo "AWS_MASTER_STACK=$AWS_MASTER_STACK" >> ~/.bashrc +echo "KOPS_STATE_STORE=$KOPS_STATE_STORE" >> ~/.bashrc + +# Persist EKS variables +echo "EKS_VPC_ID=$EKS_VPC_ID" >> ~/.bashrc +echo "EKS_SUBNET_IDS=$EKS_SUBNET_IDS" >> ~/.bashrc +echo "EKS_SECURITY_GROUPS=$EKS_SECURITY_GROUPS" >> ~/.bashrc +echo "EKS_SERVICE_ROLE=$EKS_SERVICE_ROLE" >> ~/.bashrc + +# EKS-Optimized AMI +if [ "$AWS_DEFAULT_REGION" == "us-east-1" ]; then + export EKS_WORKER_AMI=ami-08cab282f9979fc7a +elif [ "$AWS_DEFAULT_REGION" == "us-west-2" ]; then + export EKS_WORKER_AMI=ami-0b2ae3c6bda8b5c06 +fi +echo "EKS_WORKER_AMI=$EKS_WORKER_AMI" >> ~/.bashrc + +# Create EC2 Keypair +aws ec2 create-key-pair --key-name ${AWS_STACK_NAME} --query 'KeyMaterial' --output text > $HOME/.ssh/k8s-workshop.pem +chmod 0400 $HOME/.ssh/k8s-workshop.pem diff --git a/scripts/lab-ide-setup.sh b/scripts/lab-ide-setup.sh index 31dde9d..04ab806 100644 --- a/scripts/lab-ide-setup.sh +++ b/scripts/lab-ide-setup.sh @@ -19,13 +19,22 @@ sudo -H pip install -U awscli sudo yum install bash-completion -y # Install kubectl -curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/linux/amd64/kubectl -chmod +x kubectl && sudo mv kubectl /usr/local/bin/ +cat < ./kubernetes.repo +[kubernetes] +name=Kubernetes +baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 +enabled=1 +gpgcheck=1 +repo_gpgcheck=1 +gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg +EOF +sudo mv ./kubernetes.repo /etc/yum.repos.d +sudo yum install -y kubectl echo "source <(kubectl completion bash)" >> ~/.bashrc # Install Heptio Authenticator -curl -o heptio-authenticator-aws https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/linux/amd64/heptio-authenticator-aws -chmod +x ./heptio-authenticator-aws && sudo mv heptio-authenticator-aws /usr/local/bin/ +go get -u -v github.com/kubernetes-sigs/aws-iam-authenticator/cmd/aws-iam-authenticator +sudo mv ./go/bin/aws-iam-authenticator /usr/local/bin/ # Install kops curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64 @@ -68,9 +77,11 @@ echo "EKS_SERVICE_ROLE=$EKS_SERVICE_ROLE" >> ~/.bashrc # EKS-Optimized AMI if [ "$AWS_DEFAULT_REGION" == "us-east-1" ]; then - export EKS_WORKER_AMI=ami-dea4d5a1 +# export EKS_WORKER_AMI=ami-dea4d5a1 + export EKS_WORKER_AMI=ami-0b2ae3c6bda8b5c06 elif [ "$AWS_DEFAULT_REGION" == "us-west-2" ]; then - export EKS_WORKER_AMI=ami-73a6e20b +# export EKS_WORKER_AMI=ami-73a6e20b + export EKS_WORKER_AMI=ami-08cab282f9979fc7a fi echo "EKS_WORKER_AMI=$EKS_WORKER_AMI" >> ~/.bashrc @@ -84,4 +95,4 @@ chmod 0400 $HOME/.ssh/k8s-workshop.pem if [ ! -d "scripts" ]; then # Download scripts svn export https://github.com/cristov/aws-techsummit2018-kubernetes-workshop.git/scripts -fi \ No newline at end of file +fi