Bir önceki yazıda Docker ile CI ortamının kurulumu üzerine konulardan bahsetmiştim. Bu yazıda ise CI sürecinden geçen bir uygulamayı Google Kubernetes(k8s) Engine üzerindeki bir cluster’a deploy etmeyi anlatmaya çalışacağım.
Özellikle çok servisi olan projelerde işleri otomatize etmek en önemli konulardan biri olmaktadır. Bir monolithic uygulamayı belki manuel olarak build edip deploy edebilirsiniz fakat microservices mimarideki gibi uygulama modülleri farklı servislere ayrıldığında elimizde birçok proje olabilir. Bu projeler üzerinde sürekli geliştirme yaptığımızı düşünürsek her bir proje için build ve deployment yapmak çok çileli olur.
Continious delivery ortamını kurduğumuzda yapılan değişikliğin ilgili ortama yansıması için kod değişikliğini commit edip sadece bir müddet beklememiz yeterli olacaktır. Otomasyon ortamı bizim için projemizi build eder, test eder, analiz eder ve ilgili ortama(ör. test) teslim eder.
Bu yazının amacı commit işleminden sonra uygulamanın gcp(Google Cloud Platform) k8s cluster’ine teslim edilmesine kadar ki süreci örneklemektir.
Başlamadan önce GCP üzerinde bir hesabınız olması gerekmektedir. Google bu tarz denemeler için bizlere ücretsiz deneme hakkı sağlamakta. GKE(Google kubernetes engine) Google Compute Service üzerinde otomatik olarak oluşturulan sanal makineler ile çalışır. Fakat free tier kullanımda sadece micro bir instance ücretsiz sağlandığı için k8s cluster’a bu yeterli olmayacaktır. Bu sebepten bir miktar ödeme yapmanız gerekebilir.
Hesabınızı oluşturduktan sonra GCP sizden bir Proje oluşturmanız gerekli. Oluşturulan projenin adı ilerideki adımlarda gerekli olacak.
GCP üzerinde kubernetes cluster oluşturma
Hesap oluşturma işlemini geçtikten sonra artık ihtiyacımız olan bir k8s cluster oluşturmak. https://console.cloud.google.com/ adresinden GCP consol’a bağlanıp “Kubernetes Engine” bölümüne geçmeliyiz. Sonrasında “Cluster” sekmesinden yeni bir cluster oluşturmalıyız.
Sonraki adımda “Your first cluster” seçeneği ile default ayarları kullanarak kolaylıkla bir kubernetes clusteri oluşturabiliriz.
Bu adımda belirlediğiniz cluster name ve zone bilgisi sonraki adımlarda gerekli olacak. Cluster oluşturulduktan sonra deployment sürecinde bize gerekli olan GCP service account oluşturmalıyız.
GCP üzerinde jenkins service account tanımlama
Bunun için GCP console’a girip IAM sekmesine geçelim.
Create Service Account butonu ile aşağıdaki ekran açılacaktır;
Account name olarak “jenkins-cd” verebiliriz. Account oluşturulduktan sonra account detayına girip “CREATE KEY” butonu ile bir key oluşturmamız gerekmektedir. Oluşturduğumuz bu key’e indirmeliyiz. Bu key ile jenkins üzerinden GCP docker registry ve k8s clusterine erişeceğiz.
AM sekmesi üzerinden oluşturduğumuz jenkins-cd accountunu yetkilendirmemiz gerekmekte. “ADD” butonuna basıp “New Members” bölümüne “jenkins-cd” yazıp
- Kubernetes Engine Developer
- Storage Admin(Docker registry için)
Rollerini vermeliyiz.
Bu aşamaya kadar GCP üzerinde ihtiyaç duyduğumuz düzenlemeleri yaptık. Bunlar;
- Bir GKE cluster oluşturduk
- Dışarıdan cluster yönetimi ve docker image’larını deploy etmek için bir service account oluşturduk.
Jenkinsin hazır hale getirilmesi
Bir önceki yazıda docker üzerinde Jenkins çalıştırılması için bir Dockerfile oluşturmuştum. Bu seferki senaryo için bu dockerfile’ı biraz değiştirmemiz gerekli. Yeni dockerfile aşağıdaki gibi;
FROM jenkins/jenkins:2.176.4 USER root ARG ssh_prv_key ARG ssh_pub_key # Install kubectl for GKE integration RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/linux/amd64/kubectl RUN chmod +x ./kubectl RUN mv ./kubectl /usr/local/bin/kubectl RUN mkdir -p /root/.ssh && \ chmod 0700 /root/.ssh && \ ssh-keyscan -p 2022 [host-name] > /root/.ssh/known_hosts RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa && \ echo "$ssh_pub_key" > /root/.ssh/id_rsa.pub && \ chmod 600 /root/.ssh/id_rsa && \ chmod 600 /root/.ssh/id_rsa.pub USER jenkins