Bạn có thực sự cần Kubernetes

Gần đây khi tôi triển khai cho các dự án start-up chạy PHP hoặc NodeJs trên AWS thì việc sử dụng dịch vụ EKS hoặc KOPS để triển khai Kuberntes thì làm việc tốt, nhưng đứng với vai trò của một DevOps tôi thấy các dự án chạy dưới 10 Service thì không nhất thiết phải dùng Kubernetes.

  • Việc dùng Kubernetes thì mặc định bạn sẽ mất $0.20/1h để sử dụng dịch vụ EKS, thì một tháng $0.20*24*30=144$, nếu bạn dùng KOPS thì số tiền nó cũng gần như vậy https://aws.amazon.com/eks/pricing/
  • Việc sử dụng Kubernetes đòi hỏi bạn phải dành thời gian khá nhiều để học Kubernetes.

Vì vậy giải pháp của chúng ta cho các dự án vừa và nhỏ, (tất nhiên dự án lớn đều OK hết nhé, bật mí chúng tôi đã dùng phương pháp dưới đây triển khai hơn 1000 container) đó là dùng ECS hoặc hoặc cài đặt docker trên VM sau đó triển khai đơn giản thông qua lệnh:

docker run -d -name gsviec-docker -p 8080:80 gsviec/php start

Tất nhiên các dự án thực tế thì chúng tôi sử dụng module docker của ansible chứ không ai chạy thủ công như thế cả. Xem chi tiết về module này https://docs.ansible.com/ansible/latest/modules/docker_container_module.html

Chúng tôi không dùng ECS nhé vì dịch vụ ECS chỉ có trên AWS, nếu như khách hàng của chúng ta là Azure, Google cloud, hoặc on bare metal server, thì chúng ta sẽ không triển khai được.

Để cho dễ hình dùng bạn hãy xem một chart infrastructure của một dự án cụ thể như sau:

infrastructure aws
CC Hiếu http://blog.tracelog.in

Nếu như khi bạn dùng Kubernetes thì việc routing giữa các service với nhau thì khá là đơn giản vì Kubernetes cung cấp cho ta một cái service discovery làm chuyện đó , xem thêm https://kubernetes.io/docs/concepts/services-networking/service/, nhưng nếu ta dùng docker native với ansible thì thế nào, rất may là trên AWS hoặc các dịch vụ cloud khác đều có cung cấp cho ta dịch vụ load balancer, do đó việc routing các service với nhau ta chỉ việc dùng nó, và nó khá là đơn giản.

Hiện tại team của chúng tôi dùng terraform để xử lý chuyện đó, chỉ với vài dùng code là bạn có một service, ví dụ

resource "aws_lb" "test" {
  name               = "test-lb-tf"
  internal           = false
  load_balancer_type = "application"
  security_groups    = ["${aws_security_group.lb_sg.id}"]
  subnets            = ["${aws_subnet.public.*.id}"]

  enable_deletion_protection = true

  access_logs {
    bucket  = "${aws_s3_bucket.lb_logs.bucket}"
    prefix  = "test-lb"
    enabled = true
  }

  tags = {
    Environment = "production"
  }
}

Tất nhiên bạn có thể làm bằng tay, nhưng chúng tôi khuyên không nên làm chuyện đó, hãy học cách sử dụng terraform để quản lý trên aws.

Sau khi bạn đã tạo được các service mà cụ thể ở đây là các endpoint, ví dụ user.prod.gsviec.internal, post.prod.gsviec.internal, đây là các service chạy bên trong VPC bên ngoài không thể access được, tất nhiên chúng ta cần phải có một service extenal cho bên ngoài có thể truy cập được, mà service này chúng ta thường gọi là api-gateway, nó sẽ đứng trước hứng các request từ client, bạn có thể xem chi tiết như hình trên.

Triển khai.

Sau khi team dev phát triển tính năng mới, thì chỉ việc vào CI/CD deploy, có thể dùng Jenkins hoặc Teamcity để làm chuyện đó, nhưng cơ bản flow nó như sau

pull-code => build image => push image => ssh to VM =>update container

Với các bước cơ bản trên ta dễ dàng ứng dụng ansible làm chuyện đó, dưới đây là một ví dụ mà team chúng tôi đã triển khai cho khách hàng.

tasks:
    - name: install lib
      shell: apt-get  -y install python3-pip && pip3 install docker-py

    - name: Create a nodejs container
      docker_container:
        name: api-gateway
        image: gsviec/nodejs
        command: start
        ports:
          - "3000:3000"

Cú pháp không khác gì bạn chạy lệnh docker-compose, nhưng nó có thể scale lên hàng 1000 container nếu như bạn muốn làm, trên ansible

Tất nhiên bạn phải thêm những đoạn scripts vào con VM của bạn, mà cụ thể nếu như bạn nào dùng AWS thì sẽ có khái niệm AMI, thì trong AMI chúng ta sẽ thêm vài dòng bash shell, để khi ta dùng tính năng auto scale trong AWS thì nó sẽ thực thì, tất nhiên tất cả mọi thử điều triển khai dưới dạng code hết.

Monitoring, Logging, and Debugging

Tất nhiên một dự án triển khai trên prod chúng ta không thể thiếu phần này được, thì cơ bản bạn monitor hay logging trên con server của bạn như thế nào thì bạn cũng có thể dễ dàng triển khai trên container, hoặc kết hợp với team developer bạn có thể dễ dàng ships logs app vào ứng dụng logs như ELK, còn để giám sát server thì bạn có thể dùng prometheus

Có khá là nhiều công cụ từ có tiền cho đến miễn phí, ban đầu tại công ty chúng tôi sử dụng https://newrelic.com/ để giải quyết bài toán trên, công cụ đó khá là tuyệt vời mỗi tội khi bạn dùng cho nhiều server thì chi phí nó sẽ tăng lên.
Do đó chúng tôi quyết định tìm một giải pháp khác thây thế, thì có khá là nhiều tool, như zabbix, ELK stack, Graphite, Nagios, TICK stack, nhưng chúng tôi thực sự ấn tượng với tool Prometheus + Grafana.

Kết luận

Kubernetes là cộng cụ tuyệt vời để triển khai các dự án chạy Docker, nhưng không có nghĩa là chúng ta phải bắt buộc dùng nó, với giải pháp ansible và docker chúng tôi có thể giải quyết được những vấn đề mà kubernetes có thể làm được.

Tất nhiện tại gsviec chúng tôi vẫn cung cấo các giải pháp triển khai container trên Kubernetes nếu như khách hàng có nhu cầu thì có thể liện hệ chúng tôi qua blog này hoặc mail: [email protected]

Leave a Reply

Your email address will not be published. Required fields are marked *