Việc triển khai ứng dụng trên Kubernetes có nhiều cách khác nhau. Để đơn giản hoá trong việc triển khai hôm nay mình chia sẻ các bạn một tool Gitops đó là Argo CD.
Tóm tắt các bước trong bài lab này:
- Cài Argo CD trên K8S
- Một image python Flask App
- Cài đặt GitHub để chạy continuous integration (CI)
- Triển khai một ứng dụng Argo CD và đồng bộ trên K8S
Kubernetes CI/CD
1. Cài Argo CD trên K8S
Các bạn chuẩn bị một môi trường lab dùng minikube, kubernetes digital ocean, gke, eks, aks… Nếu chưa biết cách đăng kí thì xem lại video này của mình. Sau khi có cluster kubernetes rồi chúng ta bắt đầu thôi
1.1 Cài một cert-manager
Mục đích cài cert-manager là để tạo chứng chỉ ssl cho domain.
helm repo add jetstack https://charts.jetstack.io
helm repo update
kubectl create namespace cert-manager
kubectl get namespaces
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.9.1/cert-manager.crds.yaml
helm install my-release --namespace cert-manager --version v1.9.1 jetstack/cert-manager
2.2 Cài Nginx Ingress Controller
Nginx Ingress Controller để quản lí việc external IP loadbalacer ra bên ngoài
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx-ingress ingress-nginx/ingress-nginx --set controller.publishService.enabled=true
kubectl --namespace default get services -o wide -w nginx-ingress-ingress-nginx-controller
2.3 Cài Argo CD
Tạo một namspace argocd
kubectl create namespace argocd
Các bạn có thể cài bằng lệnh bên dưới hoặc bằng helm chart
- Bằng lệnh
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
- Bằng helm chart
Tạo file chart Chart.yaml
apiVersion: v2
name: argocd
version: 5.20.3
dependencies:
- name: argo-cd
version: 5.20.3
appVersion: v2.6.1
repository: https://argoproj.github.io/argo-helm
Tạo file value chart values.yaml
argo-cd:
crds:
# -- Install and upgrade CRDs
install: true
# -- Keep CRDs on chart uninstall
keep: true
controller:
replicas: 1
args:
# -- define the application controller `--app-resync`
appResyncPeriod: "30"
# -- define the application controller `--status-processors`
statusProcessors: "20"
# -- define the application controller `--operation-processors`
operationProcessors: "10"
# -- define the application controller `--self-heal-timeout-seconds`
selfHealTimeout: "3"
# -- define the application controller `--repo-server-timeout-seconds`
repoServerTimeoutSeconds: "60"
server:
extraArgs:
- --insecure
replicas: 1
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: letsencrypt-prod-argocd
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
hosts:
- argocd.vuihoctech.com
paths:
- /
tls:
- secretName: argocd5-tls-certificate
hosts:
- argocd.vuihoctech.com
configEnabled: true
config:
url: https://argocd.vuihoctech.com
exec.enabled: "true"
accounts.user: apiKey, login
repositories: |
- name: main-repo
type: git
url: https://gitlab.com/tonykien2012/agocd5-helm.git
usernameSecret:
name: git-creds
key: username
passwordSecret:
name: git-creds
key: password
# - name: acr-charts
# type: helm
# enableOci: true
# url: registry.gitlab.com/tonykien2012/app-demo-helmchart
# username: argocd-gitlab
# password: x5dtUqgitoBZQ75qicP5
rbacConfig:
policy.csv: |
p, role:dev, applications, sync, */*, allow
p, role:dev, applications, get, */*, allow
p, role:dev, certificates, get, *, allow
p, role:dev, clusters, get, *, allow
p, role:dev, repositories, get, *, allow
p, role:dev, projects, get, *, allow
p, role:dev, accounts, get, *, allow
p, role:dev, gpgkeys, get, */*, allow
g, user, role:dev
Chạy lệnh sau để cài đặt argo cd bằng helm chart. Lưu ý máy tính các bạn đã cài tool helm chart rồi nhé. Nếu chưa thì xem ở đây.
helm install argocd argocd -f argocd/values.yaml --namespace=argocd
Với cách bằng dòng lệnh các bạn phải forward ra ngoài để try cập bằng giao diện UI còn đối với cách bằng helm thì các bạn thêm domain rồi thì vào bằng domain
kubectl port-forward svc/argocd-server -n argocd 8080:443
Đăng nhập localhost:8080 hoặc https://argocd.domain.com với user là admin và lấy mật khẩu bằng câu lệnh sau
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
Đến đây các bạn hoàn thành việc cài xong Argo CD rồi đó.
2. Tạo một ứng dụng python Flask App đơn giản
Trước tiên ta tạo một app python đơn giản hello-k8s.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello k8s 3.0!"
if __name__ == "__main__":
app.run(host='0.0.0.0')
FROM python:3.8
LABEL maintainer="KienLe TV"
COPY . /app
WORKDIR /app
RUN pip install flask werkzeug
# command to run on container start
CMD [ "python", "hello-k8s.py" ]
docker build -t hello-k8s:1.0 .
docker run -p 5000:5000 -d hello-k8s:1.0
docker push tonykien2012/hello-k8s:1.0
3. Cài đặt GitHub để chạy continuous integration (CI)
name: hello-k8s - Package with Docker
# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the main branch
on:
push:
branches: [main]
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/[email protected]
- name: Set up QEMU
uses: docker/[email protected]
- name: Set up Docker Buildx
uses: docker/[email protected]
- name: Login to DockerHub
uses: docker/[email protected]
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker images
uses: docker/[email protected]
with:
context: ./project/.
file: ./project/Dockerfile
platforms: linux/amd64
push: true
tags: tonykien2012/hello-k8s:1.0
- DOCKERHUB_USERNAME — Docker Hub username
- DOCKERHUB_TOKEN — Docker Hub token

3. Triển khai một ứng dụng Argo CD và đồng bộ trên K8S
Bạn có thể tạo qua ứng dụng UI của Argo CD hoặc file yaml
Ở đây mình tạo một file hello-k8s-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: hello-k8s
namespace: argocd
spec:
destination:
namespace: default
server: https://kubernetes.default.svc
project: default
source:
path: argocd/hello-k8s-manifest
repoURL: https://github.com/kienle1819/K8s-CICD
targetRevision: HEAD
syncPolicy: {}
Ở đây các bạn khai báo:
- name: tên ứng dụng
- namespace
- path: đường dẫn chứa file deployment
- repoURL : repo code triển khai
Tiếp theo các bạn tạo các file để triển khai app trong đường dẫn argocd/hello-k8s-manifest:
File deployment hello-k8s-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: hello-k8s
name: hello-k8s
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: hello-k8s
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: hello-k8s
spec:
containers:
- image: kienle1819/hello-k8s:1.0
imagePullPolicy: Always
name: hello-k8s
resources:
requests:
cpu: 50m
memory: 256Mi
File service.yaml để tạo svc với deployment
apiVersion: v1
kind: Service
metadata:
name: hello-k8s
spec:
ports:
- port: 5000
targetPort: 5000
selector:
app: hello-k8s
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-k8s-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod-argocd"
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- hello-k8s.vuihoctech.com
secretName: hello-k8s-tls
rules:
- host: hello-k8s.vuihoctech.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-k8s
port:
number: 5000
Sau khi tạo xong các bạn chạy lệnh sau để deploy
kubectl apply -f hello-k8s-application.yaml
Bạn sẽ thấy app được tạo qua UI của Argo CD
Các bạn bấm sync để đổng bộ.
Bạn try cập vào domain để xem kết quả
Để việc triển khai các bạn thêm option sau và file hello-k8s-application.yaml
spec:
syncPolicy:
automated: {}
Sau đó các bạn apply lại.
kubectl apply -f hello-k8s-application.yaml
Như vậy chúng ta hoàn thành được việc triển khai một app thông qua Argo CD hoàn toàn tự động. Các bạn thử sửa một file nào đó trong repo và push lại sẽ thấy kết quả
Trong phần này có một lưu ý là các bạn thấy domain ở trên mình dùng ssl. Nó ở đâu ra vậy thì các bạn nhờ ở đầu mình có cài cert-manager thằng này nó giúp tạo cert và các bạn chạy thêm file bên dưới để tạo được ssl miễn phí letsencrypt-prod.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod-argocd
spec:
acme:
# Email address used for ACME registration
email: [email protected]
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Name of a secret used to store the ACME account private key
name: letsencrypt-prod-private-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- http01:
ingress:
class: nginx
Sau đó chạy lệnh sau để tạo
kubectl apply -f letsencrypt-prod.yaml
4. Tổng kết
Đến đây bài viết cũng dài rồi mình tái búi tại đây. Qua bài này các bạn biết được cách triển khai một ứng dụng trên Kubernetes thông qua một tool gitops là Argo CD thay vì các bạn chạy file yaml cơ bản như trước đây. Ở bài viết tiếp theo mình chia sẻ các bạn cách triển khai một ứng dụng trên Kubernetes dùng Helm chart.
Chúc các bạn thành công!
Tham khảo:
- Argo CD — https://argo-cd.readthedocs.io/en/stable/
- minikube — https://minikube.sigs.k8s.io/docs/start/
- GitHub — https://github.com/
- DockerHub — https://hub.docker.com/
- Helm Chart — https://helm.sh/