Giaosucan's blog - Chia sẻ kiến thức theo cách bá đạo

Ticker

20/recent/ticker-posts

Build End2End CI/CD dùng Jenkins và Spinnaker - part 1

 

Build a Deployment Pipeline with Spinnaker on Kubernetes | AWS Open Source  Blog

MTP là công ty chuyên sản xuất và phân phối trà xanh. Công ty có số lượng khách hàng rất lớn trải rộng trên toàn thế giới. Họ đã build một trang web thương mại điện tử giống như tiki để khách hàng có thể lựa chọn sản phẩm và order dễ dàng. 

Trang web được build trên nền tảng microservice hàng ngày các bản update được commit lên github build và deploy liên tục qua process CI/CD. Trước đây hệ thống mới chỉ có phần CI (sử dụng Jenkins), việc deploy được thực hiện bằng manual. Sau nhiều nghiên cứu, thử nghiệm, phần CD đã được apply sử dụng công cụ Spinnaker Jenkins jobs sẽ thực hiện build các microservices được viết bằng Java thành docker image rồi upload lên ECR

Bài viết này tập trung vào phần CD (Spinnaker) 


Provisioning Spinnaker 

Spinnaker là công cụ như thế nào, độc giả có thể tìm hiểu ở bài viết Vọc banh xác với Spinnaker

Spinnaker sử dụng kiến trúc microservices với nhiều services khác nhau 

Các kĩ sư của MTP provision spinnaker này lên EKS Service K8S của AWS

Trước tiên 1 EKS cluster sẽ được launch bằng IaC (terraform) bao gồm VPC , EKS cluster, Node Group, S3 bucket… 

Continuous Delivery using Spinnaker on Amazon EKS | AWS Open Source Blog

Source code viết bằng terraform, khi cần provision cluster chỉ cần chạy terraform init/plan/apply là K8S được launch lên trong 1 nốt nhạc

Do được launch trong 1 EKS cluster, nên kĩ sư MTP build 1 Ingress Controller, một dạng load balancing của K8s 

Nginx Ingress Controller là một ứng dụng chạy trong một cluster và sử dụng cấu hình LoadBalancer HTTP theo tài nguyên Ingress. Loadbalancer này có thể là chạy bằng phần mềm trong cluster, Loadbalancer phần cứng hoặc là Loadbalancer dịch vụ cloud bên ngoài

ingress nginx controller

Ingress Controller này được deploy sử dụng công cụ Helm, ingress controller được define dưới dạng helm-chart

Sau khi deploy thành công 

kubectl get svc -n ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-ingress LoadBalancer 162.20.82.39 a59b780dsd2142ff9fdf22cfdf3626-165433227.us-east-2.elb.amazonaws.com 80:32357/TCP,443:30180/TCP 23d

Tạo một record DNS CNAME trên route53 để point vào LB trên để user có thể truy cập vào spinnaker qua domain kiểu như traxanh-spinnaker.mtp.com

helm repo add stable https://kubernetes-charts.storage.googleapis.com/
helm install spinnaker stable/spinnaker [-f values.yaml]

Tương tự, kĩ sư MTP deploy spinnaker lên EKS cluster trên bằng công cụ helm chart

Sau khi deploy thành công, các service của Spinnaker được deploy dưới dạng k8s pod running như ở dưới

Khi được launch lên, mặc định các spinnaker services sử dụng self-signed SSL để communication với nhau. Do đó để đảm bảo bảo mật cần phải enable SSL và configure các service này sử dụng cert SSL riêng

Để config spinnaker, kĩ sư MTP sử dụng công cụ Halyard

Access vào halyard spinnaker, toàn bộ thông tin configuration của spinnaker được lưu ở thư mục .hal 

enable SSL các file yaml nằm trong thư mục này  

ssl:
enabled: true
enabledProtocols:
- TLSv1.2

– TLSv1.2

KeyStore và truststore 

keyStore: /pkcs12/keystore.p12
keyStorePassword: xxxx
keyStoreType: PKCS12
trustStore: /etc/ssl/certs/java/cacerts

keyStore được generate từ key và cert của công ty

Tiếp theo cần configure để Spinnaker có thể làm việc được với Jenkins, muốn biết các kĩ sư MTP làm thế nào đón đọc phần sau

Đăng nhận xét

0 Nhận xét