Triển khai Knative Service bằng Serverless Framework

cloudFun

Khi nói đến kiến trúc microservice hiện đại, mọi người thường bàn luận về việc "Nên chạy nó trên containers hay serverless?" Trong thực tế đã xảy ra cuộc tranh cãi kịch liệt về lý do tại sao nên sử dụng cái này hay cái kia. Ví dụ như cuộc bàn luận đang diễn ra của Trek10's Serverless vs. Containers Rap Battle (theo dõi clip sau)
Kết luận có phần đáng ngạc nhiên là cả hai phương pháp đều hoàn toàn phù hợp với các trường hợp sử dụng khác nhau.

deploy-knative_blog (1).png

Làm thế nào Kubernetes và Serverless hỗ trợ cho nhau tốt hơn
Cả hai mô hình kiến trúc đều cung cấp cái nhìn sâu sắc về những hạn chế và cải tiến tiềm năng của cái kia.

Kubernetes được biết đến về sự phức tạp trong vận hành mà hạ tầng Serverless như AWS Lambda nhắm đến để loại bỏ hoàn toàn. Cộng đồng rộng lớn hơn xung quanh Kubernetes liên tục đổi mới để tạo ra các công cụ như Knative giải quyết những mối quan tâm này và đơn giản hóa trải nghiệm cho developers và operators.

Mặt khác, công nghệ Serverless, có tiếng về các hạn chế do provider áp dụng như khởi động nguội và giới hạn thời gian chạy. Nhiều trong số những lo ngại này đang bắt đầu được giải quyết hoặc hiện đang được giải quyết trên một số platforms.

Tại Serverless, đây là cuộc bàn luận hợp pháp và mong muốn đóng góp vào đó các công cụ mới hỗ trợ tốt nhất cho cả hai phía. Do đó, Serverless Framework hiện hỗ trợ tích hợp với Knative - một công cụ giúp xây dựng serverless applications trên Kubernetes. Knative có thể là lựa chọn hợp lý cho nhiều workloads, đặc biệt là những workloads đòi hỏi tính linh động multi-cloud hoặc do các yêu cầu nội bộ hoặc quy định.


Bắt đầu
Có một vài bước tiên quyết để bắt đầu với Serverless Framework Knative plugin. Trước tiên, cần một Kubernetes cluster được cài đặt Knative. Do tính chất nguồn mở của Kubernetes nên có rất nhiều tùy chọn khác nhau cho việc này. Có thể chọn cài đặt trên bất kỳ cloud providers nào hoặc thậm chí trong data center riêng. Đối với bản demo này sẽ tận dụng Google Cloud Platform.

Tạo Kubernetes Cluster trên Google Cloud Platform
Để có được Kubernetes cluster chạy trong GCP, cần tạo tài khoản Google Cloud Platform.

Tạo tài khoản GCP
Truy cập https://cloud.google.com/ để tạo account. Theo hướng dẫn này, Google cung cấp khoản tín dụng 300$ cho việc sử dụng GCP. Ví dụ này sẽ sử dụng trong phạm vi phân bổ tín dụng đó và các giới hạn mặc định của Google nhưng hãy nhớ rằng trong khi Kubernetes clusters có thể mở rộng và giảm xuống, chúng vẫn có số lượng node tối thiểu là 3 và bật ngay cả khi chúng không được sử dụng. Bước cuối cùng trong hướng dẫn này sẽ chỉ cách xóa cluster.

Tạo Project trong GCP
Sau khi có account và chạy, có thể tạo project bằng Google Cloud Console tại đây. Đặt tên là sls-kubernetes-project để giữ mọi thứ được liền mạch:
step2.png


Hãy lưu trữ giá trị đó bất kể đặt tên gì vì sau này sẽ cần dùng đến nó.

Cài đặt và định cấu hình Google SDK
Sử dụng Google SDK để tạo Kubernetes cluster và giao diện. Nó sẽ cung cấp giao diện CLI đủ sức để thực hiện mọi thứ cần thiết và tùy thuộc vào hệ điều hành, có thể bắt đầu tại đây.
Nếu đã làm theo các hướng dẫn cài đặt cho SDK, thì Google Cloud account có thể đã xác thực. Nếu không, hãy dùng lệnh sau: gcloud auth login
Quá trình này sẽ nhắc chọn một project. Hãy chọn project vừa được tạo, trong trường hợp này là sls-kubernetes-project.
Sau đó, đặt một số biến environment để tạo cluster dễ dàng hơn. Biến sẽ được đặt cho cluster name, cluster zone (tại nơi đang triển khai trong GCP) và project name.
export CLUSTER_NAME=slsknative
export CLUSTER_ZONE=us-west1-c
export PROJECT=sls-kubernetes-project

Sử dụng slsknative cho cluster name, hoặc knative hoặc thứ gì khác không xung đột với bất kỳ clusters nào có thể đã chạy và tuân theo các quy ước đặt tên cho cluster.
Bây giờ, hãy đặt project làm mặc định trong Google Cloud CLI settings, có thể kiểm tra bằng gcloud config list. Nếu một phần của output bao gồm project name trong đó như sau thì nên tiếp tục:
project = sls-kubernetes-project
Mặt khác, đặt project config bằng lệnh này sau khi đặt biến environment $PROJECT:
gcloud projects create $PROJECT --set-as-default
Tiếp theo, hãy kích hoạt một số APIs cho services sẽ sử dụng trên Google Cloud:
gcloud services enable \
cloudapis.googleapis.com \
container.googleapis.com \
containerregistry.googleapis.com

Sau khi lệnh này hoàn thành, Kubernetes cluster đã sẵn sàng để tạo!

Tạo Kubernetes Cluster
Bây giờ đối với phần khó hơn, sử dụng lệnh sau để tạo Kubernetes cluster trong Google Cloud:
gcloud beta container clusters create $CLUSTER_NAME \
--addons=HorizontalPodAutoscaling,HttpLoadBalancing,Istio \
--machine-type=n1-standard-2 \
--cluster-version=latest --zone=$CLUSTER_ZONE \
--enable-stackdriver-kubernetes --enable-ip-alias \
--enable-autoscaling --min-nodes=1 --max-nodes=10 \
--enable-autorepair \
--scopes cloud-platform

GCP đang được dùng để tạo cluster mới và chuyển một số cấu hình tiêu chuẩn để tạo cluster sẽ hoạt động với Knative.

Đầu tiên, thêm một số addons như Istio hoạt động tốt với Knative. Chỉ định các loại machine muốn có trong cluster, những loại machine n1-standard-2 nhỏ hơn một chút được sử dụng vì Kubernetes clusters có tối thiểu 3 nodes và trong bản demo này, Google Cloud giới hạn các accounts mới được tạo ở 8 vCPU trong một vùng. Có thể tạo ra cluster mạnh mẽ hơn với các phiên bản lớn hơn, nhưng cuối cùng có thể cần phải kích hoạt account và đảm bảo giới hạn được tăng lên.
Nhận thấy rằng, tính năng tự động mở rộng cũng được bật ở lệnh này, nhưng trong trường hợp này có thể sẽ phải đối mặt với một số giới hạn account nếu mở rộng quá mức.
Sau khi tạo xong cluster, cần cấp quyền admin cho chính mình để quản trị bằng lệnh sau:
kubectl create clusterrolebinding cluster-admin-binding \
--clusterrole=cluster-admin \
--user=$(gcloud config get-value core/account)


Khi có quyền quản trị viên đó, sử dụng kubectl để tương tác với cluster và cài đặt Knative. Nếu đã cài đặt Docker trên machine trước đó, có thể thấy cảnh báo về kubectl tại đây hoặc sau này như sau:
WARNING: There are older versions of Google Cloud Platform tools on your system PATH.
Please remove the following to avoid accidentally invoking these old tools:

/Applications/Docker.app/Contents/Resources/bin/kubectl


Chỉ cần đảm bảo việc khởi động lại terminal tại thời điểm này. Có khả năng, GCP đã thay đổi đường dẫn trong quá trình cài đặt, do đó sẽ tìm thấy kubectl tại ~/google-cloud-sdk/bin/kubectl. Nếu không, chỉ cần chắc chắn đang sử dụng cài đặt Google Cloud SDK kubectl hoặc một số cài đặt gần đây khác. Cách dễ nhất để xác minh là nhập which kubectl và xác nhận rằng nó tham chiếu vị trí trong thư mục Google Cloud SDK.

Cài đặt Knative trên Cluster
Knative đã sẵn sàng cài đặt trên Kubernetes cluster! Trước tiên, chạy lệnh sau để giúp tránh các race conditions trong quá trình cài đặt:
Sau đó, hoàn thành việc cài đặt bằng lệnh này:
kubectl apply --selector knative.dev/crd-install=true \
--filename https://github.com/knative/serving/releases/download/v0.11.0/serving.yaml \
--filename https://github.com/knative/eventing/releases/download/v0.11.0/release.yaml \
--filename https://github.com/knative/serving/releases/download/v0.11.0/monitoring.yaml


Sẽ nhận được tất cả tính năng Knative cần thiết vào Kubernetes cluster. Trong khi cài đặt, chỉ cần chờ vài phút và theo dõi quá trình cài đặt thành phần Knative cho đến khi tất cả chúng đều hiển thị trạng thái running. Sử dụng 3 lệnh sau:
kubectl get pods --namespace knative-serving
kubectl get pods --namespace knative-eventing
kubectl get pods --namespace knative-monitoring

Chạy cứ sau mỗi vài phút và sau đó xác nhận rằng tất cả kết quả đều có trạng thái running. Khi hoàn tất, sẽ có Knative up và running trong Kubernetes trong Google Cloud!

Sử dụng Serverless Framework và Knative
Giờ đây đã có cluster và Knative setup, Serverless Framework đã sẵn sàng để bắt đầu sử dụng!
Trước tiên, hãy chắc chắn đã cài đặt ít nhất Node.js 8+ trên local machine. Nếu vẫn cần cài đặt Serverless Framework, chạy lệnh npm sau để cài đặt trên machine:
Mã:
npm install --global serverless
Tiếp theo, tạo Serverless Framework project mới với knative-docker template và sau đó thay đổi các directories vào project đó:
Mã:
serverless create --template knative-docker --path my-knative-project

cd my-knative-project
Bởi vì serverless-knative provider plugin được sử dụng, nên cần cài đặt tất cả các phụ thuộc của template với npm install trước khi thực hiện các thao tác khác. Nó sẽ tải xuống provider plugin được liệt kê dưới dạng phụ thuộc trong pack.json file.
Tiếp theo, hãy xem serverless.yml file trong project trông như sau:
Mã:
service: my-knative-project

provider:
  name: knative
  # optional Docker Hub credentials you need if you're using local Dockerfiles as function handlers
  docker:
    username: ${env:DOCKER_HUB_USERNAME}
    password: ${env:DOCKER_HUB_PASSWORD}

functions:
  hello:
    handler: hello-world.dockerfile
    context: ./code
    # events:
    #   - custom:
    #       filter:
    #         attributes:
    #           type: greeting
    #   - kafka:
    #       consumerGroup: KAFKA_CONSUMER_GROUP_NAME
    #       bootstrapServers:
    #         - server1
    #         - server2
    #       topics:
    #         - my-topic
    #   - awsSqs:
    #       secretName: aws-credentials
    #       secretKey: credentials
    #       queue: QUEUE_URL
    #   - gcpPubSub:
    #       project: knative-hackathon
    #       topic: foo
    #   - cron:
    #       schedule: '* * * * *'
    #       data: '{"message": "Hello world from a Cron event source!"}'

plugins:
  - serverless-knative
Đây là định nghĩa Serverless Framework service liệt kê các thành phần Knative Serving dưới dạng functions cùng event sources tiềm năng dưới dạng events.
Serverless Framework kết nối với cluster như thế nào? Theo mặc định, sử dụng ~/.kube/config được tạo trên machine khi thiết lập cluster. Để hỗ trợ các developers khác bắt đầu, hãy chắc chắn rằng họ có quyền truy cập vào Kubernetes cluster và có kubeconfig file riêng.

Ngoài ra, một phần quan trọng ở trên là phần Docker Hub. Hiện tại, phần đó cho phép chỉ định thông tin đăng nhập để local Docker image và code trong code directory có thể gửi vào Docker Hub và sử dụng bởi Knative. Để kích hoạt, cần phải có Docker Hub account và đặt các biến environment docker cục bộ. Trên Mac, có thể đặt các biến environment như sau:
Mã:
export DOCKER_HUB_USERNAME=yourusername
export DOCKER_HUB_PASSWORD=yourpassword
Khi Hub Docker credentials được đặt làm biến environment, có thể triển khai tới Kubernetes cluster:
Mã:
serverless deploy
Sau khi quá trình kết thúc, việc gọi service mới dễ dàng như sau:
Mã:
serverless invoke --function hello
Sau khi thấy phản hồi, Serverless Framework service đầu tiên đã được triển khai bằng Knative, Kubernetes và Google Cloud!
Nếu cần gỡ Knative Service , có thể dùng:
Mã:
serverless remove
Knative service sẽ được gỡ nhưng hãy nhớ rằng Kubernetes cluster vẫn đang chạy! Nếu muốn xóa cluster để tiết kiệm chi phí, có thể chạy lệnh sau:
gcloud container clusters delete $CLUSTER_NAME --zone $CLUSTER_ZONE
Cluster sẽ được xóa, nhưng để an toàn, cần xác nhận nó hoạt động bằng cách kiểm tra bên trong GCP UI cho cluster.

Giờ đây, rất nhiều thứ có thể thực hiện nếu tiếp tục sử dụng Knative. Có lẽ sẽ là thử tùy chỉnh Docker containers với các services thú vị hơn và tích hợp Knative cluster với events từ các sources như Google Cloud Pub / Sub, Kafka hoặc AWS Simple Queue Service.

Nguồn: https://serverless.com/
 
Top