1. Cài Harbor để lưu image khi deploy lên k8s
Tạo 1 máy ảo và cài Harbor lên đấy. Làm theo hướng dẫn trong URL sau.
https://goharbor.io/docs/2.9.0/install-config/
Sau khi cài xong vào Cloudflare tạo một public hostname trỏ vào ip tĩnh của máy trên.

Giờ vào domain trên với user admin và password trong harbor.yaml lúc cài.
Vào tạo 1 dự án riêng tư để đẩy hình ảnh.

Tiếp theo vào dashboard của Harvester, Advanced > Settings > containerd-registry > Edit Setting, nhập ip hoặc domain khi cài Harbor, thêm user password vào để sau này deploy trên k8s, không cần thêm secret để k8s có thể pull image về


2. Cài đặt Github Runner
Từ trang chủ repository hoặc Organization, truy cập Settings > Actions > Runners > New runner > New self-hosted runner
Chọn hệ điều hành sẽ cài đặt runner trên đấy.

SSH vào máy ảo và làm theo hướng dẫn.

Trên máy ảo, tạo một systemd để runner tự động chạy mỗi khi khởi động máy ảo.
sudo vi /etc/systemd/system/runner.service
[Unit]
Description=Github Runner
[Service]
ExecStart=/home/pxd/actions-runner/run.sh
Restart=on-failure
User=pxd
[Install]
WantedBy=multi-user.target
# Thoát và lưu lại
# Cập nhật dịch vụ
sudo systemctl daemon-reload
# Chạy dịch vụ
sudo systemctl start runner.service
# Kiểm tra trạng thái dịch vụ
sudo systemctl status runner.service
# Kích hoạt dịch vụ để tự động chạy lại khi khởi động máy ảo
sudo systemctl enable runner.service
Con runner này dùng để deploy lên k8s trên Harvester nên cần cài thêm docker và kubectl.
Đăng nhập docker với tài khoản admin hoặc tạo một tài khoản trên Harbor.
docker login harbor.pxd.asia
Vào k8s lấy file kubeconfig, lưu vào ~/.kube/config trên máy runner, nhớ đổi lại ip private của máy chạy Harvester trong file config.
vi ~/.kube/config
# thử lệnh kubectl
kubectl get node
3. Deploy dự án từ Github lên Harvester
Đầu tiên cần build image từ dự án Github:
- Git clone dự án về máy runner
- Viết Dockerfile
- Build và push image
# cd vài thư mục dự án
# harbor.pxd.asia (domain config trong cloudflare), pxd (tên project tạo trong harbor), test:latest (tên image và tag)
docker build -t harbor.pxd.asia/pxd/test:latest .
# Push image lên registry
docker push harbor.pxd.asia/pxd/test:latest
Tiếp theo cần viết file deployment.yaml, service.yaml, ingress.yaml để deploy dự án lên k8s. Ví dụ:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
namespace: test
labels:
app: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: test
image: harbor.pxd.asia/pxd/test:latest
ports:
- containerPort: 80
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: test
namespace: test
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
app: test
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test
namespace: test
labels:
app: test
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: test
port:
number: 80
host: test.pxd.asia
# deploy lên k8s
kubectl apply -f deployment.yaml service.yaml ingress.yaml -n test
4. Viết Github Action để tự động deploy trên Github
Tìm hiểu về Github Action:
Cd vào thư mục chứa code dự án, tạo file .yml trong đương dẫn .github/workflows.
name: Deploy k8s
# điều kiện để chạy action, như này là khi có push ở nhánh master
on:
push:
branches: master
jobs:
test: #tên công việc
runs-on: pxd #tên runner để chọn runner chạy
steps:
# cd vào thư mục chứa code hiện tại
- name: Checkout
uses: actions/checkout@v3
# Lệnh build, push image và that đổi image mới trên k8s
- run: |
time=$(date +"%s")
docker build -t harbor.pxd.asia/test:$time .
docker push harbor.pxd.asia/test:$time
kubectl set image deployment/test test=harbor.pxd.asia/test:$time -n test
Push code mới lên Github và Github Action sẽ chạy để tự động deploy lên k8s.
5. Kết luận
Như vậy, trong bài này, bạn đã có thể cài Harbor registry để lưu image, Github Runner để deploy lên k8s.