Semaphore CI/CD Kullanarak Node.js Uygulamasını Kubernetes'e Dağıtma Rehberi
Bu rehberde ne öğreneceksiniz?
Bu kapsamlı rehberde, bir Node.js uygulamasını sıfırdan oluşturacak, Docker ile paketleyecek ve Semaphore CI/CD kullanarak Kubernetes kümesine otomatik olarak dağıtmayı öğreneceksiniz. Manuel dağıtım süreçlerini ortadan kaldırarak, kodunuzu her güncellediğinizde otomatik test ve yayınlama (Deployment) süreçlerini nasıl yöneteceğinizi keşfedeceksiniz.
Ön Hazırlıklar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
- GitHub hesabı ve Git kurulu bir bilgisayar
- Docker Hub hesabı
- Semaphore CI/CD hesabı (GitHub ile giriş yapılabilir)
- Rabisu Bulut veya benzeri bir sağlayıcıda çalışan Kubernetes Kümesi ve PostgreSQL Veritabanı
- Yerel makinenizde Node.js ve kubectl yüklü olması
Adım 1: Altyapı Hizmetlerini Hazırlama
Uygulamamızın çalışacağı temel yapı taşlarını oluşturarak başlayalım.
Veritabanı: Bulut panelinizden bir PostgreSQL kümesi oluşturun. addressbook_db veritabanı ve addressbook_user kullanıcısını tanımlayın.
Kubernetes Kümesi: Uygulamanın çalışacağı Kubernetes kümesini oluşturun. En az 3 node önerilir.
Not: Veritabanı bağlantı bilgilerini güvenli bir yerde saklayın.
Adım 2: Node.js Uygulamasını Yazma
Basit bir adres defteri API’si geliştireceğiz.
mkdir addressbook && cd addressbook
npm init -y
npm install --save sequelize pg express body-parser
- Bu komutlar proje yapısını oluşturur ve gerekli kütüphaneleri yükler.
Veritabanı Bağlantısı (database.js)
- Uygulama ortam değişkenleri üzerinden veritabanına bağlanır.
const Sequelize = require('sequelize');
const sequelize = new Sequelize(process.env.DB_SCHEMA || 'postgres',
process.env.DB_USER || 'postgres',
process.env.DB_PASSWORD || '',
{
host: process.env.DB_HOST || 'localhost',
port: process.env.DB_PORT || 5432,
dialect: 'postgres',
dialectOptions: {
ssl: process.env.DB_SSL == "true"
}
});
const Person = sequelize.define('Person', {
firstName: { type: Sequelize.STRING, allowNull: false },
lastName: { type: Sequelize.STRING, allowNull: true }
});
module.exports = { sequelize: sequelize, Person: Person };
- Uygulama Sunucusu (app.js)
- REST API rotaları tanımlanır.
var express = require('express');
var bodyParser = require('body-parser');
var db = require('./database');
var app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.get("/person/:id", function(req, res) {
db.Person.findByPk(req.params.id)
.then(person => res.status(200).send(JSON.stringify(person)))
.catch(err => res.status(500).send(JSON.stringify(err)));
});
app.put("/person", function(req, res) {
db.Person.create({
firstName: req.body.firstName,
lastName: req.body.lastName,
id: req.body.id
}).then(person => res.status(200).send(JSON.stringify(person)))
.catch(err => res.status(500).send(JSON.stringify(err)));
});
app.get("/all", function(req, res) {
db.Person.findAll().then(persons => res.status(200).send(JSON.stringify(persons)));
});
var server = app.listen(process.env.PORT || 3000, function() {
console.log("Uygulama port 3000 üzerinde çalışıyor");
});
Adım 3: Testlerin Yazılması ve Çalıştırılması
- CI/CD süreçleri için testler zorunludur.
npm install --save-dev jest
npm run test
- Bu adım veritabanı işlemlerinin doğru çalıştığını doğrular.
Adım 4: Semaphore CI Pipeline Oluşturma
- Semaphore projesi oluşturun ve GitHub reposunu bağlayın.
version: v1.0
name: Addressbook
agent:
machine:
type: e1-standard-2
os_image: ubuntu1804
blocks:
- name: Install dependencies
task:
jobs:
- name: npm install
commands:
- checkout
- nvm use
- npm install
- name: Tests
task:
jobs:
- name: Unit test
commands:
- checkout
- nvm use
- npm install
- sem-service start postgres
- npm run test
Adım 5: Docker İmajı Oluşturma
- Uygulama Docker imajına dönüştürülür.
FROM node:10.16.0-alpine
COPY package*.json ./
RUN npm install
COPY *.js ./
EXPOSE 3000
CMD [ "npm", "run", "start" ]
Adım 6: Kubernetes’e Dağıtım
- Uygulama Kubernetes Deployment ile çalıştırılır.
apiVersion: apps/v1
kind: Deployment
metadata:
name: addressbook
spec:
replicas: 3
selector:
matchLabels:
app: addressbook
template:
metadata:
labels:
app: addressbook
spec:
containers:
- name: addressbook
image: ${DOCKER_USERNAME}/addressbook:${SEMAPHORE_WORKFLOW_ID}
Adım 7: Uygulamanın Test Edilmesi
- Load Balancer IP adresi ile API test edilir.
curl -X PUT -d "firstName=Ahmet&lastName=Yilmaz" http://<CLUSTER_IP>/person
Sıkça Sorulan Sorular (SSS)
-
Semaphore kullanmak ücretli mi? Semaphore'un açık kaynak projeler ve küçük ekipler için ücretsiz bir katmanı bulunmaktadır.
-
Neden Kubernetes kullanmalıyım? Uygulamanızın ölçeklenebilirliğini artırmak, kesinti süresini azaltmak ve kaynakları verimli yönetmek için Kubernetes idealdir.
-
"LoadBalancer" IP adresi ne zaman oluşur? deployment.yml dosyasını uyguladıktan sonra bulut sağlayıcınızın (Örn: Rabisu) IP ataması birkaç dakika sürebilir.
-
Veritabanı şifrelerini deployment.yml içinde saklamak güvenli mi? Hayır. Bu rehberde basitlik adına ortam değişkeni kullanıldı ancak üretim ortamında Kubernetes Secrets kullanmanız önerilir.
Sonuç
Bu rehber ile Node.js uygulamanız Semaphore CI/CD kullanılarak Kubernetes’e otomatik dağıtıldı. Kod güncellemeleri artık test, build ve deployment süreçlerini otomatik tetikler.
Yönetilen Kubernetes deneyimi için Rabisu Bulut altyapısını kullanabilirsiniz.