Amazon EKS (Elastic Kubernetes Service) Üzerine Apinizer Kurulumu
İlk 6 bölümde, en baştan başlayarak adım adım; AWS EKS kurulumu, kaynaklarının oluşturulması ve kullanılması adımları anlatılmaktadır. Eğer AWS üzerinde hazır bir EKS cluster'ı varsa doğrudan 7. bölümden başlanılabilir.
1. Giriş
Minimum Sistem Gereksinimi
AWS EKS Cluster'a Apinizer kurulumu için, Node Group içinde tanımlanacak Compute Node'ların toplam CPU Core'ları en az 6 core olmalıdır.
Örneğin;
- t3.medium tipinde sunucu seçildiyse 3 tane olması gerekir.
- t3.xlarge tipinde sunucu eklerseniz 2 tane yeterli olacaktır.
AWS EKS (Elastic Kubernetes Service) Nedir?
Amazon Elastic Kubernetes Service (Amazon EKS), kendi Kubernetes Control Plane (Master) veya node'larınızı (Worker Nodes) kurmanıza, çalıştırmanıza ve bakımını yapmanıza gerek kalmadan Kubernetes'i AWS'de çalıştırmak için kullanabileceğiniz yönetilen bir hizmettir.
Kubernetes, kapsayıcılı uygulamaların dağıtımını, ölçeklenmesini ve yönetimini otomatikleştirmek için açık kaynaklı bir sistemdir.
2. EKS VPC ve Subnetleri Yapılandırın
AWS VPC ve Subnet Nedir?
Amazon AWS VPC (Virtual Private Cloud), AWS içinde yer alan bir özel bir sanal ağdır. Başka bir ifade ile, AWS’in network alt yapı bileşeni denilebilir. AWS üzerinde oluşturulacak tüm bileşenlerin birbirleri ile iletişim sağlamaları için Amazon AWS tarafından geliştirilmiş gelişmiş bir sanal ağ altyapısıdır. AWS VPC kendi içinde birden çok ağ bileşenine sahiptir.
VPC içinde kendi kullanımımıza özel network’ler, subnetler, gateway’ler oluşturabilir. Bunlara ait Route tabloları ile kullanım farklı network'ler ve subnet aralarındaki bağlantılar sağlanabilir.
EC2 üzerinde bulunan Instance’larınıza kolaylıkla public IP eklenebilir. Yine aynı şekilde birden çok ethernet kartı oluşturup bunları kullanabilir ve public IP atanabilir. VPC içinde bulunan network'ler ve subnet'ler arasındaki izinler yönetilebilir. Oluşturduğumuz herhangi bir network veya subnet içerisinde bir ACL oluşturup istediğimiz portlara izin verilebilir veya engelleneyebilir.
VPC Subnet: AWS üzerinde belirli bir network oluşturduktan sonra bu network’e ait alt ağlar oluşturulabilir. Aşağıdaki adımları takip ederek AWS VPC üzerinde subnet oluşturulabilir.
Yukarıda, AWS VPC ve subnet kavramlarından bahsedildi. AWS üzerinde EKS (Elastic Kubernetes Service) yapılandırmak için daha önce oluşturulmuş VPC ve subnetl'ere ihtiyaç vardır. Sadece EKS için değil AWS'nin EC2 vs. gibi diğer servislerini kullanabilmek için VPC ve subnet'lerin hazır olması gerekmektedir.
EKS için VPC ve Subnet'lerin doğru ayarlanması ve aşağıdaki AWS dokümanında belirtildiği gibi subnetlerin tanımlanması gerekmektedir. Eğer, VPC ve subnet tanımlanmasını bilmiyorsanız AWS'nin hazır template'ini kullanabilirsiniz.
Detaylar için: https://docs.aws.amazon.com/eks/latest/userguide/create-public-private-vpc.html
AWS VPC Oluşturma ve Yapılandırma
Aşağıdaki adımları takip ettiğinizde EKS için uygun olan network yapısı otomatik olarak kurulacaktır.
Detaylar için: https://console.aws.amazon.com/cloudformation.
2. EKS IAM Rolleri Yapılandırma
AWS Identity and Access Management (IAM) Role Nedir?
AWS Identity and Access Management'ı (IAM) kullanarak, AWS hizmetlerine ve kaynaklarına kimlerin hangi koşullarda erişebileceğini belirleyebilirsiniz.
IAM, AWS hesabınızın bir özelliğidir ve ek ücret olmadan sunulur.
IAM yapısı itibariyle bir instance, bir veri tabanı gibi çalışan bir şey değil tamamıyla yetkileri bizler için yöneten kimin hangi servise ne tür bir şekilde erişebileceğinden, kullanılan AWS hesabına erişimi olan bütün kullanıcıları yönetebilmektedir.
IAM ana konsept itibariyle 6 ana başlığı kendi içerisinde yönetmektedir.
- Kullanıcılar
- Gruplar
- Roller
- IAM Access Policies
- API Keys
- Password policy, MFA
Detaylı bilgi için: https://emirozbirdeveloper.medium.com/aws-iam-kimsin-sen-c84b677387b9
AWS IAM Oluşturma ve Yapılandırma
Sol menüden Roles sayfasına giderek yeni Role oluşturulur.
Bu bölümde iki adet Role oluşturmamız gerekiyor. Birincisi, EKS cluster için kullanılacak olan Role, ikincisi ise EKS içindeki Worker Node Group'ların kullanacağı Role bilgisidir.
1. EKS Cluster'ın Kullanacağı Rolü Oluşturma
Rol oluşturmak için sırasıyla verilen görsellerdeki işlemler gerçekleştirilmelidir.
Gelen sayfada herhangi bir key-value bilgisi girmeden devam edilir.
2. EKS Cluster Worker Node Group'ların Kullanacağı Rolü Oluşturma
Bu Role için aşağıdaki Policy'ler seçilmelidir.
3. EKS Master Node Kurulumu
AWS EKS (Elastic Kubernetes Service) Nedir?
Amazon EKS kontrol düzlemi, etcd ve Kubernetes API sunucusu gibi Kubernetes yazılımlarını çalıştıran kontrol düzlemi node'larından oluşur.
Kontrol düzlemi, AWS tarafından yönetilen bir hesapta çalışır ve Kubernetes API, kümenizle ilişkili Amazon EKS uç noktası aracılığıyla sunulur. Her Amazon EKS küme kontrol düzlemi tek kiracılıdır, benzersizdir ve kendi Amazon EC2 bulut sunucusu kümesinde çalışır.
Bir küme, bölmelerin programlandığı bir veya daha fazla Amazon EC2 node'u içerir.
Amazon EKS node'ları, AWS hesabınızda çalışır ve küme API sunucusu uç noktası aracılığıyla kümenizin kontrol düzlemine bağlanır.
Bir node grubuna bir veya daha fazla node dağıtırsınız. Node grubu, bir Amazon EC2 Auto Scaling grubuna dağıtılan bir veya daha fazla Amazon EC2 bulut sunucusudur.
AWS EKS (Elastic Kubernetes Service) Oluşturma ve Yapılandırma
Yukarıdaki adımları tamamladıktan sonra, AWS EKS kurulumuna başlanılabilir.
Arama bölümüne EKS yazarak sürece devam edilir.
Cluster adını, kullanmak istediğimiz kubernetes versiyonunu ve daha önce oluşturmuş olduğumuz IAM rolü seçilir.
Adım 1: Kümeyi yapılandırma
Adım 2 : Ağ iletişimini belirtme
Adım 3: Günlüğe kaydetmeyi yapılandırma
Bu bölüm, isteğe uygun şekilde yapılandırılabilir.
Adım 4: İncele ve oluştur
Son olarak tanımlanan bilgilerin görülmektedir. Bu aşamada bir yanlışlık görülmemektedir. Create diyerek cluster oluşturmaya başlanır.
EKS Cluster'ı oluşturmaktadır. Bu işlem tahmini 5 dakika sürüyor. Bu işlem devam ederken, Client bilgisayarımızdan EKS'ya erişip yönetebilmemiz gerekli araçlarını indirerek yapılandırabilinir.
4. AWS CLI ve kubectl'i Kurma ve Yapılandırma
Aşağıdaki adreslerden gerekli olan araçları indirin. Bu dökümanda Client bilgisayar olarak Windows kullanılacağı için Windows'a uygun olan versiyonlar indirilmektedir.
AWS CLI Kurulumu
İndirilen .msi uzantılı aracı kurduktan sonra, aşağıdaki gibi Cluster bilgilerinize uygun olarak yapılandırılır. Linki: https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
Adım 1: IAM service'e giderek Credential bilgilerini alma
Gelen ekrandan Manage access keys butonuna tıklayarak Access bilgilerine gidilir.
Aşağıdaki gelen pencerede Acces Key ve Secret bilgileri görülür. Pencereyi kapatmadan önce bu bilgiler bir yere kayıt edilmelidir.
Adım 2: Windows CLI’da AWS konfigürasyonu yapma
Burada daha önce kayıt edilen Access Key ve Secret bilgilerini girerek yapılandırma işlemi başlatılır.
KUBECTL Kurulumu
Adım 1: KUBECTL'i indirme
Kubectl, cluster versiyonu ile aynı olacak şekilde indirilmelidir.
Linki: https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html
Adım 2: Windows client makinesinde EKS Cluster'a bağlanmak için gerekli bilgileri tanımlama
//Örnek Yapılandırma Komutu
aws eks update-kubeconfig --region [EKS_Region] --name [EKS_Cluster_Name]
Burada region bilgisi, aşağıdaki resimde görüldüğü gibi üst menüden alınabilir. Aynı şekilde cluster ismi EKS sayfasına giderek alınabilir.
Bize gerekli olan eu-central-1 olan bölümdür.
//Yapılandırma Komutu
aws eks --region eu-central-1 describe-cluster --name apinizer-eks-clsuter1 --query cluster.status
Eğer birden fazla cluster yönetiliyorsa aşağıdaki gibi kubeconfig bilgisini güncellenmelidir.
Windows CLI’daki kubectl’n AWS EKS’yi yönetmek için kubeconfig update edilir.
aws eks --region eu-central-1 update-kubeconfig --name apinizer-eks-cluster2
5. EKS Worker Node'ları Oluşturma
Bu bölümde, EKS için Worker Node'ların oluşturulması anlatılmaktadır. Tekrardan AWS Console'a giderek aşağıdaki adımlar uygulanmalıdır.
Adım 1: Node Group Oluşturma
Adım 2: Node Group Yapılandırma
Adım 3: Hesaplama ve Ölçeklendirme Yapılandırmasını Ayarlama
Adım 4: Ağ İletişimini Belirtme
Adım 5: İncele ve Oluştur
Son olarak tanımlanan bilgilerin görülmektedir. Bu aşamada bir yanlışlık görülmüyorsa Create diyerek cluster oluşturmaya başlanır.
Bu işlem tahmini olarak 5 dakika sürmektedir. Kurulum tamamlanıp aktifleştirildikten sonra daha önce yapılandırılan kubectl ile deployment vs. işleri yapabilir.
Node Group kurulumu tamamlandığını gösteren görsel aşağıdadır:
6. EKS Kurulumu Test ve Örnek Deployment
Bu aşamadan, daha önce kurulumunu ve tanımlamalarını yapılan kubectl ile kubernetes cluster'ı kontrol edip ve örnek bir nginx uygulaması ile test edilmesi anlatılmaktadır.
AWS EKS Ortam Test
Aşağıdaki komutları takip ederek kubernetes cluster kaynakları kontrol edilmelidir.
aws eks --region eu-central-1 describe-cluster --name apinizer-eks-cluster --query cluster.status
aws eks --region eu-central-1 update-kubeconfig --name apinizer-eks-cluster
kubectl get nodes
Örnek Uygulama Yükleme ve Test Etme
Bu bölümde, örnek olarak aşağıdaki .yaml dosyasında tanımlanmış olan Nginx uygulaması, kubernetes cluster'ına yüklenmesi anlatılmaktadır ve expose edildikten sonra test edilmektedir.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 4
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
kubectl apply -f D:\apinizer\AWS\nginx.yaml
deployment.apps/my-nginx created
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-5b56ccd65f-2782v 1/1 Running 0 35s
my-nginx-5b56ccd65f-7dz9c 1/1 Running 0 35s
my-nginx-5b56ccd65f-7rcvc 1/1 Running 0 35s
my-nginx-5b56ccd65f-gqlxb 1/1 Running 0 35s
Uygulama, kubernetes cluster'a başarılı olarak yüklendiği görülmektedir.
Aşağıdaki komut ile uygulamayı servis olarak açın.
Örnek Yapılandır Komutu
kubectl expose deployment/my-nginx --port=80 --target-port=80 --name=my-nginx-service --type=LoadBalancer
service/my-nginx-service exposed
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 28m
my-nginx-service LoadBalancer 10.100.86.244 abff296b02f4547b6a23e2a3753b9419-669659739.eu-central-1.elb.amazonaws.com 80:31867/TCP 2m23s
//test için
curl -k abff296b02f4547b6a23e2a3753b9419-669659739.eu-central-1.elb.amazonaws.com
curl -k abff296b02f4547b6a23e2a3753b9419-669659739.eu-central-1.elb.amazonaws.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
7. EKS'ye Apinizer'ın Kurulumu
Bu başlık altında anlatılanlar Apinizer kurulum dokümanlarından farklı olarak Apinizer'ı servis olarak açmanın tanımını anlatmaktadır.
Apinizer Yönetim Konsolu kurulumu
Apinizer için .yaml dosyası oluşturulup AWS EKS cluster'ına yüklenmelidir.
Kurulum ve Konfigürasyon dokümanına belirtildiği gibi Replicaset MongoDB ve Elasticsearch'e ihtiyaç vardır.
- MongoDB için https://account.mongodb.com/account/register adresine giderek bir hesap oluşturun ve kısıtlı bir DB boyutuna kadar ücretsiz olarak kullanılabilir. Apinizer MongoDB'de sadece konfigürasyon tanımlarını tuttuğu için büyük boyutlu bir veritabanına ihtiyacı yoktur.
- Benzer şekilde Elasticsearch içinde https://cloud.elastic.co/registration adresine giderek cloud ortamında bir elastic servisi kullanarak Apinizer tanımlanabilir.
Ya da AWS'de bir EC2 sunucusuna Replicaset MongoDB ve Elastichsearch kurulumu yaparak tanımlanabilir.
Örnek bir apinizer-deployment.yaml dosyası ayarları aşağıdadır.
apiVersion: v1
kind: Namespace
metadata:
name: apinizer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: manager
namespace: apinizer
spec:
replicas: 1
selector:
matchLabels:
app: manager
version: 'v1'
template:
metadata:
labels:
app: manager
version: 'v1'
spec:
containers:
- name: manager
image: apinizercloud/manager:2023.01.1
imagePullPolicy: IfNotPresent
env:
- name: SPRING_PROFILES_ACTIVE
value: prod
- name: SPRING_DATA_MONGODB_DATABASE
value: apinizerdb-aws
- name: SPRING_DATA_MONGODB_URI
value: 'YOUR_MONGODB_URL'
- name: JAVA_OPTS
value: ' -Xmx1400m -Xms1400m'
resources:
requests:
memory: '2Gi'
cpu: '1'
limits:
memory: '2Gi'
cpu: '1'
ports:
- name: http
containerPort: 8080
kubectl apply -f D:\apinizer\AWS\apinizer-deployment.yaml
namespace/apinizer created
deployment.apps/manager created
kubectl get pods -n apinizer
NAME READY STATUS RESTARTS AGE
manager-646fcdd894-ktt97 1/1 Running 1 42s
Apinizer Yönetim Konsolu EKS ortamına yüklendikten sonra, MongoDB veritabanına apinizerdb isminde bir veritabanı oluşacaktır. general_settings tablosuna Apinizer tarafından size verilen lisans anahtarı girilmelidir.
Apinizer Yönetim Konsolu üzerinden Kubernetes kaynaklarına erişim ve yönetim için aşağıdaki izinlerin tanımlanması yapılmalıdır.
Örnek bir service.yaml dosyası ayarları aşağıdadır.
apiVersion: v1
kind: Namespace
metadata:
name: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
Örnek bir adminuser.yaml dosyası ayarları aşağıdadır.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
kubectl apply -f service.yaml
kubectl apply -f adminuser.yaml
kubectl create clusterrolebinding permissive-binding --clusterrole=cluster-admin --user=admin --user=kubelet --group=system:serviceaccounts
kubectl create clusterrolebinding apinizer -n kube-system --clusterrole=cluster-admin --serviceaccount=kube-system:apinizer
Apinizer Yönetim Konsolu için Erişim Servisi Oluşturma
Kurulum tamamlandıktan sonra Apinizer Yönetim Konsolu'na erişim için bir servis gerekmektedir.
Aşağıdaki adımlar takip ederek bir servis oluşturulur.
Dış IP alımında bazen bir iki dakika geçmesi gerekebilir.
kubectl expose -n apinizer deployment.apps/manager --port=80 --target-port=8080 --name=apinizer-console-service --type=LoadBalancer
service/apinizer-console-service exposed
kubectl get svc -n apinizer
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
apinizer-console-service LoadBalancer 10.100.35.144 a4b31fc518d9c4700860ed3b405bcf8c-250693074.eu-central-1.elb.amazonaws.com 80:31816/TCP 15s
Apinizer Yönetim Konsolu Giriş
Adım 2'deki servis erişim adresi, tarayıcının adres çubuğuna yazılarak giriş yapılır.
Default kullanıcı adı şifre için Apinizer destek ekibine ulaşabilirsiniz.
Apinizer Yönetim Konsolu Adresi: http://a4b31fc518d9c4700860ed3b405bcf8c-250693074.eu-central-1.elb.amazonaws.com/
8. Apinizer Konfigurasyonları
Log Sunucularının Tanımlanması
Apinizer, API trafiğini ve metrik bilgilerini, Elasticsearch veri tabanında tutar. Kurulum işlemine devam edebilmek için Elasticsearch cluster tanımlarının yapılması gerekmektedir.
Apinizer Yönetim Konsolu uygulamasında menüden Administration → Server Management → Elasticsearch Kümeleri sayfasına gidilir.
Elasticsearch cluster tanımlama ayarlarını içeren görsele aşağıda yer verilmiştir:
Elasticsearch sunucu bağlantısını, Apinizer ile test etmek için Test Connection butonu kullanılabilir.
Ortam (Environment) Tanımlama
Bir API Proxy'nin erişilebilir olması için en az bir ortamın yüklenmesi (deploy) gerekmektedir. Apinizer, bir API Proxy'nin birden fazla ortama yüklenmesine de izin verir.
Apinizer Yönetim Konsolu uygulamasında menüden Administration → Server Management → Gateway Environment sayfasına gidilir.
Ortam tanımlama ayarlarını içeren görsele aşağıda yer verilmiştir:
Aşağıdaki değerler sunucuların varsayılan değerleridir. Cluster kaynaklarınıza uygun olarak değiştirilebilir.
Create Environment butonuna tıklanarak ortam tanımlama işlemi tamamlanır.
Ortamların listelendiğinde ekranda ilgili ortamın durumunu gösteren Unpublished butonuna ve sonrasında Publish butonuna tıklanarak Prod tipindeki ortam EKS'ye deploy edilmektedir.
Ortamı yükleme işlemi tahminen 3 dakika içinde EKS'ya yüklenmiş olacaktır.
Ortam tanımlama ve yayın işlemleri ile ilgili detaylı bilgi almak için tıklayınız.
Ortamı (Environment) Servis Olarak Açma
Son olarak yayınladığımız Ortamda çalışacak API'lere erişmek için bir servis oluşturulması gerekiyor.
kubectl expose -n prod deployment.apps/worker --port=80 --target-port=8091 --name=apinizer-worker-service --type=LoadBalancer
service/apinizer-worker-service exposed
kubectl get svc -n prod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
apinizer-worker-service LoadBalancer 10.100.203.201 a0d5a28d764e046f1a5108e60-1665305939.eu-central-1.elb.amazonaws.com 80:31447/TCP 54s
AWS tarafından üretilen LoadBalancer (EXTERNAL-IP) değerini, tanımlanan Prod Ortamının Access URL değeri olarak atanmalıdır.
İlk olarak, ortamın düzenlendiği sayfanın Environment Info tablosundaki düzenleme butonuna tıklanır.
Sonrasında edit tuşuna tıklanarak ortamın Access URL bilgisi değiştirilir.
9. Apinizer'da İlk API'yi Yayınlama ve Test Etme
En son adımda örnek bir API tanım dosyası üzerinden Apinizer'a bir API'yi API Proxy olarak açılması anlatılmaktadır.
API Proxy'nin kayıt edileceği proje, navbar menüsünden seçilir.
API Proxy'nin kayıt edileceği proje, navbar menüsünden seçilir.
Apinizer Yönetim Konsolu uygulamasındaki proje menüsündenden Development → API Proxies sayfasına gidilir.
Yeni API Proxy tanımlamak için + Proxy butonuna tıklanır.
Aşağıdaki görselde seçili link ile API Proxy'nin nereden oluşturulacağı kaynağı seçilir.
API Tanım dosyasının linki girilerek Parse edilir.
API Proxy bilgileri girilerek Save butonuna tıklanır.
API Proxy'yi yüklemek (deploy) için aşağıdaki görselde seçili olan Deploy butonu kullanılır.
Yükleme işlemi onaylanır.
API Proxy'nin Develop tabından test edilmek istenen uç noktaya (endpoint) gelip, Test Endpoint butonuna tıklanır.
Test etme diyaloğunu içeren görsele aşağıda verilmiştir.
API Proxy ile ilgili detaylı bilgi için Geliştirici Kılavuzuna (Developer Guide) bakınız.
Test Konsoluyla ilgili detaylı bilgi almak için tıklayınız.