+11

Kubernetes Hacking Phần 2: Cài đặt và triển khai ứng dụng

1. Giới thiệu

Trong phần trước của series "Kubernetes Hacking," chúng ta đã cùng nhau tìm hiểu về cơ bản về Kubernetes - một hệ thống quản lý container mạnh mẽ và phổ biến. Chúng ta đã khám phá kiến trúc tổng quát của Kubernetes, các khái niệm quan trọng như Pods, Services và Deployments, cùng với tầm quan trọng của việc bảo mật hệ thống Kubernetes.

Trong phần 2 chúng ta sẽ đi vào việc thực hiện từ cài đặt cơ bản cho đến triển khai ứng dụng trên Kubernetes. Bài viết sẽ hướng dẫn từng bước để bạn có thể tạo môi trường thử nghiệm và triển khai ứng dụng của mình trên nền tảng mạnh mẽ này.

2. Cài đặt môi trường

2.1 Các cách để cài đặt Kubernetes

Có nhiều cách để cài đặt Kubernetes (K8s) dựa trên yêu cầu và môi trường của bạn. Dưới đây là một số cách phổ biến để cài đặt K8s:

  • Minikube: Đây là một giải pháp đơn giản để cài đặt một cụm K8s trên máy tính cá nhân để phục vụ mục đích tìm hiểu, phát triển và kiểm tra ứng dụng.

  • Kubeadm: Kubeadm là một công cụ dòng lệnh cho phép bạn tạo và quản lý một cụm K8s trên máy chủ vật lý hoặc máy ảo. Đây là một cách phổ biến để cài đặt K8s cho môi trường thử nghiệm và sản xuất.

  • Cloud-based Solutions: Các nhà cung cấp đám mây như AWS, Google Cloud, Azure cung cấp dịch vụ quản lý K8s. Bạn có thể sử dụng các dịch vụ như Amazon EKS, Google Kubernetes Engine (GKE) hoặc Azure Kubernetes Service (AKS) để dễ dàng triển khai và quản lý K8s trên các nền tảng đám mây.

Ngoài ra bạn có thể sử dụng các cách khác như:

  • Kubernetes-in-Docker (KinD):
  • KubeSpray:
  • Rancher
  • Custom Installations
  • Các Managed Kubernetes Services:

Mỗi cách cài đặt K8s có ưu điểm và hạn chế riêng, tùy thuộc vào mục đích và yêu cầu của bạn, bạn có thể chọn cách thích hợp nhất.

Trong bài viết này, chúng ta sẽ tập trung vào việc cài đặt Kubernetes bằng cách sử dụng Minikube, đặc biệt trong ngữ cảnh của bảo mật và tìm hiểu về các khía cạnh liên quan đến an ninh. Ưu điểm của Sử dụng Minikube cho bảo mật:

  • Dễ dàng cài đặt và sử dụng: Minikube cung cấp một cách dễ dàng để tạo ra môi trường Kubernetes để tìm hiểu và phát triển ứng dụng. Việc cài đặt và triển khai đơn giản giúp bạn tập trung vào việc nghiên cứu bảo mật.

  • Tách biệt và cô lập: Minikube cho phép bạn tạo ra một cụm Kubernetes trên máy tính cá nhân, tạo ra sự tách biệt và cô lập với cụm chính của bạn. Điều này giúp bạn thử nghiệm các kịch bản bảo mật mà không ảnh hưởng đến môi trường chính của bạn.

  • Thích hợp cho học tập và tìm hiểu: Với Minikube, bạn có thể dễ dàng tạo ra nhiều cụm Kubernetes nhỏ để thực hiện các thử nghiệm và tìm hiểu về bảo mật trong môi trường thực tế.

2.2 Cài đặt kubernetes sử dụng Minikube

Bước 1: Chuẩn bị môi trường.

  • Cài đặt Hypervisor: Minikube yêu cầu một hypervisor để tạo máy ảo. Bạn có thể sử dụng Hyper-V hoặc VirtualBox. Trong hướng dẫn này, chúng ta sẽ sử dụng Hyper-V.

    Mở PowerShell với quyền Administrator và chạy lệnh sau để cài đặt Hyper-V:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
    

    Sau khi cài đặt xong, khởi động lại máy tính.

  • Cài đặt Kubectl: Kubectl là công cụ quản lý Kubernetes. Tải và cài đặt Kubectl từ trang chính thức của Kubernetes:

    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/windows/amd64/kubectl.exe"
    mkdir -p $HOME/bin
    mv kubectl.exe $HOME/bin
    

    Bạn cũng có thể sử dụng choco để install kubectl từ powershell:

    choco install kubernetes-cli
    

    Picture1.png

  • Cài đặt Minikube: Tải và cài đặt Minikube từ trang chính thức của Minikube:

    curl -LO "https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe"
    rename-item minikube-windows-amd64.exe minikube.exe
    mkdir -p $HOME/bin
    mv minikube.exe $HOME/bin
    

    Hoặc sử dụng choco để install:

    choco install minikube
    

Bước 2: Khởi động Minikube.

  • Mở PowerShell và chạy lệnh sau để khởi động Minikube

    minikube start
    

    Minikube sẽ bắt đầu tạo một máy ảo và triển khai Kubernetes cluster.

    Picture2.png

Bước 3: Xác định môi trường kubectl.

  • Chạy lệnh sau để xác định môi trường kubectl để nó trỏ đến Minikube cluster:
    minikube.exe update-context
    
  • Bạn có thể kiểm tra xem kubectl có đúng context của Minikube không:
    kubectl config current-context
    

Bước 4: Kiểm tra cài đặt thành công.

Chạy lệnh sau để kiểm tra xem Minikube đã được triển khai thành công:

  kubectl get nodes

image.png

Minikube cung cấp một giao diện Dashboard cho việc quản lý và theo dõi Kubernetes cluster một cách dễ dàng. Để truy cập vào giao diện Dashboard của Minikube chạy lệnh:

minikube dashboard

Picture3.png

Đến đây, bạn đã hoàn thành quá trình cài đặt môi trường Kubernetes bằng Minikube trên Windows PowerShell. Bạn có thể bắt đầu thử nghiệm và triển khai ứng dụng trên cluster của mình.

3. Triển khai ứng dụng trên minikube

Trong môi trường Kubernetes, việc triển khai và quản lý ứng dụng đa phần được thực hiện thông qua các tài nguyên gọi là Deployment. Deployment giúp tự động tạo và quản lý nhiều phiên bản của ứng dụng, giúp đảm bảo tính sẵn sàng và khả năng mở rộng. Trong phần này, chúng ta sẽ tìm hiểu về cách triển khai ứng dụng sử dụng Deployment trong Kubernetes.

Nói qua về Deployment, đây là một tập hợp các Pod, nó cung cấp khả năng tự động mở rộng, cập nhật và quản lý số lượng Pod để đảm bảo ứng dụng luôn hoạt động ổn định và khả dụng. Khi ta tạo một Deployment, nó sẽ tạo ra một ReplicaSet bên dưới, và ReplicaSet sẽ tạo Pod.

Picture4.png

Ý tưởng trong bài này là chúng ta có thể lấy các container images của mình và triển khai chúng dưới dạng các pods trên Kubernetes cluster của chúng ta để tận dụng Kubernetes như một bộ điều phối container.

Bước 1: Tạo image

Chúng ta sẽ sử dụng Docker để tạo một image và sau đó đẩy nó lên Docker Registry. Có hai cách để thực hiện điều này:

  • Cách 1: Sử dụng Minikube Load.

    Chúng ta có thể sử dụng Minikube để tạo một image và push trực tiếp vào Kubernetes cluster. Cách này thích hợp để thực hiện triển khai nhanh chóng trên môi trường phát triển. Sau khi tạo xong, bạn có thể sử dụng lệnh kubectl apply để triển khai ứng dụng từ hình ảnh Minikube Load.

  • Cách 2: Sử dụng Image Registry.

    Nếu bạn muốn sử dụng iamge ứng dụng trên nhiều môi trường và máy chủ khác nhau, bạn có thể đăng ký tài khoản trên một Docker Registry (ví dụ: Docker Hub) và đẩy image vào đó. Sau khi image đã được đăng lên Registry, bạn có thể dễ dàng sử dụng nó để triển khai ứng dụng trên bất kỳ Kubernetes cluster nào.

    Dưới đây là các bước cơ bản để thực hiện việc này:

    • 1 Đăng nhập vào Docker Registry (nếu cần):
      docker login
      
      1. Tạo Docker image từ mã nguồn ứng dụng:
      docker build -t <username>/<name-image>:tag .
      
      Trong đó, <username> là tên người dùng trên Docker Registry, <name-image> là tên bạn muốn đặt cho image, và tag là phiên bản hoặc thẻ của image
      1. Push image lên Docker Registry:
      docker push <username>/<name-image>:tag
      

    Kết quả sau khi push image thành công: Picture5.png

    Để kiểm tra các image trong Minikube, bạn có thể sử dụng lệnh Docker trực tiếp trên máy ảo của Minikube. Mở terminal và chạy lệnh sau để truy cập vào máy ảo Minikube:

     minikube ssh
    

    Bên trong máy ảo Minikube, bạn có thể sử dụng các lệnh Docker để kiểm tra các image. Ví dụ:

    docker images
    

    image.png

    Kết quả trả về cho thấy image chiennx1403/chien-image đã được đẩy vào thành công.

Bước 2: Tạo tệp YAML cho Deployment định nghĩa các pod và sử dụng image vừa tạo.

Tạo một tệp có tên app-deployment.yaml hoặc tên bất kỳ với nội dung sau để định nghĩa Deployment cho ứng dụng của bạn:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: sample-app
spec:
 replicas: 3    # Số lượng replicas (phiên bản ứng dụng) bạn muốn triển khai.
 selector:
   matchLabels:
     app: sample-app
 template:
   metadata:
     labels:
       app: sample-app
   spec:
     containers:
     - name: app-container
       image: your-docker-registry/your-app-image:tag   # Thay thế bằng image của ứng dụng bạn muốn triển khai.
       ports:
       - containerPort: 80   # Cổng mà ứng dụng lắng nghe.

Trong ví dụ trên bạn thay thế image thành chiennx1403/chien-image:latest để chạy image.

Bước 3: Triển khai ứng dụng

Chúng ta cần điều hướng tới vị trị tệpYAML của mình và chạy lệnh:

kubectl create -f app-deployment.yaml

Sử dụng lệnh kubectl get pods để kiểm tra trạng thái các Pod của Deployment:

 kubectl get pods

image.png Kết quả trả về cho thấy có 3 pods vừa được tạo thành công với name sample-app-xxxx (do replicas=3)

Bước 4: Truy cập ứng dụng

Khi bạn triển khai ứng dụng trong Kubernetes, bạn cần một cách để tiếp cận ứng dụng từ bên ngoài cluster. Để làm điều này, bạn có thể sử dụng tài nguyên Service trong Kubernetes để tạo một endpoint cho ứng dụng của bạn. Dưới đây là các bước chi tiết để truy cập ứng dụng bằng cách triển khai Service:

Định nghĩa Service:

Trước tiên, bạn cần định nghĩa một tài nguyên Service trong Kubernetes. Chúng ta có một số lựa chọn với Service như sau:

  • ClusterIP: IP mà bạn thấy là ClusterIP, IP này nằm trên mạng nội bộ của cluster, chỉ những thứ trong cluster mới có thể truy cập tới IP này.

  • NodePort: Expose dịch vụ trên cùng một cổng của các nodes được chọn trong cluster sử dụng NAT.

  • LoadBalancer: Tạo một bộ cân bằng tải bên ngoài trên đám mây hiện tại, chúng ta đang sử dụng minikube nhưng ví dụ nếu bạn đã xây dựng Kubernetes cluster của riêng mình trên VirtualBox, bạn cần triển khai một LoadBalancer chẳng hạn như metallb vào cluster của mình để có chức năng này.

  • Port-Forward: Chúng ta cũng có khả năng chuyển tiếp cổng, cho phép bạn truy cập và tương tác với các process của Kubernetes cluster từ localhost. Lựa chọn này chỉ dành cho kiểm thử và tìm lỗi.

Định nghĩa Selector:

Trong tài nguyên Service, bạn cần định nghĩa một Selector để chỉ định ứng dụng nào cần được liên kết với Service. Selector này sẽ dựa trên nhãn mà bạn đã đính kèm vào tài nguyên Pod khi triển khai ứng dụng. Ví dụ trong Deployment vừa định nghĩa ở trên có labels: app: sample-app thì trong phần triển khai Service ta sẽ để selector là app: sample-app

Triển khai Service:

Tạo tệp YAML service.yaml cho Service để định nghĩa service sử dụng loại NodePort:

apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
 app: sample-app # trùng với labels của pod bạn muốn định tuyến.
ports:
 - protocol: TCP
   port: 80 # Cổng Service sẽ lắng nghe yêu cầu từ Client.
   targetPort: 80 # Cổng Pod lắng nghe và xử lý yêu cầu.
type: NodePort

Chạy lệnh:

   kubectl apply -f service.yaml
Kiểm tra service tạo thành công hay chưa chạy lệnh: 
   kubectl get service

image.png

Tạo thành công Service với tên my-service, với port 32251. Chạy lệnh để lấy ip của minikube:

  minikube ip

image.png

Mở trình duyệt và truy cập vào url http://172.27.149.189:32251:

image.png Như vậy chúng ta đã deploy thành công 1 ứng dụng chạy trên Kubernetes.

4. Kết luận

Trong bài viết này, chúng ta đã có cơ hội tìm hiểu cách cài đặt minikube và triển khai một ứng dụng thực tế trên môi trường Kubernetes. Qua việc thực hành các bước cài đặt, triển khai ứng dụng và tạo Service, chúng ta đã có cái nhìn tổng quan về quy trình làm việc với Kubernetes.

Phần tiếp theo của loạt bài viết sẽ tiếp tục khám phá sâu hơn về các khía cạnh bảo mật như xác thực và phân quyền trong Kubernetes. Điều này sẽ giúp bạn hiểu rõ hơn về cách quản lý quyền truy cập và đảm bảo tính an toàn trong môi trường Kubernetes.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.