Google Kubernetes ইঞ্জিনে Jib-এর সাথে কন্টেইনারযুক্ত একটি মাইক্রোনট অ্যাপ্লিকেশন স্থাপন করুন

১. সংক্ষিপ্ত বিবরণ

মাইক্রোনট সম্পর্কে

মাইক্রোনট হলো মডিউলার ও সহজে পরীক্ষাযোগ্য মাইক্রোসার্ভিস এবং সার্ভারলেস অ্যাপ্লিকেশন তৈরির জন্য একটি আধুনিক, জেভিএম-ভিত্তিক, ফুল-স্ট্যাক ফ্রেমওয়ার্ক। মাইক্রোনটের লক্ষ্য হলো ন্যূনতম মেমরি ব্যবহারের মাধ্যমে চমৎকার স্টার্টআপ টাইম ও দ্রুত থ্রুপুট প্রদান করা। ডেভেলপাররা জাভা, গ্রুভি বা কোটলিনে মাইক্রোনট ব্যবহার করে ডেভেলপ করতে পারেন।

মাইক্রোনট প্রদান করে:

  • দ্রুত স্টার্টআপ টাইম ও কম মেমরি খরচ — রিফ্লেকশন-ভিত্তিক IoC ফ্রেমওয়ার্কগুলো আপনার কোডের প্রতিটি ফিল্ড, মেথড এবং কনস্ট্রাক্টরের জন্য রিফ্লেকশন ডেটা লোড ও ক্যাশ করে, অপরদিকে মাইক্রোনাউটের ক্ষেত্রে আপনার অ্যাপ্লিকেশনের স্টার্টআপ টাইম এবং মেমরি খরচ আপনার কোডবেসের আকারের উপর নির্ভরশীল নয়।
  • ডিক্লারেটিভ, রিঅ্যাক্টিভ, কম্পাইল-টাইম এইচটিটিপি ক্লায়েন্ট — ডিক্লারেটিভভাবে রিঅ্যাক্টিভ এইচটিটিপি ক্লায়েন্ট তৈরি করুন, যা কম্পাইল-টাইমে বাস্তবায়িত হয় এবং মেমরি ব্যবহার কমিয়ে দেয়।
  • Netty-এর উপর নির্মিত নন-ব্লকিং HTTP সার্ভার — শেখার সহজ পদ্ধতির মাধ্যমে Micronaut-এর HTTP সার্ভার এমন API উন্মুক্ত করাকে যথাসম্ভব সহজ করে তোলে যা HTTP ক্লায়েন্টরা ব্যবহার করতে পারে।
  • দ্রুত এবং সহজ টেস্টিং — আপনার ইউনিট টেস্টে সহজেই সার্ভার ও ক্লায়েন্ট চালু করুন এবং তাৎক্ষণিকভাবে সেগুলো চালান।
  • কার্যকরী কম্পাইল-টাইম ডিপেন্ডেন্সি ইনজেকশন এবং AOP — মাইক্রোনট একটি সহজ কম্পাইল-টাইম অ্যাসপেক্ট-ওরিয়েন্টেড প্রোগ্রামিং এপিআই প্রদান করে যা রিফ্লেকশন ব্যবহার করে না।
  • সম্পূর্ণ রিঅ্যাক্টিভ এবং নন-ব্লকিং অ্যাপ তৈরি করুন — মাইক্রোনাট রিঅ্যাক্টিভ স্ট্রিমস বাস্তবায়নকারী যেকোনো ফ্রেমওয়ার্ক সমর্থন করে, যার মধ্যে RxJava এবং Reactor অন্তর্ভুক্ত।

আরও তথ্যের জন্য, অনুগ্রহ করে মাইক্রোনট ওয়েবসাইটটি দেখুন।

কুবারনেটিস সম্পর্কে

কুবারনেটিস একটি ওপেন সোর্স প্রজেক্ট যা ল্যাপটপ থেকে শুরু করে হাই-অ্যাভেইলেবিলিটি মাল্টি-নোড ক্লাস্টার, পাবলিক ক্লাউড থেকে অন-প্রিমিস ডেপ্লয়মেন্ট এবং ভার্চুয়াল মেশিন থেকে বেয়ার মেটাল পর্যন্ত বিভিন্ন পরিবেশে চলতে পারে।

এই ল্যাবে, আপনি Kubernetes Engine- এ চলমান Kubernetes- এ একটি সাধারণ Groovy-ভিত্তিক Micronaut মাইক্রোসার্ভিস ডেপ্লয় করবেন।

এই কোডল্যাবের লক্ষ্য হলো আপনার মাইক্রোসার্ভিসকে কুবারনেটিসে চলমান একটি রেপ্লিকেটেড সার্ভিস হিসেবে চালানো। আপনি আপনার মেশিনে তৈরি করা কোডকে একটি ডকার কন্টেইনার ইমেজে রূপান্তর করবেন এবং তারপর সেই ইমেজটি কুবারনেটিস ইঞ্জিনে চালাবেন।

এই কোডল্যাবের বিভিন্ন অংশ কীভাবে একে অপরের সাথে যুক্ত, তা বুঝতে সাহায্য করার জন্য এখানে একটি ডায়াগ্রাম দেওয়া হলো। কোডল্যাবটি করার সময় এটিকে একটি রেফারেন্স হিসেবে ব্যবহার করুন; শেষ পর্যন্ত পৌঁছানোর পর সবকিছু আপনার কাছে পরিষ্কার হয়ে যাবে (তবে আপাতত আপনি এটি উপেক্ষা করতে পারেন)।

Kubernetes Codelab Diagram 1 (2).png

এই কোডল্যাবের জন্য, Kubernetes Engine-এর (Compute Engine-এ চালিত Kubernetes-এর একটি Google-হোস্টেড সংস্করণ) মতো একটি পরিচালিত পরিবেশ ব্যবহার করলে, আপনি এর অন্তর্নিহিত পরিকাঠামো স্থাপন করার পরিবর্তে Kubernetes-এর অভিজ্ঞতা অর্জনের উপর আরও বেশি মনোযোগ দিতে পারবেন।

আপনি যদি আপনার লোকাল মেশিনে, যেমন একটি ডেভেলপমেন্ট ল্যাপটপে, কুবারনেটিস চালাতে আগ্রহী হন, তবে আপনার সম্ভবত মিনিকিউব (Minikube ) ব্যবহার করে দেখা উচিত। এটি ডেভেলপমেন্ট এবং টেস্টিংয়ের উদ্দেশ্যে একটি সিঙ্গেল নোড কুবারনেটিস ক্লাস্টারের সহজ সেটআপের সুবিধা দেয়। আপনি চাইলে এই কোডল্যাবটি করার জন্য মিনিকিউব ব্যবহার করতে পারেন।

জিব সম্পর্কে

Jib একটি ওপেন সোর্স টুল যা দিয়ে আপনার জাভা অ্যাপ্লিকেশনের জন্য ডকার এবং OCI ইমেজ তৈরি করা যায়। এটি Maven ও Gradle-এর প্লাগইন হিসেবে এবং একটি জাভা লাইব্রেরি হিসেবে উপলব্ধ।

জিবের লক্ষ্য হলো:

  • দ্রুত — আপনার পরিবর্তনগুলো দ্রুত ডেপ্লয় করুন। Jib আপনার অ্যাপ্লিকেশনকে একাধিক লেয়ারে বিভক্ত করে, ক্লাস থেকে ডিপেন্ডেন্সিগুলোকে আলাদা করে। এখন আপনার পুরো জাভা অ্যাপ্লিকেশনটি রি-বিল্ড করার জন্য ডকারের অপেক্ষা করতে হবে না - শুধু পরিবর্তিত লেয়ারগুলোই ডেপ্লয় করুন।
  • পুনরাবৃত্তিযোগ্য — একই বিষয়বস্তু দিয়ে আপনার কন্টেইনার ইমেজ পুনর্নির্মাণ করলে সর্বদা একই ইমেজ তৈরি হয়। আর কখনও অপ্রয়োজনীয় আপডেট চালু হবে না।
  • ডেমনলেস — আপনার CLI নির্ভরতা কমান। Maven বা Gradle-এর ভেতর থেকে আপনার ডকার ইমেজ তৈরি করুন এবং আপনার পছন্দের যেকোনো রেজিস্ট্রি-তে পুশ করুন। আর ডকারফাইল লেখা বা docker build/push কল করার প্রয়োজন নেই।

আপনি গিটহাব প্রজেক্ট পেজে Jib সম্পর্কে আরও তথ্য পেতে পারেন।

এই টিউটোরিয়াল সম্পর্কে

এই টিউটোরিয়ালে জাভা অ্যাপ্লিকেশনের জন্য কন্টেইনার তৈরি করতে Jib টুলের নমুনা কোড ব্যবহার করা হয়েছে।

নমুনাটি হলো একটি সাধারণ হ্যালো ওয়ার্ল্ড সার্ভিস, যা মাইক্রোনাট ফ্রেমওয়ার্ক এবং অ্যাপাচি গ্রুভি প্রোগ্রামিং ভাষা ব্যবহার করে তৈরি।

আপনি যা শিখবেন

  • Jib ব্যবহার করে কীভাবে একটি সাধারণ জাভা অ্যাপ্লিকেশনকে ডকার কন্টেইনার হিসেবে প্যাকেজ করবেন
  • Kubernetes Engine-এ কীভাবে আপনার Kubernetes ক্লাস্টার তৈরি করবেন
  • Kubernetes Engine-এ আপনার Micronaut সার্ভিসটি Kubernetes-এ কীভাবে ডিপ্লয় করবেন
  • কীভাবে আপনার পরিষেবার পরিধি বাড়াবেন এবং আপগ্রেড চালু করবেন
  • কিভাবে কুবারনেটিস গ্রাফিক্যাল ড্যাশবোর্ড অ্যাক্সেস করবেন

আপনার যা যা লাগবে

  • একটি গুগল ক্লাউড প্ল্যাটফর্ম প্রকল্প
  • একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
  • Vim, EMACs বা Nano-এর মতো প্রচলিত লিনাক্স টেক্সট এডিটরগুলোর সাথে পরিচিতি।

আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

শুধু পুরোটা পড়ুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।

HTML/CSS ওয়েব অ্যাপ তৈরির অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

গুগল ক্লাউড প্ল্যাটফর্ম পরিষেবা ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

২. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. ক্লাউড কনসোলে সাইন ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। (যদি আপনার আগে থেকে Gmail বা G Suite অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLpGtQd5Q55

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5 OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

প্রজেক্ট আইডিটি মনে রাখবেন, যা সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে একটি অনন্য নাম (উপরের নামটি ইতিমধ্যে ব্যবহৃত হয়েছে এবং আপনার জন্য কাজ করবে না, দুঃখিত!)। এই কোডল্যাবে এটিকে পরবর্তীতে PROJECT_ID হিসাবে উল্লেখ করা হবে।

  1. এরপরে, গুগল ক্লাউড রিসোর্স ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে।

এই কোডল্যাবটি চালাতে খুব বেশি খরচ হওয়ার কথা নয়, এমনকি আদৌ কোনো খরচ নাও হতে পারে। "পরিষ্কার-পরিচ্ছন্নতা" (Cleaning up) বিভাগে দেওয়া নির্দেশাবলী অবশ্যই অনুসরণ করবেন, যেখানে রিসোর্স বন্ধ করার পরামর্শ দেওয়া হয়েছে, যাতে এই টিউটোরিয়ালের বাইরে আপনার কোনো বিল না আসে। গুগল ক্লাউডের নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

৩. মাইক্রোনট স্যাম্পল সোর্স কোডটি সংগ্রহ করুন।

ক্লাউড শেল চালু হওয়ার পরে, আপনি কমান্ড লাইন ব্যবহার করে হোম ডিরেক্টরিতে থাকা উদাহরণ সোর্স কোডটি ক্লোন করতে পারেন, এবং আমাদের স্যাম্পল সার্ভিসটি যে ডিরেক্টরিতে রয়েছে সেখানে cd কমান্ড ব্যবহার করে প্রবেশ করতে পারেন:

$ git clone https://github.com/GoogleContainerTools/jib.git
$ cd jib/examples/micronaut/

৪. কোডটির উপর একটি দ্রুত দৃষ্টিপাত

আমাদের মাইক্রোনট সিম্পল সার্ভিসটি একটি কন্ট্রোলার দিয়ে গঠিত, যা বহুল প্রচলিত ‘হ্যালো ওয়ার্ল্ড’ বার্তাটি আউটপুট করে:

@Controller("/hello")
class HelloController {
    @Get("/")
    String index() {
        "Hello World"
    }
}

HelloController কন্ট্রোলারটি /hello পাথের অধীনে থাকা অনুরোধগুলিতে সাড়া দিচ্ছে এবং এর index() মেথডটি HTTP GET অনুরোধগুলি গ্রহণ করে।

আউটপুটে সঠিক বার্তা দেওয়া হচ্ছে কিনা তা যাচাই করার জন্য একটি স্পক টেস্ট ক্লাসও রয়েছে।

class HelloControllerSpec extends Specification {
    @Shared
    @AutoCleanup
    EmbeddedServer embeddedServer = ApplicationContext.run(EmbeddedServer)

    @Shared
    @AutoCleanup
    RxHttpClient client = embeddedServer.applicationContext.createBean(RxHttpClient, embeddedServer.getURL()) 

    void "test hello world response"() {
        when:
        HttpRequest request = HttpRequest.GET('/hello')
        String rsp  = client.toBlocking().retrieve(request)

        then:
        rsp == "Hello World"
    }
}

এটি একটি সাধারণ ইউনিট টেস্টের চেয়েও বেশি কিছু; এই টেস্টটি আসলে সেই একই মাইক্রোনাট সার্ভার স্ট্যাক ( নেটি ফ্রেমওয়ার্কের উপর ভিত্তি করে) চালায়, যা প্রোডাকশনে ব্যবহৃত হয়। তাই আপনার কোডের আচরণ প্রোডাক্টে এবং আপনার টেস্টগুলোতে হুবহু একই থাকবে।

পরীক্ষাগুলো চালানোর জন্য, সবকিছু ঠিক আছে কিনা তা দেখতে আপনি নিম্নলিখিত কমান্ডটি চালাতে পারেন:

./gradlew test

৫. অ্যাপ্লিকেশনটি স্থানীয়ভাবে চালান

আপনি নিম্নলিখিত গ্রেডল কমান্ডের সাহায্যে স্বাভাবিকভাবে মাইক্রোনাট পরিষেবাটি শুরু করতে পারেন:

$ ./gradlew run

অ্যাপ্লিকেশনটি চালু হয়ে গেলে, আপনি ছোট + আইকনটির সাহায্যে একটি অতিরিক্ত ক্লাউড শেল ইনস্ট্যান্স খুলতে পারেন, এবং তারপরে curl দিয়ে পরীক্ষা করে দেখতে পারেন যে আপনি প্রত্যাশিত আউটপুট পাচ্ছেন কিনা:

$ curl localhost:8080/hello

এবং আপনি একটি সাধারণ "হ্যালো ওয়ার্ল্ড" বার্তা দেখতে পাবেন।

৬. Jib ব্যবহার করে অ্যাপ্লিকেশনটিকে একটি ডকার কন্টেইনার হিসেবে প্যাকেজ করুন।

এরপর, আপনার অ্যাপটিকে কুবারনেটিসে চালানোর জন্য প্রস্তুত করুন। এই উদ্দেশ্যে, আমরা কঠিন কাজটি করার জন্য জিব (Jib) ব্যবহার করব, কারণ আমাদের নিজেদের কোনো Dockerfile স্পর্শ করতে হবে না!

চলুন আমাদের কন্টেইনারটি তৈরি করার জন্য কমান্ডটি চালাই:

$ ./gradlew jibDockerBuild

এই আউটপুটটি আপনার দেখা উচিত:

Tagging image with generated image reference micronaut-jib:0.1. If you'd like to specify a different tag, you can set the jib.to.image parameter in your build.gradle, or use the --im
age=<MY IMAGE> commandline flag.

Containerizing application to Docker daemon as micronaut-jib:0.1...
warning: Base image 'gcr.io/distroless/java' does not use a specific image digest - build may not be reproducible
Getting base image gcr.io/distroless/java...
Building dependencies layer...
Building resources layer...
Building classes layer...
Finalizing...

Container entrypoint set to [java, -cp, /app/resources:/app/classes:/app/libs/*, example.micronaut.Application]
Loading to Docker daemon...

Built image to Docker daemon as micronaut-jib:0.1

এখন যেহেতু আমাদের ইমেজটি তৈরি হয়ে গেছে, চলুন ক্লাউড শেলের প্রথম ট্যাবে আমাদের ডকার ইমেজটি রান করে দেখি আমরা আমাদের বন্ধুত্বপূর্ণ হ্যালো বার্তাটি দেখতে পাই কি না:

$ docker run -it -p 8080:8080 micronaut-jib:0.1
16:57:20.255 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [cloud, gcp]
16:57:23.203 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 2926ms. Server Running: http://97b7d76ccf3f:8080

আমাদের পরিষেবাটি চালু আছে, তাই এটি প্রত্যাশা অনুযায়ী কাজ করছে কিনা তা দেখার জন্য আমরা এখন আমাদের দ্বিতীয় ক্লাউড শেল ট্যাবে `curl` কমান্ডটি চালু করতে পারি:

$ curl localhost:8080/hello
Hello World

ক্লাউড শেলে Ctrl+C চেপে আপনি কন্টেইনারটি বন্ধ করতে পারেন।

৭. আমাদের কন্টেইনারাইজড সার্ভিসটিকে রেজিস্ট্রি-তে পুশ করা

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

রেজিস্ট্রিতে পুশ করার আগে, Tools > Container Registry- তে গিয়ে নিশ্চিত হয়ে নিন যে আমাদের প্রোজেক্টের জন্য কন্টেইনার রেজিস্ট্রি (Container Registry) সক্রিয় করা আছে। যদি এটি সক্রিয় করা না থাকে, তাহলে আপনি নিচের ডায়ালগ বক্সটি দেখতে পাবেন, সেক্ষেত্রে এটি সক্রিয় করতে অনুগ্রহ করে " Enable Container Registry API "-তে ক্লিক করুন:

ac812e6260ac7dfb.png

রেজিস্ট্রি প্রস্তুত হয়ে গেলে, রেজিস্ট্রি-তে ইমেজটি পুশ করার জন্য নিম্নলিখিত কমান্ডগুলো চালু করুন:

$ gcloud auth configure-docker
$ docker tag micronaut-jib:0.1 \
         gcr.io/$GOOGLE_CLOUD_PROJECT/micronaut-jib:0.1
$ docker push gcr.io/$GOOGLE_CLOUD_PROJECT/micronaut-jib:0.1

উপরের কমান্ডগুলো gcloud SDK-কে ডকারকে কনফিগার ও অনুমোদন করতে দেয়, যাতে এটি আপনার কন্টেইনার রেজিস্ট্রি ইনস্ট্যান্সে ইমেজ পুশ করতে পারে, রেজিস্ট্রি-তে এর অবস্থান নির্দেশ করার জন্য ইমেজটিকে ট্যাগ করতে পারে এবং তারপর রেজিস্ট্রি-তে পুশ করতে পারে।

সবকিছু ঠিকঠাক থাকলে এবং কিছুক্ষণ পর আপনি কনসোলে কন্টেইনার ইমেজটি দেখতে পাবেন: Tools > Container Registry । এই পর্যায়ে আপনার কাছে এখন একটি প্রোজেক্ট-ব্যাপী ডকার ইমেজ উপলব্ধ আছে, যা কুবারনেটিস অ্যাক্সেস এবং অর্কেস্ট্রেট করতে পারবে, যেমনটা আপনি কয়েক মিনিটের মধ্যেই দেখতে পাবেন।

12224c4e42183b4e.png

৮. আপনার ক্লাস্টার তৈরি করুন

ঠিক আছে, আপনি এখন আপনার Kubernetes Engine ক্লাস্টার তৈরি করার জন্য প্রস্তুত, কিন্তু তার আগে, ওয়েব কনসোলের Google Kubernetes Engine বিভাগে যান এবং সিস্টেমটি চালু হওয়ার জন্য অপেক্ষা করুন (এতে মাত্র কয়েক সেকেন্ড সময় লাগা উচিত)।

20c0587c0108b8ba.png

একটি ক্লাস্টার গুগল দ্বারা পরিচালিত একটি কুবারনেটিস মাস্টার এপিআই সার্ভার এবং এক সেট ওয়ার্কার নোড নিয়ে গঠিত। ওয়ার্কার নোডগুলো হলো কম্পিউট ইঞ্জিন ভার্চুয়াল মেশিন। চলুন, আপনার ক্লাউডশেল সেশন থেকে gcloud CLI ব্যবহার করে দুটি n1-standard-1 নোড সহ একটি ক্লাস্টার তৈরি করি (এটি সম্পন্ন হতে কয়েক মিনিট সময় লাগবে):

$ gcloud container clusters create hello-cluster \
  --num-nodes 2 \
  --machine-type n1-standard-1 \
  --zone us-central1-c

অবশেষে, আপনি ক্লাস্টারটি তৈরি হতে দেখবেন।

Creating cluster hello-cluster in us-central1-c...done.
Created [https://container.googleapis.com/v1/projects/mn-gke-test/zones/us-central1-c/clusters/hello-cluster].
To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/us-central1-c/hello-cluster?project=mn-gke-test
kubeconfig entry generated for hello-cluster.
NAME           LOCATION       MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
hello-cluster  us-central1-c  1.9.7-gke.7     35.239.224.115  n1-standard-1  1.9.7-gke.7   2          RUNNING

এখন আপনার কাছে গুগল কুবারনেটিস ইঞ্জিন দ্বারা চালিত একটি সম্পূর্ণ কার্যকরী কুবারনেটিস ক্লাস্টার থাকার কথা:

d9e1e314769753e7.png

এখন আপনার নিজের কন্টেইনারাইজড অ্যাপ্লিকেশনটি কুবারনেটিস ক্লাস্টারে ডেপ্লয় করার সময়! এখন থেকে আপনি kubectl কমান্ড লাইন ব্যবহার করবেন (যা আপনার ক্লাউড শেল এনভায়রনমেন্টে আগে থেকেই সেট আপ করা আছে)। এই কোডল্যাবের বাকি অংশের জন্য কুবারনেটিস ক্লায়েন্ট এবং সার্ভার উভয়ের ভার্সন ১.২ বা তার বেশি হতে হবে। kubectl version কমান্ডটি আপনাকে এর বর্তমান ভার্সন দেখাবে।

৯. আপনার অ্যাপ্লিকেশনটি কুবারনেটিসে স্থাপন করুন।

একটি Kubernetes deployment, আপনার সদ্য তৈরি করা কন্টেইনার ইমেজটি ব্যবহার করে আপনার অ্যাপ্লিকেশনের একাধিক ইনস্ট্যান্স তৈরি, পরিচালনা এবং স্কেল করতে পারে। চলুন, kubectl create deployment কমান্ডটি ব্যবহার করে Kubernetes-এ আপনার অ্যাপ্লিকেশনের একটি deployment তৈরি করি:

$ kubectl create deployment hello-micronaut \
  --image=gcr.io/$GOOGLE_CLOUD_PROJECT/micronaut-jib:0.1

আপনার তৈরি করা ডিপ্লয়মেন্টটি দেখতে, শুধু চালান:

$ kubectl get deployments
NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-micronaut   1         1         1            1           5m

ডিপ্লয়মেন্ট দ্বারা তৈরি অ্যাপ্লিকেশন ইনস্ট্যান্সগুলো দেখতে, এই কমান্ডটি চালান:

$ kubectl get pods
NAME                               READY     STATUS    RESTARTS   AGE
hello-micronaut-5647fb98c5-lh5h7   1/1       Running   0          5m

এই পর্যায়ে আপনার কন্টেইনারটি কুবারনেটিসের নিয়ন্ত্রণে চালু থাকার কথা, কিন্তু এটিকে এখনও বহির্বিশ্বের জন্য প্রবেশযোগ্য করতে হবে।

১০. বাহ্যিক ট্র্যাফিকের অনুমতি দিন

ডিফল্টরূপে, পডটি ক্লাস্টারের মধ্যে শুধুমাত্র তার অভ্যন্তরীণ আইপি দ্বারা অ্যাক্সেসযোগ্য। কুবারনেটিস ভার্চুয়াল নেটওয়ার্কের বাইরে থেকে hello-micronaut কন্টেইনারটিকে অ্যাক্সেসযোগ্য করতে হলে, আপনাকে পডটিকে একটি কুবারনেটিস সার্ভিস হিসেবে এক্সপোজ করতে হবে।

ক্লাউড শেল থেকে আপনি kubectl expose কমান্ডের সাথে --type=LoadBalancer ফ্ল্যাগটি ব্যবহার করে পডটিকে পাবলিক ইন্টারনেটে উন্মুক্ত করতে পারেন। বাহ্যিকভাবে অ্যাক্সেসযোগ্য একটি আইপি তৈরির জন্য এই ফ্ল্যাগটি আবশ্যক।

$ kubectl expose deployment hello-micronaut --type=LoadBalancer --port=8080

এই কমান্ডে ব্যবহৃত ফ্ল্যাগটি নির্দেশ করে যে আপনি অন্তর্নিহিত পরিকাঠামো দ্বারা প্রদত্ত লোড-ব্যালেন্সার ব্যবহার করবেন (এই ক্ষেত্রে কম্পিউট ইঞ্জিন লোড ব্যালেন্সার )। লক্ষ্য করুন যে আপনি ডিপ্লয়মেন্টটিকে এক্সপোজ করছেন, সরাসরি পডটিকে নয়। এর ফলে তৈরি হওয়া সার্ভিসটি ডিপ্লয়মেন্ট দ্বারা পরিচালিত সমস্ত পডের মধ্যে ট্র্যাফিক লোড ব্যালেন্স করবে (এই ক্ষেত্রে শুধুমাত্র ১টি পড, কিন্তু আপনি পরে আরও রেপ্লিকা যোগ করবেন)।

গুগল ক্লাউড প্ল্যাটফর্মের বাইরে থেকে পরিষেবাটিকে সম্পূর্ণরূপে অ্যাক্সেসযোগ্য করার জন্য কুবারনেটিস মাস্টার লোড ব্যালেন্সার এবং সংশ্লিষ্ট কম্পিউট ইঞ্জিন ফরওয়ার্ডিং রুল, টার্গেট পুল ও ফায়ারওয়াল রুল তৈরি করে।

সার্ভিসটির সর্বজনীনভাবে অ্যাক্সেসযোগ্য আইপি অ্যাড্রেস খুঁজে পেতে, কেবল kubectl ক্লাস্টারের সমস্ত সার্ভিস তালিকাভুক্ত করতে অনুরোধ করুন:

$ kubectl get services
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
hello-micronaut   LoadBalancer   10.39.243.251   aaa.bbb.ccc.ddd 8080:30354/TCP   1m
kubernetes        ClusterIP      10.39.240.1     <none>          443/TCP          31m

লক্ষ্য করুন, আপনার পরিষেবার জন্য দুটি আইপি অ্যাড্রেস তালিকাভুক্ত আছে, উভয়ই পোর্ট 8080 এর জন্য ব্যবহৃত হয়। একটি হলো অভ্যন্তরীণ আইপি, যা শুধুমাত্র আপনার ক্লাউড ভার্চুয়াল নেটওয়ার্কের ভেতরে দেখা যায়; অন্যটি হলো বাহ্যিক লোড-ব্যালেন্সড আইপি। এই উদাহরণে, বাহ্যিক আইপি অ্যাড্রেসটি হলো aaa.bbb.ccc.ddd

এখন আপনি আপনার ব্রাউজারে এই ঠিকানাটি লিখে পরিষেবাটি ব্যবহার করতে পারবেন: http://<EXTERNAL_IP> :8080 /hello

১১. আপনার পরিষেবার পরিধি বাড়ান।

কুবারনেটিসের অন্যতম শক্তিশালী বৈশিষ্ট্য হলো আপনার অ্যাপ্লিকেশনকে স্কেল করা কতটা সহজ। ধরুন, হঠাৎ আপনার অ্যাপ্লিকেশনের জন্য আরও ধারণক্ষমতার প্রয়োজন হলো; আপনি খুব সহজেই রেপ্লিকেশন কন্ট্রোলারকে আপনার অ্যাপ্লিকেশন ইনস্ট্যান্সগুলোর জন্য নতুন সংখ্যক রেপ্লিকা পরিচালনা করতে বলতে পারেন:

$ kubectl scale deployment hello-micronaut --replicas=3
deployment.extensions "hello-micronaut" scaled

$ kubectl get deployment
NAME              DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-micronaut   3         3         3            3           16m

এখানে ডিক্লারেটিভ পদ্ধতিটি লক্ষ্য করুন — নতুন ইনস্ট্যান্স শুরু বা বন্ধ করার পরিবর্তে, আপনি ঘোষণা করেন যে সব সময় কতগুলো ইনস্ট্যান্স চালু থাকবে। কুবারনেটিস রিকনসিলিয়েশন লুপগুলো কেবল নিশ্চিত করে যে বাস্তবতা আপনার অনুরোধের সাথে মিলছে এবং প্রয়োজনে ব্যবস্থা গ্রহণ করে।

১২. আপনার পরিষেবাতে একটি আপগ্রেড চালু করুন।

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

প্রথমে, অ্যাপ্লিকেশনটি পরিবর্তন করা যাক। ক্লাউড শেল থেকে কোড এডিটরটি খুলুন।

5aee8f3d1e003571.png

/jib/examples/micronaut/src/main/groovy/example/micronaut/HelloController.groovy এ যান এবং response-এর মান আপডেট করুন:

@Controller("/hello")
class HelloController {
    @Get("/")
    String index() {
        "Hello Kubernetes World"
    }
}

/jib/examples/micronaut/build.gradle ফাইলে, আমরা এই লাইনটি আপডেট করার মাধ্যমে আমাদের ইমেজের ভার্সন 0.1 থেকে 0.2-এ আপগ্রেড করব:

version '0.2'

তারপর সর্বশেষ পরিবর্তনগুলো সহ অ্যাপ্লিকেশনটি পুনর্নির্মাণ ও প্যাকেজ করুন:

$ ./gradlew jibDockerBuild

এবং ইমেজটিকে ট্যাগ করে কন্টেইনার ইমেজ রেজিস্ট্রি-তে পুশ করুন:

$ docker tag micronaut-jib:0.2 \
         gcr.io/$GOOGLE_CLOUD_PROJECT/micronaut-jib:0.2
$ docker push gcr.io/$GOOGLE_CLOUD_PROJECT/micronaut-jib:0.2

এখন আপনি প্রস্তুত, যাতে Kubernetes আপনার রেপ্লিকেশন কন্ট্রোলারকে অ্যাপ্লিকেশনটির নতুন সংস্করণে মসৃণভাবে আপডেট করতে পারে। আপনার চলমান কন্টেইনারের ইমেজ লেবেল পরিবর্তন করার জন্য, আপনাকে বিদ্যমান hello-micronaut deployment এডিট করতে হবে এবং ইমেজটি gcr.io/PROJECT_ID/micronaut-jib:0.1 থেকে gcr.io/PROJECT_ID/micronaut-jib:0.2 এ পরিবর্তন করতে হবে।

আপনি kubectl set image কমান্ড ব্যবহার করে Kubernetes-কে আপনার অ্যাপ্লিকেশনের নতুন সংস্করণটি রোলিং আপডেটের মাধ্যমে পুরো ক্লাস্টারে একবারে একটি করে ইনস্ট্যান্সে ডেপ্লয় করতে বলতে পারেন।

$ kubectl set image deployment/hello-micronaut \
          micronaut-jib=gcr.io/$GOOGLE_CLOUD_PROJECT/micronaut-jib:0.2

deployment.apps "hello-micronaut" image updated

নতুন প্রতিক্রিয়াটি আসছে কিনা তা দেখতে http://EXTERNAL_IP:8080 আবার পরীক্ষা করুন।

১৩. রোল ব্যাক

ওহ — আপনি কি অ্যাপ্লিকেশনটির নতুন সংস্করণে কোনো ভুল করেছেন? সম্ভবত নতুন সংস্করণটিতে কোনো ত্রুটি ছিল এবং আপনার দ্রুত রোলব্যাক করা প্রয়োজন। Kubernetes-এর সাহায্যে, আপনি সহজেই পূর্ববর্তী অবস্থায় ফিরে যেতে পারেন। চলুন, নিম্নলিখিত কমান্ডটি চালিয়ে অ্যাপ্লিকেশনটি রোলব্যাক করা যাক:

$ kubectl rollout undo deployment/hello-micronaut

আপনি যদি সার্ভিসটির আউটপুট দেখেন, আমরা আমাদের প্রাথমিক 'হ্যালো ওয়ার্ল্ড' মেসেজটিতে ফিরে আসব।

১৪. সারসংক্ষেপ

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

১৫. অভিনন্দন!

আপনি শিখেছেন কীভাবে গুগল কুবারনেটিস ইঞ্জিনে কুবারনেটিসে একটি নতুন অ্যাপাচি গ্রুভি / মাইক্রোনাট ওয়েব-ভিত্তিক মাইক্রোসার্ভিস তৈরি এবং স্থাপন করতে হয়।

আরও জানুন

  • Jib ডকুমেন্টেশন এবং নমুনা: https://github.com/GoogleContainerTools/jib/
  • মাইক্রোনট ওয়েবসাইট: http://micronaut.io/
  • গুগল ক্লাউড প্ল্যাটফর্মে জাভা: https://cloud.google.com/java/
  • জাভা উদাহরণের জন্য: https://cloud.google.com/java/samples
  • Kubernetes-এর আরও বিস্তারিত টিউটোরিয়ালের জন্য bit.ly/k8s-lab দেখুন, যেখানে একটি ফুল-স্ট্যাক অ্যাপ্লিকেশন ডেপ্লয় করার পদ্ধতি ধাপে ধাপে দেখানো হয়েছে।

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ২.০ জেনেরিক লাইসেন্সের অধীনে রয়েছে।