Làm thế nào để giải phóng tài nguyên từ DotNet triển khai trong Kubernetes Cluster

755
11-09-2021
Làm thế nào để giải phóng tài nguyên từ DotNet triển khai trong Kubernetes Cluster

Nếu bạn đã triển khai DotNet trong Kubernetes cluster thì cần ghi nhớ một việc quan trọng là giải phóng tài nguyên, tắt các open channels và tắt những gì bạn đã bật khỏi ứng dụng khi Kubernetes yêu cầu đóng container. Hãy cùng BizFly Cloud tìm hiểu các giải phóng tài nguyên từ DotNet triển khai trong Kubernetes Cluster.

Các pods hay home của các containers chỉ là tạm thời và Kubernetes có thể yêu cầu đóng containers vì nhiều lý do. Các lý do đó có thể là thu nhỏ cluster hoặc lên lịch các pods trên một node khác để những người khác. Bên cạnh đó, ứng dụng của bạn thường nhận được thông báo này khi bạn áp dụng bản cập nhật cho ứng dụng.

Giải pháp

Các containers trong Kubernetes có một số lifecycle hooks mà bạn có thể gán code ứng dụng vào. Kubernetes đưa ra các tín hiệu khác nhau là các Linux interrupts được gửi đến một quá trình. Quá trình đó có thể lựa chọn cách thức phản ứng với những tín hiệu mà nó nhận được.

Bạn không thể “phớt lờ” SIGKILL và SIGSTOP. Bởi lẽ, hệ điều hành (Operating System) thực thi chúng, nhưng ứng dụng của bạn có thể gán lệnh callback cho tín hiệu SIGTERM. Đây là tín hiệu mà Kubernetes sử dụng để đóng container.

Cách thực thi lý tưởng

Nếu dịch vụ của bạn tốn quá nhiều thời gian để trả lời lại các yêu cầu từ những dịch vụ bên ngoài hoặc nếu bạn không muốn container tiếp tục xử lý yêu cầu khi nó được hướng dẫn tự hủy, thì bạn phải phản hồi lại các probes đang sẵn sàng với phản hồi lỗi khi container nhận được tín hiệu SIGERM. 

Việc này sẽ khiến Kubernetes controller không chuyển thêm các yêu cầu khác đến container của bạn. Tiếp theo, bạn đợi vài giây để các yêu cầu hiện tại hoàn thành và  bắt đầu giải phóng tài nguyên. 

Thời gian thông thường để thực hiện tất cả các hoạt động này tính cả việc giải phóng tài nguyên là 30 giây. Tiếp đó, SIGKILL  interrupt sẽ hủy container của bạn.

Tiến hành giải phóng tài nguyên từ DotNet triển khai trong Kubernetes Cluster

Làm thế nào để giải phóng tài nguyên từ DotNet triển khai trong Kubernetes Cluster - Ảnh 1.

Dưới đây là danh sách các đoạn code cho một ứng dụng. Ứng dụng này đã gán lệnh callback cho tín hiệu SIGTERM và đặt giá trị của một biến. Biến này sẽ được đọc bởi API controller để phản hồi lại những readiness probe.

public static void Main(string[] args)

{

    // Listen for the SIGTERM interrupt. You can also use the AppDomain.CurrentDomain.ProcessExit event.

    AssemblyLoadContext.Default.Unloading += Cleanup;

}

private static void Cleanup(AssemblyLoadContext obj)

{

    // Set a variable used by readiness probe to false. Now, I have 30 seconds to live.

    Thread.Sleep(10000);

    // Release all the resources. I am going to die soon.

}

Tiếp theo, bạn cần xác định API controller phản hồi với readiness probe.

[Route("api/[controller]")]

public class HealthController : Controller

{

    [HttpGet("Readiness")]

    public async Task Readiness()

    {

        // Set this variable to true or false depending on whether you want to receive more requests.

        var healthCheck = true;

        if (healthCheck)

        {

            return Ok();

        }

        return StatusCode((int) HttpStatusCode.ServiceUnavailable);

    }

}

Tiếp đến, bạn hãy hướng dẫn Kubernetes sử dụng điểm cuối tùy chỉnh (custom endpoint) cho readiness probe.

apiVersion: v1

kind: Service

metadata:

  name: propershutdownapi

spec:

  selector:

    app: propershutdownapi

  ports:

    - port: 32001

      nodePort: 32001

      targetPort: 80

  type: NodePort

---

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: propershutdownapi

spec:

  replicas: 3

  template:

    metadata:

      labels:

        app: propershutdownapi

    spec:

      restartPolicy: Always

      containers:

        - image: propershutdownapi:v1

          imagePullPolicy: IfNotPresent

          name: propershutdownapi

          readinessProbe:

            httpGet:

              path: /api/Health/Readiness

              port: 80 # Port on which probe should make request.

            initialDelaySeconds: 10 # Start probing after 10 seconds of container creation.

            timeoutSeconds: 1 # Timeout if you don't get a response in 1 second.

            periodSeconds: 10 # Probe frequency in seconds.

            failureThreshold: 2 # Probe declares failure after 2 attempts.

          ports:

            - containerPort: 80

              name: http

              protocol: TCP

Bạn có thể áp dụng cấu hình này trên Kubernetes cluster của mình bằng cách sử dụng lệnh kubectl apply. Để kiểm tra giải pháp này, bạn có thể tạo một cluster và xóa bỏ một pod bằng cách giảm số lượng bản sao (replica) trong cấu hình trước đó, cũng như dùng phép đo từ xa (telemetry) để ghi lại hoạt động.   

Trên đây là những hướng dẫn cơ bản để bạn giải phóng tài nguyên từ DotNet triển khai trong Kubernetes Cluster. Hãy theo dõi BizFly Cloud để được cập nhật những bài viết mới nhất về công nghệ!

Hiện tại, BizFly Cloud đang cung cấp dịch vụ giúp triển khai Kubernetes hoàn toàn tự động, không cần công sức vận hành, xây dựng hệ thống container cho ứng dụng chỉ với vài thao tác đơn giản,... Hãy tham khảo BizFly Kubernetes Engine, giải pháp giúp doanh nghiệp của bạn tiết kiệm chi phí  và quản lý Kubernetes hiệu quả.

SHARE