Trong bài này này, mình sẽ hướng dẫn bạn cách sử dụng Kustomize với Argo CD để triển khai ứng dụng từ kho lưu trữ Github.
Đầu tiên bạn hãy tạo 1 kho chứa như hình dưới. Chúng ta sẽ làm việc với thư mục kustomize-prometheus và file application-prometheus.yaml nên các bạn đừng quan tâm đến thư mục và file khác nhé.
Trong thư mục kustomize-prometheus chúng ta có các file với tên như dưới. Ở thư mục này các bạn đừng quan tâm đến file prometheus.sh nhé vì nó chỉ là file note của mình.
Dưới đây là nội dung chi tiết các file.
cat > ./kustomization.yaml << OEF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namePrefix: kustomize-
resources:
- prometheus-deployment.yaml
- prometheus-svc.yaml
- prometheus-ingress.yaml
OEF
Chỗ namePrefix với kustomize- sẽ là tên của file tính từ dấu gạch ngang trở về trước, ví dụ kustomize- sẽ map với kustomize-<tên phía sau dấu gạch ngang>
Chỗ resources sẽ là danh sách các file name được Kustomize thực thi.
cat > ./prometheus-deployment.yaml << OEF
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
spec:
selector:
matchLabels:
run: prometheus
replicas: 5
template:
metadata:
labels:
run: prometheus
spec:
containers:
- name: prometheus
image: prom/prometheus
ports:
- containerPort: 9090
OEF
Chúng ta sẽ triển khai ứng dụng Prometheus.
cat > ./prometheus-ingress.yaml << OEF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: prometheus.hoanghd.fun
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: prometheus
port:
number: 80
OEF
Sử dụng ingress với domain là prometheus.hoanghd.fun
cat > ./prometheus-svc.yaml << OEF
apiVersion: v1
kind: Service
metadata:
name: prometheus
labels:
run: prometheus
spec:
ports:
- name: prometheus
port: 80
targetPort: 9090
type: LoadBalancer
selector:
run: prometheus
OEF
Service sử dụng type LoadBalancer (tùy bạn nhé), map port 80.
cat > ./application-prometheus.yaml << OEF
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: prometheus-application
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/hoanghd164/argocd.git
targetRevision: HEAD
path: kustomize-prometheus
destination:
server: https://kubernetes.default.svc
namespace: monitor
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
selfHeal: true
prune: true
OEF
- Metadata Namespace phải là argocd
- Source repoURL: là kho lưu trữ file manifest
- Source Path: là thư mục chứa manifest
- Source targetRevision: HEAD là thư mục gốc của Source Path
- Destination Server: là cụm k8s, nơi mà mình cần triển khai ứng dụng lên đó
- Destination namespace: là namespace ứng dụng
Sau khi tạo xong file application-prometheus.yaml, chúng ta bắt đầu triển khai ứng dụng bằng command dưới.
kubectl apply -f ./application-prometheus.yaml
Triển khai xong, verify lại các thành phần của ứng dụng.
Hình ảnh cho ta thấy ứng ựng đã được triển khai xong, nhưng vẫn còn tiến trình progressing. Lý do là trong type của service mình đang để LoadBalancer nhưng service chưa được cấp ip address. Ta thấy chỗ external-ip đang pending.
root@loadbalancer3:~# kubectl get svc -n monitor
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kustomize-prometheus LoadBalancer 10.97.220.73 pending 80:30557/TCP 8m21s
Note: Do mình đang sử dụng ingress nên tiến trình progressing trên không ảnh hưởng gì đến ứng dụng nhé hoặc chúng ta có thể fix theo cách dưới đây.
Tạo ta 1 file cm.yaml như dưới, với 192.168.13.230/28 là dải là ip sẽ được cấp cho dịch vụ.
cat > ./cm.yaml << OEF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: production
namespace: metallb-system
spec:
addresses:
- 192.168.13.230/28
OEF
Chúng ta triển khai nó
kubectl apply -f ./cm.yaml
Xác minh lại config map đã được áp dụng thành công.
root@loadbalancer3:~# kubectl get svc -n monitor
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kustomize-prometheus LoadBalancer 10.97.220.73 192.168.13.224 80:30557/TCP 23m
Như vậy đã có 1 ip address đã được cấp cho service này.
Trạng thái progressing không còn nữa, quá trình deploy app thành công.
Truy cập theo domain đã khai báo ở trên ta có kết quả như hình trên.
kubectl delete -f ./application-prometheus.yaml
Để xóa app chúng ta có thể xóa namespace để nó tự động xóa hết các thành phần liên quan đến app nhé.