Trên môi trường Local

1. Cài đặt QEMU và socket_vmnet

# Cài đặt qemu
brew install qemu

# Cài đặt socket_vmnet
brew install socket_vmnet
brew tap homebrew/services
HOMEBREW=$(which brew) && sudo  services start socket_vmnet

2. Thiết lập minikube

Cài đặt qua Homebrew:

brew install minikube

Khởi chạy k8s trên local với driver QEMU:

minikube start --driver=qemu --network=socket_vmnet --alsologtostderr
⚠️ Lưu ý: Việc sử dụng driver qemu (có hoặc không có socket_vmnet) có thể gây lỗi khi cài đặt add-on ingress-controller. Tuy nhiên, khởi chạy minikube với driver docker thì không gặp vấn đề này. Hiện tại vẫn chưa có cách khắc phục cụ thể cho lỗi: ...failed to register layer: lsetxattr security.capability....

Khởi chạy k8s trên local với driver Docker:

minikube start --driver=docker --alsologtostderr

3. Thêm Image vào minikube

Sau khi build xong docker image của ứng dụng, hãy chạy lệnh dưới đây để đẩy image vào môi trường minikube:
docker save sample-app | (eval $(minikube docker-env) && docker load)

4. Triển khai Deployment

Mẫu file: sample-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-app
spec:
  selector:
    matchLabels:
      app: sample-app
  replicas: 2
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: sample-app
          image: sample-app:latest
          imagePullPolicy: Never # Quan trọng: để k8s dùng image local vừa load
          ports:
            - containerPort: 20080
              protocol: TCP
Cách thực hiện:
kubectl apply -f [đường-dẫn-file/sample-deployment.yml]
Kết quả trả về sẽ có dòng: deployment.apps/sample-app created.

Kiểm tra trạng thái các Pod:

# Xem trạng thái pod
kubectl get pods -w -n default

# Xem log của pod
kubectl logs --selector app=sample-app -n default

5. Triển khai Service

Mẫu file: sample-service.yml
apiVersion: v1
kind: Service
metadata:
  name: sample-app
spec:
  selector:
    app: sample-app
  ports:
    - name: webview
      appProtocol: http
      protocol: TCP
      port: 20080
      targetPort: 20080
    - name: weview-health
      protocol: TCP
      port: 20081
      targetPort: 20081

Cách thực hiện:

kubectl apply -f [đường-dẫn-file/sample-service.yml]

6. Cấu hình Ingress Controller

Kích hoạt Ingress trên minikube:

minikube addons enable ingress

Kiểm tra trạng thái Ingress Controller:

kubectl get pods -w -n ingress-nginx

Triển khai cấu hình Ingress của bạn:

Mẫu file: sample-ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /sample/view/
            pathType: Prefix
            backend:
              service:
                name: sample-app
                port:
                  number: 20080

Cách thực hiện:

kubectl apply -f [đường-dẫn-file/sample-ingress.yml]

7. Truy cập vào NGINX của Ingress Controller

Vì minikube sử dụng mạng NAT và host-only, bạn không thể kết nối trực tiếp từ máy thật (host) đến Ingress trên minikube. Chúng ta cần dùng Port-forwarding hoặc Tunneling.

Cách 1: Port-forwarding

kubectl port-forward [tên-pod-ingress-controller] [port-máy-host]:80

Cách 2: Tunneling (Khuyên dùng cho minikube)

minikube tunnel

Kiểm tra kết nối:

Nếu dùng Tunnel:
curl -v localhost:80/[đường-dẫn-api]
Nếu dùng Port-forward:
curl -v localhost:[port-máy-host]/[đường-dẫn-api]

8. Xử lý sự cố (Troubleshooting)

Nếu gặp lỗi khi khởi động minikube, hãy dừng tiến trình và chạy các lệnh dọn dẹp sau:
minikube delete --all --purge
docker system prune -a

Các lệnh hữu ích khác

  • Kết nối môi trường Docker của minikube: eval $(minikube -p minikube docker-env)
  • Xóa toàn bộ Pod: kubectl delete $(kubectl get po -o=name)
  • Thiết lập Alias (Bí danh): Thêm vào file .zshrc hoặc .bashrc:
alias mkube="minikube"
alias kubec="kubectl"
alias mkubec="minikube kubectl"
Nguồn bài viết ryukato.github.io