Hành trình áp dụng nền tảng DevOps nguyên gốc trên AWS Series #2: Progressive delivery trên Amazon EKS với Flagger và Gloo Edge Ingress Controller

Trong bài viết trước, OfferUp đã hiện đại hóa nền tảng DevOps của mình với Amazon EKS và Flagger để tăng tốc thời gian đưa sản phẩm ra thị trường. Chúng ta đã nói về tình trạng phát triển nhanh chóng và các thách thức kỹ thuật mà OfferUp gặp phải trong nền tảng DevOps hiện tại của họ. Như một lời nhắc nhở, chúng tôi đã trình bày cách OfferUp đã hiện đại hóa nền tảng DevOps của mình với Dịch vụ Kubernetes Amazon Elastic (Amazon EKS) và Flagger để đạt được tốc độ phát triển nhanh hơn cho các nhà phát triển, tự động hóa triển khai nhanh hơn và giảm chi phí sở hữu.

Trong bài viết này, chúng tôi sẽ thảo luận về các bước kỹ thuật để xây dựng một nền tảng DevOps cho phép triển khai tiến bộ của các dịch vụ micro trên Amazon Managed Amazon EKS. Progressive delivery mở ra một phiên bản mới của phần mềm một cách từ từ cho lưu lượng vào và liên tục đo lường tỷ lệ thành công của các chỉ số trước khi cho phép tất cả lưu lượng mới vào phiên bản phần mềm mới hơn. Flagger là dự án Graduate của Cloud Native Computing Foundations (CNCF) cho phép triển khai canary tiến bộ, cùng với bule/green và A/B Testing, trong khi đo lường các chỉ số như tỷ lệ thành công yêu cầu HTTP/gRPC và độ trễ. Flagger chuyển và định tuyến lưu lượng giữa các phiên bản ứng dụng bằng cách sử dụng một service mesh hoặc một bộ điều khiển Ingress.

Chúng tôi sử dụng Gloo Ingress Controller để định tuyến lưu lượng, Prometheus, Datadog và Amazon CloudWatch để phân tích các chỉ số ứng dụng và Slack để gửi thông báo. Flagger sẽ đăng các thông báo lên Slack khi một quy trình triển khai đã được khởi tạo, khi phát hiện phiên bản mới và nếu phân tích canary thất bại hoặc thành công.

Các bước tiên quyết để xây dựng nền tảng DevOps hiện đại

Bạn cần một tài khoản AWS và người dùng Quản lý Danh tính và Truy cập (IAM) AWS để xây dựng nền tảng DevOps. Nếu bạn chưa có tài khoản AWS với quyền truy cập Administrator, hãy tạo một tài khoản ngay bây giờ bằng cách nhấp vào đây. Tạo một người dùng IAM và gán vai trò quản trị viên. Bạn có thể xây dựng nền tảng này ở bất kỳ khu vực AWS nào, tuy nhiên, trong bài viết này, tôi sẽ sử dụng khu vực us-west-1. Bạn có thể sử dụng máy tính xách tay (Mac hoặc Windows) hoặc một máy chủ Amazon Elastic Compute Cloud (Amazon EC2) làm máy khách để cài đặt tất cả phần mềm cần thiết để xây dựng nền tảng GitOps. Trong bài viết này, tôi đã khởi chạy một máy chủ Amazon EC2 (sử dụng Amazon Linux 2 AMI) làm máy khách và cài đặt tất cả phần mềm tiên quyết. Bạn cần phải cài đặt các ứng dụng awscli, git, eksctl, kubectl và helm để xây dựng nền tảng GitOps. Dưới đây là các bước tiên quyết,

  1. Tạo một hồ sơ đặt tên (eks-devops) với tệp cấu hình và thông tin xác thực:

“`

aws configure –profile eks-devops

“`

AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxxxx

AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxx

Default region name [None]: us-west-1

Default output format [None]:

Xem và xác minh hồ sơ IAM hiện tại của bạn:

“`

export AWS_PROFILE=eks-devops

aws sts get-caller-identity

“`

  1. Nếu máy chủ Amazon EC2 không có git được cài đặt trước, hãy cài đặt git trong máy chủ Amazon EC2 của bạn:

“`

sudo yum update -y

sudo yum install git -y

“`

Kiểm tra phiên bản git

“`

git version

“`

Sao chép mã nguồn từ kho và tải xuống tất cả phần mềm tiên quyết trong thư mục chính.

“`

git clone https://github.com/aws-samples/aws-gloo-flux.git

“`

  1. Tải xuống tất cả phần mềm tiên quyết từ install.sh bao gồm awscli, eksctl, kubectl, helm và docker:

“`

cd aws-gloo-flux/eks-flagger/

ls -lt

chmod 700 install.sh ecr-setup.sh

. install.sh

“`

Kiểm tra phiên bản phần mềm đã cài đặt:

“`

aws –version

eksctl version

kubectl version -o json

helm version

docker –version

docker info

“`

Nếu thông tin về docker hiển thị lỗi như “permission denied”, hãy khởi động lại máy chủ Amazon EC2 hoặc đăng nhập lại vào máy chủ lần nữa.

  1. Tạo một kho ECR (Amazon Elastic Container Repository) và đẩy hình ảnh ứng dụng.

Amazon ECR là một hệ thống đăng ký container được quản lý đầy đủ, giúp cho các nhà phát triển dễ dàng chia sẻ và triển khai hình ảnh và tài liệu container. Tập lệnh cài đặt ecr sẽ tạo một kho ECR Amazon mới và đẩy các hình ảnh podinfo (6.0.0, 6.0.1, 6.0.2, 6.1.0, 6.1.5 và 6.1.6) vào kho ECR Amazon. Chạy tập lệnh ecr-setup.sh với tham số “tên kho ECR” (ví dụ: ps-flagger-repository) và khu vực (ví dụ: us-west-1)

“`

./ecr-setup.sh <ps-flagger-repository> <us-west-1>

“`

Bạn sẽ thấy kết quả như sau (đã cắt):

“`

###########################################################

Successfully created ECR repository and pushed podinfo images to ECR #

Please note down the ECR repository URI          

xxxxxx.dkr.ecr.us-west-1

Các bước kỹ thuật để xây dựng nền tảng DevOps hiện đại

Bài viết này sẽ hướng dẫn bạn cách sử dụng bộ điều khiển Gloo Edge ingress và Flagger để tự động triển khai Canary cho việc triển khai tiến bộ trên cụm Amazon EKS. Flagger yêu cầu một cụm Kubernetes v1.16 hoặc mới hơn và Gloo Edge ingress 1.6.0 hoặc mới hơn. Bài viết này sẽ cung cấp một cách tiếp cận từng bước để cài đặt cụm Amazon EKS với nhóm nút được quản lý, bộ điều khiển Gloo Edge ingress và Flagger cho Gloo trong cụm Amazon EKS. Bây giờ rằng cụm, hạ tầng đo lường và Flagger đã được cài đặt, chúng ta có thể cài đặt ứng dụng ví dụ chính. Chúng ta sẽ sử dụng ứng dụng Podinfo tiêu chuẩn được sử dụng trong dự án Flagger và công cụ kiểm tra tải kèm. Dịch vụ nền “podinfo” của Flagger sẽ được gọi bởi “VirtualService” của Gloo, đó là đối tượng định tuyến gốc cho Cổng Gloo. Một dịch vụ ảo mô tả tập hợp các tuyến đường để phù hợp với một tập hợp các miền. Chúng ta sẽ tự động hóa việc thăng cấp Canary, với hình ảnh mới của dịch vụ “podinfo”, từ phiên bản 6.0.0 lên phiên bản 6.0.1. Chúng ta cũng sẽ tạo một tình huống bằng cách tiêm lỗi để tự động quay lại Canary trong quá trình triển khai phiên bản 6.0.2.

  1. Sử dụng tệp myeks-cluster.yaml để tạo cụm Amazon EKS của bạn với nhóm nút được quản lý. Tệp triển khai myeks-cluster.yaml có giá trị “tên cụm” là ps-eks-66, giá trị khu vực là us-west-1, availabilityZones là [us-west-1a, us-west-1b], phiên bản Kubernetes là 1.24, và loại trường Amazon EC2 của nhóm nút là m5.2xlarge. Bạn có thể thay đổi giá trị này nếu bạn muốn xây dựng cụm ở một khu vực hoặc vùng khả dụng riêng biệt.

“`bash

eksctl create cluster -f myeks-cluster.yaml

“`

Kiểm tra chi tiết Cụm Amazon EKS:

“`bash

kubectl cluster-info

kubectl version -o json

kubectl get nodes -o wide

kubectl get pods -A -o wide

“`

Triển khai Metrics Server:

“`bash

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

kubectl get deployment metrics-server -n kube-system

“`

Cập nhật tệp kubeconfig để tương tác với cụm của bạn:

“`bash

# aws eks update-kubeconfig –name <ekscluster-name> –region <AWS_REGION>

kubectl config view

cat $HOME/.kube/config

“`

  1. Tạo một namespace “gloo-system” và Cài đặt Gloo bằng Biểu đồ Helm. Gloo Edge là một bộ điều khiển nhập Kubernetes dựa trên Envoy để tạo điều kiện và bảo vệ lưu lượng ứng dụng.

“`bash

helm repo add gloo https://storage.googleapis.com/solo-public-helm

kubectl create ns gloo-system

helm upgrade -i gloo gloo/gloo –namespace gloo-system

“`

  1. Cài đặt Flagger và tiện ích bổ sung Prometheus trong cùng namespace gloo-system. Flagger là một dự án của Cloud Native Computing Foundation và là một phần của họ công cụ GitOps trong họ Flux.

“`bash

helm repo add flagger https://flagger.app

helm upgrade -i flagger flagger/flagger \

–namespace gloo-system \

–set prometheus.install=true \

–set meshProvider=gloo

“`

  1. [Tùy chọn] Nếu bạn đang sử dụng Datadog làm công cụ giám sát, sau đó triển khai các agent Datadog như một DaemonSet bằng biểu đồ Helm của Datadog. Thay thế RELEASE_NAME và DATADOG_API_KEY tương ứng. Nếu bạn không sử dụng Datadog, thì bỏ qua bước này. Trong bài đăng này, chúng tôi sử dụng công cụ giám sát mã nguồn mở Prometheus.

“`bash

helm repo add datadog https://helm.datadoghq.com

helm repo update

helm install <RELEASE_NAME> \

    –set datadog.apiKey=<DATADOG_API_KEY> datadog/datadog

“`

Tích hợp Amazon EKS/ K8s Cluster với Bảng điều khiển Datadog – truy cập Bảng điều khiển Datadog và thêm tích hợp Kubernetes.

  1. [Tùy chọn] Nếu bạn đang sử dụng công cụ truyền thông Slack và có quyền truy cập quản trị, sau đó Flagger có thể được cấu hình để gửi thông báo đến nền tảng trò chuyện Slack bằng cách tích hợp hệ thống thông báo Slack với Flagger. Nếu bạn không có quyền quản trị trong Slack, thì bỏ qua bước này.

“`bash

helm upgrade -i flagger flagger/flagger \

–set slack.url=https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK \

–set slack.channel=general \

–set slack.user=flagger \

–set clusterName=<my-cluster>

“`

  1. Tạo một namespace “apps” và triển khai các ứng dụng và dịch vụ kiểm tra tải trong namespace này.

“`bash

kubectl create ns apps

kubectl -n apps apply -k app

kubectl get deployment -A

kubectl get hpa -n apps

Triển khai dịch vụ kiểm tra tải để tạo lưu lượng trong quá trình phân tích canary.

“`bash

kubectl -n apps apply -k tester

kubectl get deployment -A

kubectl get svc -n apps

“`

  1. Sử dụng apps-vs.yaml để tạo một định nghĩa dịch vụ ảo Gloo tham chiếu đến một bảng định tuyến sẽ được tạo bởi Flagger.

“`bash

kubectl apply -f ./apps-vs.yaml

kubectl get vs -n apps

“`

[Tùy chọn] Nếu bạn có tên miền riêng của riêng bạn, sau đó mở apps-vs.yaml trong trình soạn vi và thay thế podinfo.example.com bằng tên miền của bạn để chạy ứng dụng trong tên miền đó.

  1. Sử dụng canary.yaml để tạo một tài nguyên tùy chỉnh canary. Xem xét các phần dịch vụ, phân tích và thông số trong tệp canary.yaml.

“`bash

kubectl apply -f ./canary.yaml

“`

Sau vài giây, Flagger sẽ tạo ra các đối tượng canary. Khi quá trình khởi đầu hoàn thành, Flagger sẽ đặt trạng thái canary thành “Initialized”.

“`bash

kubectl -n apps get canary podinfo

NAME      STATUS        WEIGHT   LASTTRANSITIONTIME

podinfo   Initialized   0        2023-xx-xxTxx:xx:xxZ

“`

Gloo tự động tạo ra một ELB. Khi tải trọng cân bằng tải được cung cấp và kiểm tra tình trạng sức khỏe thành công, chúng ta có thể tìm ứng dụng ví dụ tại địa chỉ công cộng của tải trọng cân bằng tải. Ghi chú địa chỉ công cộng của ELB:

“`bash

kubectl get svc -n gloo-system –field-selector ‘metadata.name==gateway-proxy’ -o=jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}{“\n”}’

“`

Xác nhận nếu ứng dụng của bạn đang chạy và bạn sẽ thấy một đầu ra với phiên bản 6.0.0.

“`bash

curl <địa chỉ công cộng của tải trọng cân bằng tải> -H “Host:podinfo.example.com”

“`

Kích hoạt triển khai dần và theo dõi trạng thái

Bạn có thể Kích hoạt một triển khai dần bằng cách cập nhật hình ảnh container ứng dụng từ 6.0.0 thành 6.01.

“`bash

kubectl -n apps set image deployment/podinfo  podinfod=<ECR URI>:6.0.1

“`

Flagger phát hiện rằng phiên bản triển khai đã thay đổi và bắt đầu một cuộc triển khai mới.

“`bash

kubectl -n apps describe canary/podinfo

“`

Theo dõi tất cả các canaries, vì điều kiện trạng thái đã được thúc đẩy có thể có một trong các trạng thái sau: initialized, Waiting, Progressing, Promoting, Finalizing, Succeeded, và Failed.

“`bash

watch kubectl get canaries –all-namespaces

“`

Truy cập vào địa chỉ công cộng của tải trọng cân bằng tải và kiểm tra ứng dụng của bạn.

“`bash

curl <địa chỉ công cộng của tải trọng cân bằng tải> -H “Host:podinfo.example.com”

“`

Khi canary hoàn tất, xác minh ứng dụng của bạn. Bạn có thể thấy rằng phiên bản của ứng dụng đã thay đổi từ 6.0.0 thành 6.0.1.

“`json

{

  “hostname”: “podinfo-primary-658c9f9695-4pqbl”,

  “version”: “6.0.1”,

  “revision”: “”,

  “color”: “#34577c”,

  “logo”: “https://raw.githubusercontent.com/stefanprodan/podinfo/gh-pages/cuddle_clap.gif&#8221;,

  “message”: “greetings from podinfo v6.0.1”,

}

“`

[Tùy chọn] Mở ứng dụng podinfo từ trình duyệt máy tính xách tay

Tìm hiểu cả hai địa chỉ IP được liên kết với tải trọng cân bằng tải.

“`bash

dig <địa chỉ công cộng của tải trọng cân bằng tải>

“`

Mở tệp /etc/hosts trên máy tính xách tay và thêm cả hai địa chỉ IP của tải trọng cân bằng tải vào tệp hosts.

“`bash

sudo vi /etc/hosts

<Địa chỉ IP công cộng của nút đích của LB> podinfo.example.com

Ví dụ:

xx.xx.xxx.xxx podinfo.example.com

xx.xx.xxx.xxx podinfo.example.com

“`

Gõ “podinfo.example.com” vào trình duyệt của bạn và bạn sẽ tìm thấy ứng dụng với biểu đồ tương tự như sau:

Hình 1: Chào mừng từ podinfo v6.0.1

Tự động quay lại phiên bản trước

Trong quá trình phân tích canary, bạn sẽ tạo ra lỗi HTTP 500 và thời gian trễ cao để kiểm tra xem Flagger có tạm dừng và quay lại phiên bản bị lỗi không. Flagger thực hiện Tự động Quay lại trong trường hợp thất bại.

Giới thiệu triển khai canary khác với phiên bản hình ảnh podinfo 6.0.2 và theo dõi trạng thái của canary.

“`bash

kubectl -n apps set image deployment/podinfo podinfod=<ECR URI>:6.0.2

“`

Chạy lỗi HTTP 500 hoặc lỗi thời gian trễ cao từ cửa sổ dòng lệnh riêng biệt.

Tạo lỗi HTTP 500:

“`bash

watch curl -H ‘Host:podinfo.example.com’ <địa chỉ công cộng của tải trọng cân bằng tải>/status/500

“`

Tạo thời gian trễ cao:

“`bash

watch curl -H ‘Host:podinfo.example.com’ <địa chỉ công cộng của tải trọng cân bằng tải>/delay/2

“`

Khi số lần kiểm tra thất bại đạt ngưỡng phân tích canary, dữ liệu truyền về lại đến phiên bản chính, canary bị thu nhỏ xuống số không, và quá trình triển khai được đánh dấu là thất bại.

“`bash

kubectl get canaries –all-namespaces

kubectl -n apps describe canary/podinfo

“`

Dọn dẹp

Khi bạn hoàn thành việc thử nghiệm, bạn có thể xóa tất cả các tài nguyên được tạo trong loạt bài viết này để tránh mất thêm các khoản phí bổ sung. Hãy xem xét việc xóa tất cả các tài nguyên đã sử dụng.

Xóa tài nguyên Flagger và không gian ứng dụng

“`bash

kubectl delete canary podinfo -n apps

kubectl delete HorizontalPodAutoscaler podinfo -n apps

kubectl delete deployment podinfo -n apps

helm -n gloo-system delete flagger

helm -n gloo-system delete gloo

kubectl delete namespace apps

“`

Xóa Amazon EKS Cluster

Sau khi bạn hoàn thành với cụm và các nút bạn đã tạo cho hướng dẫn này, bạn nên dọn dẹp bằng cách xóa cụm và các nút bằng lệnh sau:

“`bash

eksctl delete cluster –name <tên cụm> –region <mã vùng>

“`

Xóa Amazon ECR

“`bash

aws ecr delete-repository –repository-name ps-flagger-repository –force

“`

Kết luận

Bài viết này đã giải thích quy trình thiết lập cụm Amazon EKS và cách tận dụng Flagger cho triển khai dần cùng với Prometheus và Gloo Ingress Controller. Bạn có thể tăng cường triển khai bằng cách tích hợp Flagger với Slack, Datadog và thông báo webhook cho triển khai dần. Amazon EKS loại bỏ việc quản lý và cập nhật cụm Kubernetes một cách khái niệm. Các nhóm nút được quản lý tự động hóa việc cung cấp và quản lý vòng đời của các nút làm việc trong một cụm Amazon EKS, giúp đơn giản hóa các hoạt động vận hành như triển khai phiên bản Kubernetes mới.

Chúng tôi khuyến nghị bạn nên xem xét việc hiện đại hóa nền tảng DevOps của mình từ kiến trúc monolithic sang kiến trúc dựa trên dịch vụ với Amazon EKS và tận dụng Flagger cùng với Ingress controller thích hợp để phát hành dịch vụ một cách an toàn và tự động. Amazon EKS loại bỏ công việc nặng nề không cần thiết trong việc quản lý và cập nhật cụm Kubernetes. Các nhóm nút được quản lý tự động hóa việc cung cấp

 và quản lý vòng đời của các nút làm việc trong cụm Amazon EKS, điều này đặc biệt đơn giản hóa các hoạt động vận hành như triển khai phiên bản Kubernetes mới.

Leave a comment