استقرار اولین سرویس در Kubernetes

در این پست توضیح ساده و ابتدایی در مورد استقرار یک پروژه اولیه در کلاستر Kubernetes داده شده که اگر در حال یادگیری چنین مباحثی هستید ، میتونه برای شما نقطه شروع خوبی باشه.

استقرار اولین سرویس در Kubernetes

مانند خیلی دیگه از پروژه های نمونه ای که برای آموزش های Docker و مشابه اون استفاده میشه ، اینجا هم از سرویس whoami برای این کار استفاده می کنم. درگیر مباحث اضافی نمیشید و همچنین با توجه به اطلاعاتی که به شما میده می تونید مطمئن بشید که استقرار به درستی انجام شده.

در صورت نیاز ، پست قبلی رو برای راه اندازی کلاستر مطالعه کنید :

راه اندازی کلاستر Kubernetes

ساختار پروژه

در اینجا با توجه به سادگی پروژه اصلا ساختار پیچیده ای هم نداریم.

  • چند Pod با استفاده از Deployment ایجاد میکنیم
  • یک Service برای پروژه ایجاد می کنیم
  • جهت دسترسی به پروژه از یک Ingress استفاده می کنیم

در این آموزش از Traefik به عنوان Ingress Controller استفاده شده. جهت اطلاعات بیشتر به این آموزش مراجعه کنید :
نصب و استفاده از Traefik در Kubernetes

Deployment

در اینجا ما قصد ساخت 3 Pod داریم که در کنار هم تشکیل مجموعه ای ساده به صورت HA بدن. برای این کار فایلی به نام deployment.yml با محتوای زیر بسازید :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami-container
        image: containous/whoami

همانطور که مشاهده کردید مقدار replicas رو برابر با 3 قرار میدیم تا به همین تعداد برای ما Pod ساخته بشه. پس از آماده شدن container ها هر کدام hostname مربوط به خودشون رو دارن و بنابراین موقع مشاهده خروجی whoami راحت میشه از هم تشخیصشون داد.

همچنین از Label های مناسب برای برقراری ارتباط با Pod ها استفاده می کنیم.

با استفاده از دستور زیر Deployment خودمون رو میسازیم تا Pod ها به تدریج ایجاد بشن :

kubectl create -f deployment.yml

Service

پس از اینکه Pod های ما ساخته شد ، با ایجاد یک Service قابلیت ارتباط برقرار کردن با مجموعه Replica خودمون رو فراهم می کنیم. فایلی با نام service.yml با محتوای زیر آماده کنید :

apiVersion: v1
kind: Service
metadata:
  name: whoami-service
spec:
  ports:
  - name: http
    targetPort: 80
    port: 80
  selector:
    app: whoami

با استفاده از selector از Label هایی که در مرحله قبل تعریف کردیم استفاده می کنیم تا سرویس خودمون رو به Pod ها متصل کنیم. همچنین از پورت 80 که مربوط به سرویس whoami هست برای دسترسی استفاده کرده و اونو هم تعریف میکنیم. سرویس خودمون هم با دستور زیر ایجاد می کنیم :

kubectl create -f service.yml

Ingress

به صورت پیش فرض K8S بین مجموعه داخلی و دنیای خارج از کلاستر یک جداسازی انجام میده. اگر بخوایم با سرویسی که ایجاد کردیم ارتباط برقرار کنیم باید یک پل ارتباطی مناسب وجود داشته باشه. راه های زیادی برای این کار وجود داره ، یکی از ساده ترین راه ها استفاده از یک Ingress Controller مناسبه که در اینجا از Traefik استفاده می کنم.

برای Ingress Object خودمون یک فایل با نام ingress.yml با محتوای زیر بسازید :

kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
  name: whoami-ingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web, websecure
spec:
  rules:
  - host: whoami.k8s
    http:
      paths:
      - path: /
        backend:
          serviceName: whoami-service
          servicePort: 80

اگر پست مربوط به آموزش استفاده از Traefik به عنوان Ingress Controller رو مطالعه کرده باشید ، برای پیاده سازی از نسخه 2.2 کتابخانه Traefik استفاده می کنیم. از این نسخه به بعد قابلیت استفاده از annotation ها برای تعریف سرویس وجود داره و دیگه نیاز به روش سنتی ساخت IngressRoute وجود نداره. گرچه هنوز هم قابلیت های قبلی وجود داره و الزامی به استفاده از روش جدید نیست.

در قسمت annotations نقطه ورودی مربوطه به traefik رو تعریف می کنیم.

برای قسمت ارتباط ، دو بخش داریم :

  • تعریف ارتباط خارج از K8S : این قسمت به صورت ساده شامل معرفی یک domain برای دسترسی به سرویس مربوطه است که در اینجا از آدرس whoami.k8s استفاده میکنیم.
  • تعریف ارتباط داخل K8S : این قسمت شامل معرفی سرویس و پورت مربوطه است . از نام سرویسی که در مرحله قبل ساختیم استفاده می کنیم. همچنین پورت سرویس که 80 هست نیز تعریف میشه.

حالا با ساخت Ingress خودمون روند استقرار پروژه رو به اتمام میرسونیم :

kubectl create -f ingress.yml

بررسی عملکرد

با مراجعه به Kubernetes Dashboard یا اجرای دستورات زیر از استقرار صحیح Deployment / Service / Ingress مطلع بشید :

kubectl get po,svc,deployment

یا با استفاده از Kubernetes Dashboard :

برای آموزش نصب و تنظیم Kubernetes Dashboard به این پست مراجعه کنید :
نصب و استفاده از Kubernetes Dashboard

حالا همه چیز آماده است و با مراجعه به آدرس http://whoami.k8s در مرورگر یا استفاده از CURL می تونید پس از هربار Refresh کردن مشاهده کنید که درخواست شما به یک Pod مجزا ارسال میشه. به hostname نمایش داده شده دقت کنید