[DevOps Series] Kubernetes – Phần 3

6 min read

Giới thiệu về phần 3

Khi chạy ứng dụng trên Docker, bạn hoàn toàn có thể chạy ứng dụng đó trên môi trường local của mình. Nhưng khi bạn cần cho phép người khác truy cập vào ứng dụng của mình, trước tiên bạn phải đẩy  docker image của mình lên container registry và để người khác có thể pull image đó và chạy bản sao ứng dụng của bạn trên máy của họ.

Nhưng khi nói đến Kubernetes, bạn có thể chạy ứng dụng của mình trên K8s và cho phép các bên bên ngoài truy cập ứng dụng qua địa chỉ IP. Vì vậy, trong bài viết này, mình sẽ giải thích cho bạn cách chúng ta kết nối các K8s workloads/components với nhau và xây dựng ứng dụng Kubernetes cũng như cách cho phép các bên bên ngoài truy cập vào ứng dụng đó qua địa chỉ IP. Ngoài ra, chúng ta sẽ thảo luận về các lệnh Kubernetes quan trọng nhất mà bạn nên biết.

Để chạy các lệnh Kubernetes (còn gọi là kubectl), bạn cần có quyền truy cập vào K8s cluster và cài đặt công cụ có tên kubectl. Bạn có thể thiết lập các K8s cluster trên các nền tảng như Rancher , Google Kubernetes Engine(GKE) , Azure Kubernetes Service(AKS) , v.v.

Đồng thời, bạn có thể có Kubernetes cluster local thông qua Minikube . Nó rất dễ sử dụng trên local machine của bạn khi mới bắt đầu và để biết cách cài đặt nó trên máy cục bộ của bạn, vui lòng xem qua bài viết dưới đây. https://kubernetes.io/vi/docs/tasks/tools/install-minikube/

Khi cài đặt Minikube, bạn không phải cài đặt Docker. Minikube chứa Docker và cũng tạo ra K8s cluster và kubctl cli. vì vậy, sau khi thiết lập hoàn tất, bạn có thể chạy trực tiếp các lệnh của mình.

Khi cả Docker và Kubernetes đã sẵn sàng, bạn có thể bắt đầu xây dựng ứng dụng của mình và sau đó, bạn có thể định cấu hình các file config của K8s để áp dụng ứng dụng của mình vào minikube cluster. Với bài viết này, mình sẽ sử dụng Python và Flask

Cấu hình Flask App

Dưới đây bạn có thể thấy những gì mình đã cấu hình trong Flask app của mình. Sau đó chúng ta có thể bắt đầu tạo docker image của mình. Nhưng trước đó, hãy đảm bảo ứng dụng của bạn đang chạy bình thường. Nếu ứng dụng của bạn được định cấu hình bằng Flask, hãy chạy flask run lệnh để chạy ứng dụng tại local.

file name: app.py

from flask import Flask, render_template, url_for

app = Flask(__name__)

posts = [
    {
        'author': 'Quang Le',
        'title': 'First Blog Post',
        'content': 'First Blog Content',
        'date_posted': 'March 21st, 2024'
    },
    {
        'author': 'Huy Le',
        'title': 'Second Blog Post',
        'content': 'Second Blog Content',
        'date_posted': 'April 12th, 2023'
    }
]

@app.route('/')
def home():
    return render_template('index.html', posts=posts)


@app.route('/login')
def login():
    return render_template('login.html', title='Login')


@app.route('/register')
def register():
    return render_template('register.html', title='Register')


@app.route('/view')
def view():
    return render_template('view.html', title='View')

if __name__ == '__main__':
    app.run(debug=True)

Docker Image

Bây giờ, chúng ta cần tạo Docker image phù hợp với Flask app ở trên. Đây là file Dockerfile và bạn có thể sử dụng để build Flask app trên thành một Docker image

file name: Dockerfile

FROM python:3.10.4-alpine3.15

WORKDIR /flask_k8s

COPY requirements.txt requirements.txt

RUN pip install -r requirements.txt

COPY . .

CMD ["python", "-m", "flask", "run", "--host=0.0.0.0"]

Khi app của bạn và Dockerfile đã sẵn sàng, bạn có thể kiểm tra Docker image tại local bằng cách chạy một Docker container với chính image đấy.

Để docker container, chúng ta cần thực hiện các lệnh bên dưới tương ứng.

$ docker build . -t flask_app:v1.0
$ docker run -d -p 5000:5000 --name flask_app_c1 flask_app:v1.0

Đẩy Image vừa được build lên container registry

Mình sẽ sử dụng Dockerhub như một container registry, nó cũng khá dễ dàng sử dụng cho người mới bắt đầu. Bạn chỉ việc tạo account trên Dockerhub theo link https://hub.docker.com/signup. Bạn có thể tham khảo bài viết ở đây để nắm các kiến thức cơ bản về Docker
Dùng lệnh sau để login vào dockerhub

$ docker login
Username: <username>
Password: <password>
// nhập user name và password sau đó nhấn enter.

Khi bạn đã đăng nhập thành công vào tài khoản Docker Hub qua terminal, bạn có thể bắt đầu đẩy (push) hình ảnh docker của mình lên Docker Hub. Sử dụng các lệnh dưới đây để thực hiện việc đó.

Bước 1: Gắn thẻ (tag) cho Image
$ docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
SOURCE_IMAGE[:TAG] - bạn có thể giữ cái này làm image local của mình
TARGET_IMAGE[:TAG] - <docker_hub_username>/<image-name>:<tag>
Ví dụ:
$ docker tag flask_app:v1.0 quangledang23/flask_app:v1.0
Bước 2: Push image
$ docker push quangledang23/flask_app:v1.0

Thêm các workload/tcomponents Kubernetes

Đối với hướng dẫn này, chúng ta chỉ cần Deployment và Service của Kubernetes làm các thành phần. Bạn có thể tạo các tệp YAML cho deployment và service của Kubernetes như dưới đây [nếu bạn muốn, bạn có thể sử dụng hình ảnh docker của mình].

file name: flask-app-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-k8s-deployment
spec:
  selector:
    matchLabels:
      app: flask-k8s
  template:
    metadata:
      labels:
        app: flask-k8s
    spec:
      containers:
      - name: flask-k8s
        image: docker.io/quangledang23/flask_app
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 5000

file name: flask-app-service.yml

apiVersion: v1
kind: Service
metadata:
  name: flask-k8s-service
spec:
  selector:
    app: flask-k8s-service
  ports:
  - protocol: "TCP"
    port: 6000
    targetPort: 5000
  type: LoadBalancer

Bây giờ cả hai thành phần K8s của chúng ta đã sẵn sàng. Chúng ta có thể áp dụng chúng vào Kubernetes cluster của mình bằng các lệnh dưới đây [đảm bảo rằng Minikube đang chạy trên máy tính của bạn].

$ kubectl apply -f flask-app-deployment.yml
$ kubectl apply -f flask-app-service.yml

Các lệnh Kubernetes cơ bản

Trước đó, mình đã đề cập rằng Minikube là one-node cluster, có nghĩa là cả các node Master và Worker đều nằm trong một node duy nhất. Bạn có thể kiểm tra điều đó bằng cách chạy lệnh kubectl get nodes.

Để liệt kê các pod có sẵn, bạn có thể chạy lệnh kubectl get pods trên terminal. Lệnh này sẽ hiển thị tên pod, trạng thái và thông tin chi tiết khác.

Lệnh kubectl get all sẽ liệt kê tất cả các thành phần K8s có sẵn trong cluster của bạn. Nhưng khi bạn cần lấy danh sách các thành phần dựa trên từng loại, bạn có thể chạy các lệnh dưới đây.

# Liệt kê tất cả các deployments
$ kubectl get deployments

# Liệt kê tất cả các services
$ kubectl get services

Khi bạn cần kiểm tra nhật ký (logs) của một pod hoặc tìm thêm thông tin về một pod, bạn có thể chạy các lệnh dưới đây:

# Kiểm tra logs của một pod
$ kubectl logs <pod-name>

# Tìm thêm thông tin chi tiết về một pod
$ kubectl describe pod <pod-name>

Đây là một số lệnh cơ bản của Kubernetes mà bạn có thể thử với ứng dụng K8s đầu tiên của mình. Ngoài các lệnh cơ bản này, hãy luôn nhớ một lệnh kubectl quan trọng có thể giúp bạn trong hầu hết các trường hợp.

Lệnh kubectl --help sẽ cung cấp cho bạn nhiều thông tin hơn về các lệnh kubectl. Vì vậy, bất cứ khi nào bạn gặp khó khăn, đừng ngần ngại thử lệnh đó để giải quyết vấn đề của mình.

Trong bài viết này, chúng ta đã xây dựng và chạy ứng dụng đầu tiên của mình trên Kubernetes và có được một số kiến thức về các lệnh cơ bản của kubectl. Cảm ơn đã theo dõi 3 phần của bài viết này, mọi thắc mắc về các ví dụ hay lệnh đừng ngần ngại comment, mình sẽ reply tất cả vào một ngày đẹp trời nào đó 🤣.

Avatar photo

Clean Code: Nguyên tắc viết hàm trong lập trình…

Trong quá trình phát triển phần mềm, việc viết mã nguồn dễ đọc, dễ hiểu là yếu tố then chốt để đảm bảo code...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc comment trong lập trình

Trong lập trình, code không chỉ là một tập hợp các câu lệnh để máy tính thực thi, mà còn là một hình thức...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc xử lý lỗi (Error Handling)

Trong quá trình phát triển phần mềm, việc xử lý lỗi không chỉ là một phần quan trọng mà còn ảnh hưởng trực tiếp...
Avatar photo Dat Tran Thanh
4 min read

Leave a Reply

Your email address will not be published. Required fields are marked *