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
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.
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
--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 ganti 1xxxxxxxxxx dengan AWS Account ID kalian
--resources-vpc-config subnetIds=subnet-1xxx,subnet-bxxx,subnet-9xxx, clusternya mencakup subnet mana saja. Kalian perlu sesuaikan subnetnya
endpointPublicAccess=false, cluster EKS tidak bisa diakses dari internet
endpointPrivateAccess=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.
Jika ada error seperti ini, kita belum pernah membuat service-linked-role EKS sama sekali di akun AWS
aws: [ERROR]: An error occurred (InvalidParameterException) when calling the CreateCluster operation: EKS Cluster Service-Linked Role could not be created with cluster role arn:aws:iam::1xx:role/eksClusterRole or cluster creator identity. Ensure caller has permission to perform iam:CreateServiceLinkedRole action
Solusinya, buat IAM service-linked-role untuk eks.
IAM dashboard > Access Management > Role > Create role > Trusted entity type: AWS service > Usercase: EKS > Next > Next > Create role
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
Create role > Trusted entity type: AWS Service, Use case: EC2 > Next > Next > Policy name: AmazonEKSNodeRole > Create role
Kaitkan beberapa policy ke role AmazonEKSNodeRole:
AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy
Update policy EKSByCLIPolicy01 agar mempunyai akses untuk membuat nodegroup:
*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:
create-nodegroup, command untuk membuat node group
--cluster-name eks-cluster-test, cluster mana yang ingin ditambahkan node group
--nodegroup-name compute-optimized, nama node groupnya
arn:aws:iam::1xxxxxxxxxx:role/AmazonEKSNodeRole, node yang dibuat nanti akan menggunakan role ini. Harap ganti 1xxxxxxxxxx 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:
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)
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!
Ambar Hasbiyatmoko
Hello, I'm web developer. Passionate about programming, web server, and networking.