Giới thiệu
GitOps là một thuật ngữ được nhắc tới khá nhiều trong những năm gần đây, một công cụ GitOps phổ biến là ArgoCD. ArgoCD giúp ta triển khai mô hình GitOps lên trên Kuberntes. Tuy nhiên Cloud Native không phải chỉ có Kubernetes, còn nhiều môi trường khác như Cloud AWS, GCP, Azure. Trong bài này chúng ta sẽ tìm hiểu một công cụ giúp ta triển khai mô hình GitOps lên trên nhiều môi trường khác nhau là PipeCD. Ta sẽ làm ví dụ về PipeCD + Terraform và AWS.
GitOps
Giải thích đơn giản về GitOps. Hãy hình dung về trường hợp phổ biến sau. Ta có một hệ thống và mọi thứ đều đang hoạt động tốt. Cấp trên và mọi người đều vui vẻ. Bỗng nhưng một ngày hệ thống ta không chạy nữa. Cấp trên bực bội chửi nguyên team và yêu cầu tìm ra nguyên nhân.
Sau khi mất ngủ mấy ngày mấy đêm thì bạn phát hiện được lỗi là do ông nào đó sửa lại cấu hình Database làm ứng dụng hiện tại không kết nối với Database được. Ta sửa lỗi và hỏi lại là ông nào làm thì chả ai nhận cả. Đây là câu chuyện rất quen thuộc và xảy ra hằng ngày.
GitOps ra đời để giúp ta giảm thiểu vấn đề này. Với GitOps thì hệ thống ta có hai phần:
- Trạng thái hiện tại
- Trạng thái ta mong muốn
Với trạng thái ta mong muốn được định nghĩa bằng những tệp tin khai báo cấu hình của hệ thống. Và Git là nơi ta lưu trữ những tệp tin này. Và GitOps là quá trình đồng bộ trạng thái hệ thống hiện tại giống với trạng thái ta mong muốn được lưu trữ trên Git.
Bây giờ nếu có bất kì thay đổi nào tới hệ thống thì đều được thực hiện thông qua Git. Nếu bất kì ai muốn thay đổi cấu hình đều phải sửa code và tạo Pull Request vào Git. Ta hoàn toàn kiểm soát được trạng thái hệ thống mà ta mong muốn và biết được ai là người đã thay đổi.
Với GitOps thì nó không yêu cầu phải xài một công cụ cụ thể nào hết, mà chỉ cần các công cụ đáp ứng được tính năng sau:
- Kết nối được với Git để theo dõi trạng thái mong muốn được lưu trữ trong Git
- Phát hiện được khác biệt giữa trạng thái hiện tại và trạng thái mong muốn
- Thực hiện đồng bộ giữ trạng thái hiện tại giống với trạng thái mong muốn
Trong bài này chúng ta sẽ sử dụng Terraform và PipeCD để triển khai mô hình GitOps lên trên AWS.
Terraform
Ta sử dụng Terraform để khai báo hạ tầng trên AWS. Ta làm một ví dụ đơn giản là khai báo cấu hình EC2 bằng code Terraform và lưu trữ vào Github. Sau đó dùng PipeCD kết nối với Github và thực hiện đồng bộ cấu hình EC2 lưu trong Git lên trên hạ tầng AWS thực tế.
Các bạn truy cập Github và tạo repo mới của mình với code clone từ repo sau pipecd. Ta cần chuẩn bị Terraform Backend để làm được bài này. Di chuyển vào thư mục backend
và chạy câu lệnh sau:
terraform init && terraform apply -auto-approve
Apply complete! Resources: 11 added, 0 changed, 0 destroyed.
Outputs:
config = {
"bucket" = "pipecd-s3-backend"
"dynamodb_table" = "pipecd-s3-backend"
"region" = "ap-southeast-1"
"role_arn" = "arn:aws:iam::111937018111:role/PipecdS3BackendRole"
}
Code mà ta sử dụng để thực hiện GitOps cho bài này nằm ở thư mục terraform
. Sao chép kết quả trên và cập nhật các giá trị bucket
, dynamodb_table
, role_arn
trong tệp tin main.tf
:
terraform {
backend "s3" {
bucket = ""
key = "pipecd"
region = "ap-southeast-1"
encrypt = true
role_arn = ""
dynamodb_table = ""
shared_credentials_files = ["/etc/piped-secret/credentials"]
}
}
provider "aws" {
region = "ap-southeast-1"
shared_credentials_files = ["/etc/piped-secret/credentials"]
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
owners = ["099720109477"] # Canonical Ubuntu AWS account id
}
resource "aws_instance" "ubuntu" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
tags = {
Name = "Hello PipeCD"
}
}
Tiếp theo ta tiến hành cài PipeCD.
PipeCD
PipeCD gồm hai thành phần: Control Plane và Piped.
Cài Control Plane
PipeCD Control Plane là một thành phần chính trong hệ thống của PipeCD, nó sẽ quản lý toàn bộ Piped (agent để chạy quá trình đồng bộ). Ở trường hợp cơ bản, bạn chỉ cần cài đặt 1 Control Plane duy nhất cho việc quản lý các Piped. Trong bài này ta sẽ dùng Helm để cài PipeCD Control Plane lên trên Kubernetes Cluster. Tạo tệp tin piped-values.yaml
:
config:
data: |
apiVersion: "pipecd.dev/v1beta1"
kind: ControlPlane
spec:
datastore:
type: MYSQL
config:
url: root:test@tcp(pipecd-mysql:3306)
database: quickstart
filestore:
type: MINIO
config:
endpoint: http://pipecd-minio:9000
bucket: quickstart
accessKeyFile: /etc/pipecd-secret/minio-access-key
secretKeyFile: /etc/pipecd-secret/minio-secret-key
autoCreateBucket: true
projects:
- id: quickstart
staticAdmin:
username: hello-pipecd
passwordHash: "$2a$10$ye96mUqUqTnjUqgwQJbJzel/LJibRhUnmzyypACkvrTSnQpVFZ7qK" # bcrypt value of "hello-pipecd"
mysql:
database: quickstart
image: mysql
rootPassword: test
quickstart:
enabled: true
secret:
encryptionKey:
data: encryption-key-just-used-for-quickstart
minioAccessKey:
data: quickstart-access-key
minioSecretKey:
data: quickstart-secret-key
Chạy helm:
helm upgrade -i pipecd oci://ghcr.io/pipe-cd/chart/pipecd --version v0.44.2 --create-namespace --namespace=pipecd -f piped-values.yaml
NAME: pipecd
LAST DEPLOYED: Tue Aug 15 16:27:27 2023
NAMESPACE: pipecd
STATUS: deployed
REVISION: 1
TEST SUITE: None
Sau khi cài xong, các bạn chạy câu lệnh sau để mở PipeCD Console:
kubectl -n pipecd port-forward svc/pipecd 8080
Truy cập địa chỉ localhost:8080
trên trình duyệt và đăng nhập với username và password là hello-pipecd
.
Khi vào màn hình PipeCD Console ta chọn Settings > Piped
nhấn +ADD
để tạo KEY. Nhập vào tên và mô tả của Piped.
Và nhấn SAVE
.
Nhớ sao chép Piped Id
và Piped Key
lại.
Kết nối với Github
Tiếp theo ta tạo Piped để kết nối tới Github. Tạo tệp tin piped-values.yaml
:
config:
data: |
apiVersion: pipecd.dev/v1beta1
kind: Piped
spec:
projectID: quickstart
pipedID: <pipe-id>
pipedKeyFile: /etc/piped-secret/piped-key
syncInterval: 1m
apiAddress: pipecd:8080
repositories:
- repoId: pipecd
remote: https://github.com/hoalongnatsu/pipecd.git
branch: main
platformProviders:
- name: terraform
type: TERRAFORM
args:
insecure: true
secret:
data:
piped-key: <pipe-key>
Cập nhật <pipe-id>
và <pipe-key>
với giá trị ta tạo ở trên. Chạy helm:
helm upgrade -i dev oci://ghcr.io/pipe-cd/chart/piped --version=v0.44.2 --namespace=pipecd -f piped-values.yaml
NAME: dev
LAST DEPLOYED: Wed Aug 16 11:11:21 2023
NAMESPACE: pipecd
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Now, the installed piped is connecting to .
Sau khi kết nối tới Github. Việc tiếp theo ta cần làm là chỉ định thư mục chứa cấu hình Terraform để PipeCD thực hiện đồng bộ nó lên trên AWS. Để làm được việc này ta sẽ tạo Application.
Application
Ở trên PipeCD Console, ta di chuyển tới mục Application và bấm +ADD
. Chọn mục ADD MANUALLY
.
Ta điền vào như sau:
Sau đó bấm SAVE
và PipeCD sẽ tiến hành đồng bộ. Bấm qua mục Deployments
ta sẽ thấy quá trình đồng bộ đang được thực thi.
Tuy nhiên sau khi ta đợi một lúc nó lại báo lỗi:
Chỉ định AWS Credentials
Lý do là ta chưa cấu hình AWS Credentials để PipeCD biết được sẽ triển khai lên trên AWS Account nào. Để cấu hình Credentials các bạn sửa lại tệp tin piped-values.yaml
ở phần secret
như sau:
...
secret:
data:
piped-key: t14hagknd38cjkdzrq5c9fdgma1h2cdsrsn72kk50jpzr74xcc
credentials: |
[default]
aws_access_key_id=<access_key>
aws_secret_access_key=<secret_key>
Cập nhật <access_key>
và <secret_key>
với giá trị của bạn. Sau đó chạy lại câu lệnh helm
:
helm upgrade -i dev oci://ghcr.io/pipe-cd/chart/piped --version=v0.44.2 --namespace=pipecd -f piped-values.yaml
Release "dev" has been upgraded. Happy Helming!
NAME: dev
LAST DEPLOYED: Wed Aug 16 11:15:12 2023
NAMESPACE: pipecd
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
Now, the installed piped is connecting to .
Lưu ý: đây chỉ là cách dùng cho mục đích demo, nếu làm ở dự án thực tế các bạn nên sử dụng Secret management.
Quay lại mục Application, nhấn vào Application dev
và nhấn SYNC
:
Bấm qua mục Deployments, ta thấy PipeCD đã chạy đồng bộ thành công.
Kiểm tra AWS Console xem EC2 vừa được tạo.
Nếu bạn sửa cấu hình của EC2 trên Console, ví dụ như sửa Tags thành Hello.
PipeCD sẽ tự động phát hiện được và thông báo cho ta.
Nếu ta bấm SYNC
thì PipeCD sẽ tiến hành đồng bộ cấu hình EC2 để giống trên Git. Bước này ta có thể cấu hình cho nó tự động được bằng cách sử dụng thuộc tính DeploymentTrigger. Nhưng với Terraform thì ta không nên để quá trình này tự động vì khá nguy hiểm.
Nhớ xóa toàn bộ resource đi sau khi thực hành xong nhé.
Kết luận
Vậy là ta đã tìm hiểu xong cách triển khai mô hình GitOps trên AWS với PipeCD. Dự án vẫn đang trong quá trình phát triển và bổ sung thêm. Các bạn hãy sử dụng thử và gửi nhận xét nhé.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?