Sunday, January 19, 2025

[Kubernetes ] MetalLB trong Kubernetes

-

I. Tổng quan

MetalLB là một giải pháp cân bằng tải được thiết kế cho Kubernetes, MetalLB cho phép bạn triển khai Dịch vụ Kubernetes loại LoadBalancer. Sau đó, MetalLB tự động định tuyến lưu lượng truy cập cho bạn, MetalLB sử dụng một nhóm địa chỉ IP mà bạn xác định.

Mặc dù MetalLB không phải là giải pháp quản lý lưu lượng duy nhất cho Kubernetes (bạn cũng có thể sử dụng một bộ cân bằng tải như Porter hoặc một kỹ thuật như NodePort), MetalLB cung cấp một số tính năng nổi bật. 

Những ưu điểm của Metallb là:

Dễ dàng thiết lập : Bạn chỉ cần tạo một Dịch vụ cân bằng tải và gán một nhóm địa chỉ IP cho MetalLB.

Dễ mở rộng : MetalLB tự động hóa quản lý lưu lượng và không giống như NodePort và ExternalIP, nó yêu cầu những thay đổi tối thiểu đối với cấu hình của bạn. Do đó, nó có thể mở rộng quy mô để hỗ trợ ánh xạ cho hàng chục hoặc thậm chí hàng trăm ứng dụng, nếu bạn cần.

Phù hợp với cân bằng tải trên nền tảng cloud : Vì MetalLB sử dụng cấu hình Dịch vụ LoadBalancer chứ không phải các phương pháp định tuyến chuyên biệt như NodePort. Nếu bạn đã quen thuộc với tính năng cân bằng tải Kubernetes trong AWS, Azure hoặc GCP, thì có thể bạn sẽ thấy MetalLB dễ làm việc.

Vì những lý do này, MetalLB là giải pháp hiển nhiên cho hầu hết các nhu cầu định tuyến và cân bằng tải ngày nay. Các phương thức cũ hơn, như NodePort và ExternalIP, vẫn được hỗ trợ đầy đủ trong Kubernetes, ít nhất là hiện tại. Nhưng MetalLB là lựa chọn đơn giản và phức tạp hơn cho hầu hết các trường hợp sử dụng.

II. Triển khai

Sự đơn giản của MetalLB bắt đầu với quá trình cài đặt. Để cài đặt MetalLB trong hầu hết các cụm, trước tiên hãy bật chế độ ARP nghiêm ngặt bằng cách chạy:

$ kubectl edit configmap -n kube-system kube-proxy

Và đảm bảo giá trị nghiêm ngặt được đặt thành true:

    ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: true
      syncPeriod: 0s
      tcpFinTimeout: 0s
      tcpTimeout: 0s
      udpTimeout: 0s

Hoặc bạn có thể tự động hoá thay đổi bằng 2 lệnh dưới

# see what changes would be made, returns nonzero returncode if different
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl diff -f - -n kube-system

# actually apply the changes, returns nonzero returncode on errors only
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

Sau khi thay đổi xong config, ta triển khai Metallb bằng link chính chủ, phiên bản cao nhất hiện tại là 0.13.5.

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.5/config/manifests/metallb-native.yaml
namespace/metallb-system created
customresourcedefinition.apiextensions.k8s.io/addresspools.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bfdprofiles.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgpadvertisements.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgppeers.metallb.io created
customresourcedefinition.apiextensions.k8s.io/communities.metallb.io created
customresourcedefinition.apiextensions.k8s.io/ipaddresspools.metallb.io created
customresourcedefinition.apiextensions.k8s.io/l2advertisements.metallb.io created
serviceaccount/controller created
serviceaccount/speaker created
role.rbac.authorization.k8s.io/controller created
role.rbac.authorization.k8s.io/pod-lister created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/controller created
rolebinding.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
secret/webhook-server-cert created
service/webhook-service created
deployment.apps/controller created
daemonset.apps/speaker created
validatingwebhookconfiguration.admissionregistration.k8s.io/metallb-webhook-configuration created

Ngoài ra, bạn có thể cài đặt MetalLB với Helm, nếu bạn thích:

$ helm repo add metallb https://metallb.github.io/metallb
"metallb" has been added to your repositories

Xác minh repo đã thêm thành công

$ helm repo ls
NAME    URL                              
metallb https://metallb.github.io/metallb

Triển khai Metallb bằng Helm

$ helm install metallb metallb/metallb
NAME: metallb
LAST DEPLOYED: Fri Oct  7 04:15:43 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
MetalLB is now running in the cluster.

Now you can configure it via its CRs. Please refer to the metallb official docs
on how to use the CRs

Cách dễ nhất để sử dụng MetalLB là cấu hình mạng ở layer 2, bạn chỉ cần gán một dải địa chỉ IP cho MetalLB. Để xác định nhóm địa chỉ, hãy mở ConfigMap với thông tin như dưới:

cat << OEF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.13.235-192.168.13.237
OEF
cat << OEF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool
OEF

Bây giờ ta tạo 1 app để kiểm tra

cat > ./prometheus_deployment.yaml << OEF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
spec:
  selector:
    matchLabels:
      app: monitor
  replicas: 1
  template:
    metadata:
      labels:
        app: monitor
    spec:
      containers:
        - name: prometheus
          image: prom/prometheus
          ports:
            - containerPort: 9090
          resources:
            limits:
              memory: "150M"
              cpu: "100m"
OEF

Triển khai app này

$ kubectl apply -f ./prometheus_deployment.yaml 
deployment.apps/prometheus created

Tạo service cho app, nhớ thay đổi spec.type thành LoadBalancer

cat > ./prometheus-svc.yaml << OEF
apiVersion: v1
kind: Service
metadata:
  name: prometheus-service
spec:
  selector:
     app: monitor
  type: LoadBalancer
  ports:
    - name: http
      port: 9090
      targetPort: 9090
OEF

Triển khai service này

$ kubectl apply -f ./prometheus-svc.yaml 
service/prometheus-service configured

Kiểm tra service vừa triển khai xong ta được kết quả như dưới, ở cột EXTERNAL-IP đã được Metallb gán 1 địa chỉ nằm trong dài 192.168.13.235-192.168.13.237.

$ kubectl get svc/prometheus-service
NAME                 TYPE           CLUSTER-IP   EXTERNAL-IP      PORT(S)          AGE
prometheus-service   LoadBalancer   10.99.29.6   192.168.13.235   9090:31816/TCP   84s

Hãy dùng trình duyệt truy cập vào url http://192.168.13.235:9090 ta có kết quả như hình

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories