Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises

 OK, hôm nay rãnh rỗi nên ngồi chém gió về Kubernetes, trước đây có nói về cách cài đặt thì có bài Hướng dẫn cài Kubernetes V1.21 với container runtime Cri-O(Container Runtime Interface) bằng kubeadm . Giờ viết lại thì cái vèo nó đã lên tới v1.28 rồi, nhưng cách cài đặt thì chẳng có gì khác mấy đâu, quan trọng là tư duy logic là chính.

Bài này hoàn toàn dùng kubectl, nếu bạn muốn dùng giao diện Dashboard thì cũng có luôn là  Hướng dẫn cài Kubernetes Dashboard v2.0.0+0.g1f66b1c trên Kubernetes Centos8 .  Mà cũng chẳng quan trọng lắm đâu vì khi bạn đã ngồi đọc bài này thì có lẽ bạn đã 2 cái trên đã coi như biết qua. Đối với Kubernetes có lẽ mọi thứ nên bắt đầu từ căn bản lên và phải hiểu rõ các khái niệm bạn mới có thể làm được tốt nó vì nếu đọc sơ sơ làm chơi chơi bạn sẽ rơi những trường hợp dỡ khóc dỡ cười đấy "xxxxx".

Bài toán hôm nay đặt ra là bạn sử dụng Kubernetes  On-Premises, bạn phải làm mọi thứ với nó, ví dụ bạn có IP public, từ IP public đó bạn có thể trỏ một hoặc nhiều domain về chính nó và phân giải connect đến các host, các app tương ứng.

Để giải quyết bào toán này tôi sẽ dùng những gì :

1.Kubernetes, đương nhiên rồi và ở đây sẽ có 2 con VM, đang dùng ubuntu

-Master : 192.168.45.10 (ssh ) / 192.168.221.10 (giả lập lớp mạng thông với ISP)

-Worker01: 192.168.45.11 (ssh ) / 192.168.221.11(giả lập lớp mạng thông với ISP)

Đây là mô hình giả lập để sau khi cung cấp External IP có thể connect được trên host machine, bạn chỉ cần quan tâm đến logic triển khai phần bên dưới thôi, vì khi thực tế build hệ thống sẽ khác xíu, nhưng logic bên dưới sẽ không đổi nhiều.


Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises


2. Cài đặt và cấu hình MetalLB : Vậy nó là gì, điểm khác biệt khi sử dụng cloud native thì phần này dịch vụ nó làm cho bạn hết rồi, còn đây On-Premises nên bạn phải dùng nó vì mục đích nó sẽ cho phép cấu hình External IP để ứng dụng của bạn ra bên ngoài.

MetalLB is a load-balancer implementation for bare metal Kubernetes clusters, using standard routing protocols. nguyên văn của trang chủ nó ghi vậy, hiện tại thời điểm này đang dùng MetalLB v0.13.11.

Đối với phần này tôi khuyên bạn nên vào trang chủ đọc từ A - Z đi, vì nó không nhiều lắm đâu, khá là ít nên chịu khó đọc, ý tôi là từ A - Z nhé, đọc đi bạn sẽ hiểu tôi muốn nói gì :)


https://metallb.universe.tf/


3. Contour ingress của projectcontour :  Nó  được sử dụng để quản lý việc cung cấp dịch vụ và cân bằng tải (ingress) trong môi trường Kubernetes. Contour được phát triển dựa trên các tiêu chuẩn và tài liệu của Kubernetes để cung cấp một giải pháp mạnh mẽ cho việc quản lý ingress controller. Khi thực hiện bên dưới sẽ nói kỹ hơn.

https://projectcontour.io/


Cài đặt :

-MetalLB : Chỉ cần apply config bên dưới là đã cài được, ngày xưa khi các version cũ của MetalLB  thì bắt buộc bạn phải edit xíu về kube-proxy để IPVS hoạt động,còn phiên bản hiện tại không cần phải lo lắng gì nhiều, apply phát ok.


k apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.11/config/manifests/metallb-native.yaml

Tạo một file yaml manifest để tạo pool, phiên bản hiện tại cũng khác với phiên bản cũ luôn, hiện tại dùng Kind IPAddressPool nên không phải tạo configmaps. 

Bên dưới tạo một pool default để dùng, như mô hìn k8s vm ở trên nên cho đường đi ra từ lớp 192.168.221.x để dùng host machine kết nối vào để test, range ip ở dưới để External IP nó cấp.

Sau khi tạo pool xong mình sẽ có được range ip cần dùng thì muốn dùng được nó phải tạo L2Advertisement, sau khi tạo nó mới dùng được, như config bên dưới thì nó sẽ tự động lấy làm default luôn, cứ expose loadbalancer sẽ cấp theo danh sách đó.

vi metallb-config.yaml


apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.221.100-192.168.221.200
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default
  namespace: metallb-system


Các lưu ý sau: 

-Webhook-service: Nó như là một triger events vậy, khi có thay đổi , cập nhật gì là nó xử lý ngay.

-Controller : nó nhiệm vụ giải quyết vấn đề cấp phát IP.

-Speaker : nhiệm vụ nó liên quan đến L2Advertisement như config trên.

- Nếu bạn có thay đổi gì về ip thì chỉ cần xóa pod pod/controller- của metallb-system đi là sẽ cập nhật lại, với nếu bạn config bị lỗi hay sai gì thì nó cũng sẽ giữ config trước đó để tránh bị tạch , mọi thứ sẽ giữ trong pod controller.


Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises


-Contour

k apply -f https://projectcontour.io/quickstart/contour.yaml

Sau khi apply xong nó sẽ có những thứ như sau bên dưới


Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises

Các điểm cần lưu ý sau :

- contour service nó sẽ làm nhiệm vụ là Ingress Controller điều hướng các traffic đi theo đúng yêu cầu

- envoy nó nhiệm vụ là làm proxy nhận thông tin và báo có contour để nó điều hướng đúng yêu cầu.

MetaILB <==> envoy <==> contour <==> pod app


Như hình trên sau khi apply xong contour thì sẽ sinh ra 2 service contour và envoy, bản thân envoy là loadbalacer nó kế thừa lại external ip do metallb cung cấp, như vậy là đã có một mô hình logic hỗ trợ k8s trên On-Premises có 1 chân ra bên ngoài rồi. Giờ phần còn lại là giải quyết 1 chân bên trong nữa như sau.

Đối với Contour nó hỗ trợ rất nhiều và mạnh mẽ, hôm nay sẽ nói về HTTPProxy trước, các phần sau khi nào có thời gian sẽ nói tiếp.

Bây giờ sẽ triển khai 2 project :

Project 1 : chemgio-project 

Domain : http://chemgio.loc

App: nginx

mkdir chemgio-project
touch deployment.yaml namespaces.yaml httpproxy.yaml service.yaml


kind: Namespace
apiVersion: v1
metadata:
  name: chemgio-project
---
kind: HTTPProxy
apiVersion: projectcontour.io/v1
metadata:
  name: chemgio-project
  namespace: chemgio-project
spec:
  virtualhost:
    fqdn: chemgio.loc
  routes:
    - services:
      - name: chemgio-project
        port: 80
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: chemgio-project
  namespace: chemgio-project
spec:
  replicas: 2
  selector:
    matchLabels:
      app: chemgio-project
  template:
    metadata:
      labels:
        app: chemgio-project
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: http
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
---
kind: Service
apiVersion: v1
metadata:
  name: chemgio-project
  namespace: chemgio-project
spec:
  selector:
    app: chemgio-project
  ports:
    - port: 80
      targetPort: 80

Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises



Sau khi apply các manifest sẽ có kết quả như sau


Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises


Tương tự project 2:

Project 3 : pro-app-project 

Domain : http://proapp.loc

App: httpd

mkdir pro-app-project
touch deployment.yaml namespaces.yaml httpproxy.yaml service.yaml

Tướng tự clone manifest bên kia và edit


Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises


Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises


Cuối cùng thì vào host machine chỉnh lại /etc/hosts cho tương ứng và test thôi.


Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises


Sử dụng Kubernetes kết hợp với MetalLB và Contour ingress controller trên Kubernetes On-Premises




Còn phần TLS hôm sau rãnh sẽ post tiếp :)


Nhãn: