Menginstall cluster EKS.
Disini kita akan menginstall private cluster di EKS, dengan versi kubernetes 1.26 pada region singapore (ap-southeast-1). Cara installnya menggunakan AWS CLI (terminal) dari lokal komputer. Saya menggunakan OS ubuntu. Jika kalian menggunakan windows, harusnya sama saja langkahnya.
Private cluster, artinya cluster hanya bisa diakses dari dalam VPC saja, tidak bisa diakses dari luar. Jadi setelah nanti berhasil install clusternya dari lokal komputer, kita tidak bisa langsung connect ke clusternya dari lokal komputer (menggunakan kubectl). Kita harus gunakan instance EC2 yang berada dalam subnet yang sama dengan clusternya untuk bisa connect. Seperti gambar dibawah:
Pertanyaannya, kenapa harus private cluster?
Karena lebih aman, private cluster hanya bisa diakses dari dalam VPC saja, tidak terekspos secara langsung ke internet.
Prerequisites
- Ubuntu 22.04 (lokal komputer)
- AWS CLI 2.8.9
—
Berikut ringkasan langkah-langkah untuk menginstall EKS di AWS:
- Buat roles, policy dan user untuk service EKS
- Setup user di AWS CLI
- Buat cluster EKS melalui AWS CLI
- Buat node group
- Test akses ke cluster EKS
Let’s get started …
Buat roles, policy dan user AWS untuk service EKS
Kita akan buat di role, policy (customer managed policy) dan user di IAM (Identify and Access Management.
Stepnya sebagai berikut:
Buat roles
- Masuk ke dashboard IAM
- Pada menu sebelah kiri > Access Management, klik Role
- Klik tombol Create Role
- Pada halaman selanjutnya isi
- Trusted entity type: AWS service
- Use case: EC2
- Klik Next
- Cari policy name: AmazonEKSClusterPolicy, centang policynya, klik next
*AmazonEKSClusterPolicy merupakan AWS managed policy (policy yang sudah disediakan oleh AWS, kita tinggal pakai saja), klik Next
- Halaman berikutnya, masukkan
- Role name: eksClusterRole
- Klik Create role
- Role berhasil dibuat
Buat policy (customer managed policy)
Kita perlu buat policy sendiri (custom, istilahnya customer managed policy). Kemudian roles yang sebelumnya sudah kita buat (eksClusterRole) harus dikaitkan ke policy ini.
Cara buat policy sendiri:
- Pada menu sebelah kiri dashboard IAM > Access Management, klik Policy
- Klik Create Policy
- Masukkan policy dalam bentuk JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:*",
"iam:PassRole",
"iam:GetRole"
],
"Resource": [
"arn:aws:eks:ap-southeast-1:1xxxxxxxxxx:*/*",
"arn:aws:iam::1xxxxxxxxxx:role/eksClusterRole"
]
}
]
}
- Ganti 1xxxxxxxxxx dengan AWS Account ID kalian, dan eksClusterRole merupakan role yang tadi kita buat, dikaitkan ke policy ini
- Klik Next
- Pada halaman berikutnya isi
- Policy name: EKSByCLIPolicy01
- Klik Create Policy
- Customer managed policies berhasil dibuat
Buat user
User ini nantinya bertindak sebagai admin dan bisa mengakses EKS melalui AWS console (website AWS) untuk memanage cluster (tambah node, melihat service kubernetes, logs, scaling node, dll).
Langkah membuat user:
- Pada menu sebelah kiri dashboard IAM > Access Management, klik Users
- Pada sebelah kanan klik Create user
- Muncul halaman create user
- Masukann username: admin-eks
- Centang: Provide user access to the AWS Management Console – optional. Ini nanti digunakan agar user bisa login ke website AWS.
- Klik Next
- Pilih Attach policies directy pada Permission options
- Cari EKSByCLIPolicy01 dan centang policynya
- Klik Next
- Pada halaman selanjutnya klik Create User. Download dan simpan credential usernya (jangan sampai lupa). Credential ini nanti digunakan untuk login ke AWS Console.
- Klik Return to users list
- User berhasil dibuat
- Selanjutnya kita buat credential AWS CLI untuk user tersebut
- Klik usernamenya, akan masuk ke detail user
- Klik tab Security Credentials
- Pada Access Keys klik Create Access Key
- Akan dibawa kehalaman baru, pilih
- Use case: Command Line Interface (CLI)
- Centang I understand the above recommendation and want to proceed to create an access key.
- Klik Next
- Masukkan deskripsi: admin-eks CLI, klik Create access key
- Setelah itu akan terbuat credential CLI nya. Download dan simpan (jangan sampai lupa). Nanti akan digunakan untuk login AWS CLI
- Klik Done
Setup user di AWS CLI
User yang sudah kita buat tadi (admin-eks) akan kita setup di AWS CLI. Pastikan kalian sudah menginstall AWS CLI di laptop kalian, jika belum bisa lihat video saya di youtube https://www.youtube.com/watch?v=LAdsqc_6BMc
Step men-setup user di AWS CLI:
- Buka terminal Ubuntu
- Buat profile user di AWS CLI
aws configure --profile admin-eks
>enter access key
>enter secret key
>region code
*Masukkan profile sesuai dengan nama usernya (admin-eks), lalu sesuaikan access key, secret key dan region dengan file yang sudah didownload tadi
- Kemudian kita test apakah AWS CLI sudah bisa mengakses resource AWS (service EKS). Disini saya akan coba melihat daftar cluster EKS yang sudah terbuat
aws eks list-clusters --profile admin-eks
Disini tampil 2 cluster EKS, karena saya sudah buat 2 sebelumnya. Seharusnya outputnya kosong jika kalian belum punya cluster.
Selanjutnya kita akan buat private cluster EKS melalui AWS CLI
Buat cluster EKS melalui AWS CLI
Jalankan command berikut untuk membuat cluster:
aws eks create-cluster --region ap-southeast-1 --name eks-cluster-test --kubernetes-version 1.26 --role-arn arn:aws:iam::1xxxxxxxxxx:role/eksClusterRole --resources-vpc-config subnetIds=subnet-1xxx,subnet-bxxx,subnet-9xxx,endpointPublicAccess=false,endpointPrivateAccess=true --profile admin-eks
Penjelasan:
eks
, kita menggunakan service EKScreate-cluster
, command untuk membuat cluster--region ap-southeast-1
, buat cluster EKS di region singapore (region code: ap-southeast-1)--name eks-cluster-test
, nama cluster EKSnya--kubernetes-version 1.26
, versi kubernetesnya 1.26--role-arn arn:aws:iam::1xxxxxxxxxx:role/eksClusterRole
, role yang sudah kita buat diatas tadi. Harap ganti1xxxxxxxxxx
dengan AWS Account ID kalian--resources-vpc-config subnetIds=subnet-1xxx,subnet-bxxx,subnet-9xxx
, clusternya mencakup subnet mana saja. Kalian perlu sesuaikan subnetnyaendpointPublicAccess=false
, cluster EKS tidak bisa diakses dari internetendpointPrivateAccess=true
, kubernetes API Endpoint tidak bisa diakses dari internet (command kubectl tidak bisa diakses)--profile admin-eks
, AWS CLI menggunakan profile admin-eks
Setelah menjalankan command diatas, kita bisa login ke website AWS menggunakan user admin-eks dengan credentials yang sudah didapatkan tadi dan membuka dashboard EKS. Akan ada 1 cluster yang statusnya Creating.
Proses membuat cluster lumayan lama sekitar 5 menitan. Tunggu saja. Jika sudah selesai statusnya akan Active.
Buat node group
Di EKS menggunakan konsep node group. Jadi node/instance yang kita buat berada dalam node group.
Misal kita ingin mengelompokkan node dengan CPU yang bagus, kita bisa buat node group dengan nama Compute-optimized, begitu juga dengan Memory-optimized.
Cara membuat node group:
- Buat roles dengan nama: AmazonEKSNodeRole
- Kaitkan beberapa policy ke role AmazonEKSNodeRole:
- AmazonEKSWorkerNodePolicy
- AmazonEC2ContainerRegistryReadOnly
- AmazonEKS_CNI_Policy
- Update policy EKSByCLIPolicy01 agar mempunyai akses untuk membuat nodegroup:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:*",
"iam:PassRole",
"iam:GetRole",
"iam:ListAttachedRolePolicies"
],
"Resource": [
"arn:aws:eks:ap-southeast-1:1xxxxxxxxxx:*/*",
"arn:aws:iam::1xxxxxxxxxx:role/eksClusterRole",
"arn:aws:iam::1xxxxxxxxxx:role/AmazonEKSNodeRole",
"arn:aws:iam::1xxxxxxxxxx:role/aws-service-role/eks-nodegroup.amazonaws.com/AWSServiceRoleForAmazonEKSNodegroup"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:*"
],
"Resource": "*"
}
]
}
*Ganti 1xxxxxxxxxx dengan AWS Account ID kalian. AWSServiceRoleForAmazonEKSNodegroup merupakan Amazon Managed Policy yang sudah disediakan oleh AWS, kita tinggal pakai saja.
- Pastikan fitur auto-assigning IPv4 sudah aktif pada subnet cluster (Enable auto-assign public IPv4 address). Jika belum silahkan aktifkan di dashboard VPC.
Step ini wajib, karena kalau fitur ini belum aktif akan menyebabkan error pada saat pembuatan node group EKS (Error: One or more Amazon EC2 Subnets of [subnet-0x, subnet-04x, subnet-07x] for node group default does not automatically assign public IP addresses to instances launched into it.)
- Jalankan command berikut untuk membuat node group:
aws eks create-nodegroup --cluster-name eks-cluster-test --nodegroup-name compute-optimized --node-role arn:aws:iam::1xxxxxxxxxx:role/AmazonEKSNodeRole --scaling-config minSize=2,maxSize=3,desiredSize=2 --ami-type AL2_x86_64 --capacity-type ON_DEMAND --instance-types c5n.large --disk-size 20 --subnets subnet-1xxx subnet-bxxx subnet-9xxx --profile admin-eks
- Penjelasan:
eks
, service EKScreate-nodegroup
, command untuk membuat node group--cluster-name eks-cluster-test
, cluster mana yang ingin ditambahkan node group--nodegroup-name compute-optimized
, nama node groupnyaarn:aws:iam::1xxxxxxxxxx:role/AmazonEKSNodeRole
, node yang dibuat nanti akan menggunakan role ini. Harap ganti1xxxxxxxxxx
dengan AWS Account ID kalian--scaling-config minSize=2,maxSize=3,desiredSize=2
, pengaturan scaling nodenya, minSize=2 artinya minimal ada 2 node dalam node group, maxSize=3 artinya maksimal ada 3 node dalam node group, desiredSize=2 artinya ada 2 node yang dibuat ketika pertama kali launch--ami-type AL2_x86_64
, Tipe Amazon Machine Image yang digunakan--capacity-type ON_DEMAND
, tipe capacitynya on demand (pay as you go)--instance-types c5n.large
, tipe instance yang ingin digunakan--disk-size 20
, total size disk untuk masing-masing node/instance-subnets subnet-1xxx subnet-bxxx subnet-9xxx
, node akan berada pada subnet ini--profile admin-eks
, AWS CLI menggunakan profile admin-eks
- Sekarang kita bisa cek di dashboard EC2, akan ada 2 instance baru dengan tipe c5n.large
- Jika kita cek di dashboard EKS menggunakan user admin-eks, akan terdapat 2 node/instance EC2 dan node group dengan nama compute-optimized
Bagus, Cluster EKS sudah siap untuk digunakan.
Test akses ke cluster EKS
Langkah terakhir adalah pengetesan. Kita akan test connect ke cluster dari 2 tempat yaitu lokal komputer dan instance EC2 yang berada di subnet yang sama dengan cluster.
Akes cluster dari lokal komputer? tidak bisa!
Seperti yang sudah dijelaskan diawal, cluster ini tidak bisa diakses dari lokal komputer menggunakan command kubectl
. Tapi hanya bisa diakses dari dalam subnet yang sama. Namun jika kita ingin mengetesnya, maka kita bisa lakukan hal berikut:
Install dulu kubectl di lokal komputer
sudo snap install kubectl --classic
Dapatkan credential kubectl melalui AWS CLI
aws eks --region ap-southeast-1 update-kubeconfig --name eks-cluster-test --profile admin-eks
Credential disimpan di /home/moko/.kube/config
. Sekarang kita tinggal jalankan kubectl. Misal kita ingin melihat list namespacenya maka jalankan command dibawah
kubectl get ns
Hasilnya akan timeout, karena cluster tidak bisa diakses dari lokal komputer.
Akses cluster dari Instance EC2? bisa!
Kita coba akses clusternya dari instance EC2 yang berada pada subnet yang sama dengan clusternya. Jika kalian belum punya instancenya, harap create satu dulu.
Langkah untuk mengakses cluster:
- Install dulu kubectl di instancenya
sudo snap install kubectl --classic
- Generate credential kubernetesnya (pastikan kalian sudah menginstall AWS CLI sebelumnya)
aws eks --region ap-southeast-1 update-kubeconfig --name eks-cluster-test --profile admin-eks
- Kita test cek namespace kubernetes
kubectl get ns
- Jika outputnya: couldn’t get current server API group list: Get …. dial tcp 172.31.xx.xx:443: i/o timeout itu artinya kubectl tidak bisa mengakses port 443 (kubernetes API server)
- Pastikan port 443 pada inbound rule security group pada clusternya sudah ditambahkan, jika belum masuk ke detail clusternya (eks-cluster-test):
- klik tab Networking
- klik nama security group pada Cluster security group (misal: sg-07xxx)
- pilih security groupnya
- pilih tab Inbound rules, klik Edit inbound rules
- tambahkan port 443 dan sourcenya 172.31.0.0/16 (sesuaikan dengan CIDR VPC kalian).
- Klik Save rules
- Coba lagi dapatkan namespace kubernetes:
kubectl get ns
Nice. Sekarang sudah bisa diakses.
Sampai sini artinya clusternya sudah bisa diakses menggunakan kubectl. Kalian bisa coba command lain misal, kubectl get nodes
, kubectl get serviceaccount
, kubectl get svc
.
—
Oke, demikianlah tutorial yang lumayan panjang saya tulis, Menginstall private cluster EKS di cloud AWS. Semoga bermanfaat!