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,
- 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
“`
- 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
“`
- 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.
- 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.
- 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
“`
- 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
“`
- 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
“`
- [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.
- [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>
“`
- 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
“`
- 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 đó.
- 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”,
“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.