ক্লাউড সার্ভার থেকে কুবারনেটিসে মাইগ্রেশন

googlekubernetesservice


কিছুদিন হলো হল অফিসের প্রজেক্ট আমরা নিজস্ব সার্ভার থেকে গুগল ক্লাউড কুবার্নেটিস এ মাইগ্রেশন করছিলাম। যদিও আমার ব্লগটা(marufh.com) গুগল ক্লাউডে ছিল, কিন্তু কুবার্নেটিস ইন্ফ্রাস্ট্রাকচারে ছিল না। আগে আমি হ্যালো ওয়ার্ল্ড কুবার্নেটিস করেছিলাম। এইবার অফিসের কাজ করার পর আমার নিজের ব্লগ মাইগ্রেশন করে ফেলেছি।


আমার অভিজ্ঞতা থেকে বলতে পারি, যেকোন নন কুবার্নেটিস প্রজেক্টে কুবার্নেটিস এ আনতে হলে নিচের কাজ করতে হবে

  • প্রজেক্টে ডকরাইজ করা, ডকার ইমেজ বানানো
  • ডকারহাব বা গুগল কন্টেইনার হাবে ইমেজ আপলোড করা
  • কুবার্নেটিস ক্লাস্টার তৈরী করা
  • ডেপ্লয়মেনট ফাইল, সার্ভিস ফাইল লেখা ও আপলোড করা


** যেহেতু আমার এপ্লিকেশন খুব ছোট এবং আমি একাই কাজ করি, তাই আমি আমার কম্পিউটারে বিল্ড করে ফেলি। তারপর সেই বিল্ড করা jar ফাইল বা এঙ্গুলার এর dist ডিরেক্টরিকে দিয়ে ডকার ইমেজ নিজের কম্পিউটারে বানাই। তারপর গুগল ইমেজ কন্টেইনারে আপলোড করি। কিন্তু অফিসের কাজে আমরা সবকিছু জেঙ্কিন্স দিয়ে করেছি।




প্রজেক্টে ডকরাইজ করা, ডকার ইমেজ বানানো


যেহেতু আমার একটা স্প্রিং বুট সার্ভিস, এঙ্গুলার উনিভার্সাল প্রজেক্ট আছে। তাই আমার তিনটা কন্টেইনার লেগেছে।

১. স্প্রিং বুট প্রজেক্ট রান করার জন্য একটা

২. নোড জেএস দিয়ে এঙ্গুলার সার্ভার সাইড রেন্ডারিং এর জন্য একটা

৩. nginx দিয়ে রিভার্স প্রক্সির জন্য একটা




Dockerfile স্প্রিং বুট এর জন্য

FROM openjdk:8-jdk-alpine

COPY target/blog-api*.jar /opt/app/blog-api.jar

ENTRYPOINT ["java","-Dspring.profiles.active=prod", "-Djava.security.egd=file:/dev/./urandom","-jar","/opt/app/blog-api.jar"]




Dockerfile নোড জেএস দিয়ে সার্ভার সাইড এঙ্গুলার রেন্ডারিং এর জন্য

FROM node:alpine

MAINTAINER Maruf Hassan <maruf571@gmail.com>

RUN npm install pm2 -g

RUN mkdir -p /opt/app

WORKDIR /opt/app

COPY ./dist/ dist/

CMD ["pm2-docker", "./dist/server.js", "--name='blog-ui'"]




এবং সর্বশেষ Dockerfile রিভার্স প্রক্সি এর জন্য

FROM nginx:alpine

COPY res/app.conf /etc/nginx/nginx.conf

# run nginx
CMD ["nginx", "-g", "daemon off;"]




app.conf, এখন একেবারেই বেসিক কনফিগারেশনে আছে। পরে পারফর্মেন্স টিউনিং করব।

worker_processes 1;

events { worker_connections 1024; }

http {

    server {

        # For api
        location /api/ {
            proxy_pass http://blog-api-service:7171/api/;
        }

        # For frontend
        location / {
            proxy_pass http://blog-ui-service:4000;
        }
    }
}





ডিপ্লয়মেন্ট ফাইল


ডকারাইজ করা শেষ। এখন দেখা যাক, ডিপ্লয়মেন্ট ফাইল কিভাবে পাওয়া যায়। আমি কখনোই ডিপ্লয়মেন্ট ফাইল বা সার্ভিস ফাইল হাতে ধরে লিখি না। গুগল ফাইল জেনারেট করে দেয়, সেটা পরে ব্যবহার করি।


ব্লগ api এর জন্য deployment.yaml

---
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "blog-api"
  namespace: "default"
  labels:
    app: "blog-api"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "blog-api"
  template:
    metadata:
      labels:
        app: "blog-api"
    spec:
      containers:
        - name: "blog-api"
          image: eu.gcr.io/marufh/blog-api:build11
---
apiVersion: "v1"
kind: "Service"
metadata:
  name: "blog-api-service"
  namespace: "default"
  labels:
    app: "blog-api"
spec:
  ports:
    - protocol: "TCP"
      port: 7171
  selector:
    app: "blog-api"
  type: "ClusterIP"




নোড জে এস সার্ভার সাইড রেন্ডারিং এর জন্য deployment.yaml

---
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "blog-ui"
  namespace: "default"
  labels:
    app: "blog-ui"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "blog-ui"
  template:
    metadata:
      labels:
        app: "blog-ui"
    spec:
      containers:
        - name: "blog-ui"
          image: eu.gcr.io/marufh/blog-ui:build1


---
apiVersion: "v1"
kind: "Service"
metadata:
  name: "blog-ui-service"
  namespace: "default"
  labels:
    app: "blog-ui"
spec:
  ports:
    - protocol: "TCP"
      port: 4000
  selector:
    app: "blog-ui"
  type: "ClusterIP"




nginx চালানোর জন্য deployment.yaml

---
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: "blog-nginx"
  namespace: "default"
  labels:
    app: "blog-nginx"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "blog-nginx"
  template:
    metadata:
      labels:
        app: "blog-nginx"
    spec:
      containers:
        - name: "blog-nginx"
          image: eu.gcr.io/marufh/blog-nginx:build1


---
apiVersion: "v1"
kind: "Service"
metadata:
  name: "blog-nginx-service"
  namespace: "default"
  labels:
    app: "blog-nginx"
spec:
  ports:
    - protocol: "TCP"
      port: 80
      targetPort: 80
  selector:
    app: "blog-nginx"
  type: "LoadBalancer"
  loadBalancerIP: ""




কমান্ড


স্প্রিং সার্ভিসে কোড পরিবর্তন করে নিচের কমান্ড দেই

# স্প্রিং ম্যাভেন প্রজেক্ট ডিরেক্টরি থেকে 
mvn clean install
docker build -t eu.gcr.io/marufh/blog-ui:build1 .
docker push eu.gcr.io/marufh/blog-ui:build1
# deployment.yaml এ বিল্ড নাম্বার আপডেট করি
kubectl apply -f deployment/prod/deployment.yaml



এঙ্গুলার প্রজেক্টের জন্য

# এঙ্গুলার প্রজেক্ট ডিরেক্টরি থেকে 
npm run build:ssr
docker build -t eu.gcr.io/marufh/blog-ui:build1 .
docker push eu.gcr.io/marufh/blog-ui:build1
# deployment.yaml এ বিল্ড নাম্বার আপডেট করি
kubectl apply -f deployment/prod/deployment.yaml



এবং nginx এর জন্য

docker build -t eu.gcr.io/marufh/blog-nginx:build1 .
docker push eu.gcr.io/marufh/blog-nginx:build1
# deployment.yaml এ বিল্ড নাম্বার আপডেট করি
kubectl apply -f deployment/prod/deployment.yaml



কাজ এখানেই শেষ। ধন্যবাদ