Cho đến nay, trong phần về Cơ sở hạ tầng mã nguồn, chúng ta đã xem xét triển khai máy ảo, mặc dù chúng ta đã sử dụng VirtualBox, nhưng nguyên tắc là giống nhau, chúng ta xác định bằng mã nguồn những gì chúng ta muốn máy ảo của mình trông như thế nào và sau đó triển khai. Tương tự cho các container Docker và trong buổi học này, chúng ta sẽ xem cách Terraform có thể được sử dụng để tương tác với các tài nguyên được hỗ trợ bởi Kubernetes.
Tôi đã sử dụng Terraform để triển khai các cụm Kubernetes cho mục đích trình diễn trên ba nhà cung cấp đám mây chính và bạn có thể tìm thấy kho lưu trữ tại đây [tf_k8deploy](https://github.com/MichaelCade/tf_k8deploy)
Tuy nhiên, bạn cũng có thể sử dụng Terraform để tương tác với các đối tượng bên trong cụm Kubernetes, điều này có thể được thực hiện bằng cách sử dụng [Kubernetes provider](https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs) hoặc [Helm provider](https://registry.terraform.io/providers/hashicorp/helm/latest) để quản lý việc triển kahi trong kubernetes
Bây giờ chúng ta có thể sử dụng `kubectl` như đã được hiển thị trong các phần trước. Tuy nhiên, việc sử dụng Terraform trong môi trường Kubernetes có một số lợi ích.
- Quy trình làm việc thống nhất - nếu bạn đã sử dụng Terraform để triển khai các cụm của mình, bạn có thể sử dụng cùng quy trình làm việc và công cụ để triển khai trong các cụm Kubernetes của bạn.
- Quản lý vòng đời - Terraform không chỉ là một công cụ cung cấp, nó còn cho phép thay đổi, cập nhật và xóa bỏ.
Tương tự như demo chúng ta đã tạo trong buổi học trước, bây giờ chúng ta có thể triển khai nginx vào cụm Kubernetes của chúng ta. Trong mục này, tôi sẽ sử dụng minikube để làm ví dụ. Chúng ta tạo file Kubernetes.tf và bạn có thể tìm thấy nó tại [đây](2022/Days/IaC/Kubernetes/Kubernetes.tf)
Trong tệp đó, chúng ta sẽ xác định nhà cung cấp Kubernetes, chúng ta sẽ trỏ đến tệp kubeconfig của chúng ta, tạo một namespace có tên là nginx, và sau đó chúng ta sẽ tạo một deployment chứa 2 bản sao và cuối cùng là service.
Bây giờ, vì chúng ta đang sử dụng minikube như bạn đã thấy trong phần trước, điều này có một số hạn chế khi chúng ta thử nghiệm với mạng docker cho ingress. Nhưng nếu chúng ta chỉ đơn giản sử dụng lệnh `kubectl port-forward -n nginx svc/nginx 30201:80` và mở trình duyệt đến `http://localhost:30201/`, chúng ta sẽ thấy trang NGINX của chúng ta.
Nếu bạn muốn thử các bài thực hành chi tiết hơn với Terraform và Kubernetes, thì trang web [HashiCorp Learn site](https://learn.hashicorp.com/tutorials/terraform/kubernetes-provider) là một nguồn tuyệt vời để thực hiện.
Nếu chúng ta muốn lấy bất kỳ bài thực hành nào đã được thực hiện nhưng bây giờ muốn có môi trường sản xuất, staging và phát triển cụ thể trông giống nhau và tận dụng mã nguồn này, có hai phương pháp để làm được điều này với Terraform:
-`terraform workspaces`- nhiều phần được đặt tên trong một backend duy nhất
- cấu trúc file - Cấu trúc thư mục cung cấp phân tách, các module cung cấp tái sử dụng.
Tuy nhiên, mỗi phương pháp trên đều có ưu điểm và nhược điểm riêng.
### Terraform workspaces
Ưu điểm
- Dễ bắt đầu: Sử dụng Terraform workspaces giúp bắt đầu một cách dễ dàng, vì bạn có thể tạo các workspace riêng biệt một cách đơn giản và nhanh chóng.
- Tiện lợi khi có `terraform.workspace`
- Giảm thiểu sự trùng lặp code
Nhược điểm
- Dễ mắc lỗi do con người
- Lưu trạng thái trong cùng backend
- Mã nguồn không hiển thị rõ ràng các cấu hình triển khai
### File Structure
Ưu điểm
- Cô lập, tách riêng backend state
- Cải thiện an ninh bảo mật
- Giảm thiểu lỗi cá nhân
- Mã nguồn (code) thể hiện chính xác so với trạng thái triển khai
Nhược điểm
- Phải chạy nhiều lần `terraform apply` để triển khai cho nhiều môi trường
- Gia tăng sự trùng lặp,. nhưng có thể giảm thiểu khi sử dụng module
## Tài liệu tham khảo
- [What is Infrastructure as Code? Difference of Infrastructure as Code Tools](https://www.youtube.com/watch?v=POPP2WTJ8es)