İ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 Topology - Binbash Leverage Reference Architecture


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.

VPCs and subnets - Amazon Virtual Private Cloud


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.



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.


    How Amazon EKS works


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] 
POWERSHELL

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
POWERSHELL


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
POWERSHELL

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
POWERSHELL


Ö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
YML
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
POWERSHELL

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
POWERSHELL
//test için
curl -k abff296b02f4547b6a23e2a3753b9419-669659739.eu-central-1.elb.amazonaws.com
POWERSHELL
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>
XML


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
YML


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
POWERSHELL

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
YML

Ö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
YML
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
POWERSHELL


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
POWERSHELL


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
POWERSHELL


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.