0
0
Lập trình
Admin Team
Admin Teamtechmely

Kubernetes 102: Thiết lập Cluster đầu tiên và Khái niệm cơ bản

Đăng vào 1 tháng trước

• 10 phút đọc

Kubernetes 102: Thiết lập Cluster đầu tiên và Khái niệm cơ bản 🚀

Trong bài viết trước, chúng ta đã tìm hiểu về Kubernetes 101, các tính năng của nó và cách hoạt động của nó. Bây giờ, hãy cùng thực hành! Trong hướng dẫn này, chúng ta sẽ:

1. Cài đặt một cluster Kubernetes nhẹ (sử dụng K3s)
2. Khám phá các khái niệm cơ bản của Kubernetes (nodes, pods, deployments, vv.)
3. Học cách tương tác với Kubernetes bằng kubectl

⚙️ Cài đặt Kubernetes (K3s)

Có nhiều cách để cài đặt Kubernetes:

  • Minikube – chạy Kubernetes trong một VM
  • Kind – chạy Kubernetes sử dụng Docker containers
  • MicroK8s – phiên bản nhẹ của K8s dành cho Linux
  • K3s – một bản phân phối siêu nhẹ

👉 Trong hướng dẫn này, chúng ta sẽ sử dụng K3s vì nó rất nhẹ, dễ cài đặt và đi kèm với mọi thứ bạn cần (bao gồm cả kubectl).

Bước 1: Cài đặt K3s

Chạy lệnh sau để cài đặt K3s:

Copy
$ curl -sfL https://get.k3s.io | sh -

Lệnh này sẽ tải xuống và cài đặt phiên bản mới nhất của K3s, sau đó khởi động nó như một dịch vụ hệ thống.

Bước 2: Cấu hình kubectl

Bây giờ, sao chép tệp kubeconfig để kubectl có thể giao tiếp với cluster của bạn:

Copy
$ mkdir -p ~/.kube
$ sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
$ sudo chown $USER:$USER ~/.kube/config

Hãy cho shell của bạn biết sử dụng cấu hình này:

Copy
$ export KUBECONFIG=~/.kube/config

👉 Thêm dòng này vào ~/.bashrc hoặc ~/.zshrc để làm cho nó vĩnh viễn.

Bước 3: Xác minh Cluster

Copy
$ kubectl get nodes

Bạn sẽ thấy điều gì đó như:

Copy
NAME       STATUS   ROLES                  AGE   VERSION
myhost     Ready    control-plane,master   2m    v1.31.0+k3s1

🎉 Chúc mừng! Cluster Kubernetes của bạn đã hoạt động!

🔑 Các thuật ngữ và khái niệm cơ bản của Kubernetes

Trước khi chúng ta triển khai ứng dụng, hãy hiểu các khối xây dựng của Kubernetes.

1. Nodes

Nodes là các máy tính (hoặc VMs) tạo thành cluster Kubernetes của bạn.

  • Chúng thực sự chạy các container cho ứng dụng của bạn.
  • Kubernetes theo dõi sức khỏe và trạng thái của từng node.

2. Namespaces

Namespaces giống như các phòng riêng biệt trong cluster.
Chúng giúp tổ chức và phân tách tài nguyên, vì vậy tên không bị xung đột.

  • Hai Pods trong cùng một namespace không thể có cùng tên.
  • Nhưng hai Pods có cùng tên có thể tồn tại trong các namespaces khác nhau.
  • Hữu ích cho các nhóm, dự án hoặc các môi trường khác nhau (như dev, test, prod).

3. Pods

Pods là đơn vị nhỏ nhất trong Kubernetes.
Chúng giống như một lớp bọc quanh một hoặc nhiều container phải chạy cùng nhau trên cùng một node.

  • Thường thì một Pod = một container.
  • Nhưng một Pod có thể có nhiều container chia sẻ lưu trữ và mạng.
  • Các container đặc biệt (init hoặc ephemeral) có thể được thêm vào để thiết lập hoặc gỡ lỗi.

4. ReplicaSets

ReplicaSets đảm bảo rằng số lượng bản sao của Pod (replicas) luôn đang chạy đúng.

  • Nếu một Pod gặp sự cố hoặc một Node bị lỗi, ReplicaSet sẽ tự động tạo một Pod mới.

5. Deployments

Một Deployment là một bộ điều khiển cấp cao hơn trên ReplicaSets.

  • Bạn khai báo số lượng Pods bạn muốn và phiên bản ứng dụng để chạy.
  • Kubernetes sẽ tự động cập nhật hoặc quay lại.
  • Bạn có thể tạm dừng, mở rộng hoặc quay lại một cách dễ dàng.

6. Services

Services phơi bày Pods ra mạng để các ứng dụng hoặc người dùng khác có thể truy cập chúng.

  • Chúng cung cấp một IP hoặc tên DNS ổn định ngay cả khi Pods đến và đi.
  • Ingress làm việc với Services để thiết lập các tuyến đường HTTP/HTTPS và cân bằng tải.
  • Bạn cũng có thể thêm chứng chỉ TLS cho HTTPS.

7. Jobs

Jobs thực hiện các tác vụ một lần hoặc theo lô.

  • Một Job tạo Pods và chờ cho đến khi chúng hoàn thành.
  • Nếu một Pod thất bại, nó sẽ thử lại cho đến khi nhiệm vụ hoàn thành.
  • CronJobs giống như Jobs nhưng có lịch trình (ví dụ: chạy mỗi đêm lúc 1 giờ sáng).

8. Volumes

Volumes là lưu trữ sống bên ngoài vòng đời của một Pod.
Chúng cho phép Pods lưu trữ dữ liệu không biến mất khi một Pod khởi động lại.
Tốt cho các cơ sở dữ liệu hoặc máy chủ tệp.
Kubernetes làm việc với nhiều loại lưu trữ (đĩa đám mây, đĩa cục bộ, vv.).

9. Secrets và ConfigMaps

  • Secrets lưu trữ dữ liệu nhạy cảm như mật khẩu, API keys, hoặc chứng chỉ.
  • ConfigMaps lưu trữ cấu hình thông thường như cài đặt ứng dụng.
  • Cả hai có thể được cung cấp cho Pods dưới dạng biến môi trường hoặc như các tệp được gắn trong một volume.

10. DaemonSets

Một DaemonSet đảm bảo rằng một Pod chạy trên mỗi Node trong cluster.

  • Hữu ích cho những thứ cần chạy ở mọi nơi, như: Các tác nhân ghi log, Công cụ giám sát.
  • Khi một Node mới tham gia, Kubernetes tự động chạy Pod DaemonSet trên nó.

11. Network Policies

Network Policies là các quy tắc cho lưu lượng giữa các Pods.

  • Chúng kiểm soát ai có thể nói chuyện với ai bên trong cluster.
  • Hai loại quy tắc:
    • Ingress: kiểm soát lưu lượng đến.
    • Egress: kiểm soát lưu lượng đi ra.
  • Nếu một chính sách từ chối lưu lượng, Pods không thể kết nối.

Tương tác với Kubernetes bằng Kubectl

Bây giờ bạn đã quen thuộc với các khái niệm cơ bản, bạn có thể bắt đầu thêm workloads vào cluster của mình với Kubectl. Dưới đây là một danh sách nhanh một số lệnh chính.

Liệt kê Pods

Điều này hiển thị các Pods trong cluster của bạn:

Copy
$ kubectl get pods
No resources found in default namespace

Chỉ định một namespace với cờ -n hoặc --namespace:

Copy
$ kubectl get pods -n demo
No resources found in demo namespace

Hoặc, lấy Pods từ tất cả các namespaces của bạn bằng cách chỉ định --all-namespaces:

Copy
$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   coredns-b96499967-4xdpg                   1/1     Running     0          114m

Tạo một Pod

Tạo một Pod với lệnh sau:

Copy
$ kubectl run nginx --image nginx:latest
pod/nginx created

Lệnh này khởi động một Pod có tên nginx sẽ chạy hình ảnh container nginx:latest.

Tạo một Deployment

Tạo một Deployment cho phép bạn mở rộng nhiều bản sao của một container:

Copy
$ kubectl create deployment nginx --image nginx:latest --replicas 3
deployment.apps/nginx created

Bạn sẽ thấy ba Pods được tạo, mỗi Pod chạy hình ảnh nginx:latest:

Copy
$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7597c656c9-4qs55   1/1     Running   0          51s
nginx-7597c656c9-gdjl9   1/1     Running   0          51s
nginx-7597c656c9-7sxrc   1/1     Running   0          51s

Mở rộng một Deployment

Bây giờ sử dụng lệnh này để tăng số lượng bản sao:

Copy
$ kubectl scale deployment nginx --replicas 5
deployment.apps/nginx scaled

Kubernetes đã tạo thêm hai Pods để cung cấp thêm dung lượng:

Copy
$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7597c656c9-4qs55   1/1     Running   0          2m26s
nginx-7597c656c9-gdjl9   1/1     Running   0          2m26s
nginx-7597c656c9-7sxrc   1/1     Running   0          2m26s
nginx-7597c656c9-kwm6q   1/1     Running   0          2s
nginx-7597c656c9-nwf2s   1/1     Running   0          2s

Phơi bày một Service

Bây giờ hãy làm cho máy chủ NGINX này có thể truy cập được.

Chạy lệnh sau để tạo một service được phơi bày trên một cổng của Node chạy các Pods:

Copy
$ kubectl expose deployment/nginx --port 80 --type NodePort
service/nginx exposed

Khám phá cổng đã được gán bằng cách chạy lệnh này:

Copy
$ kubectl get services
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1      <none>        443/TCP        121m
nginx        NodePort    10.43.149.39   <none>        80:30226/TCP   3s

Cổng là 30226. Truy cập vào localhost:30226 trong trình duyệt của bạn sẽ hiển thị trang NGINX mặc định.

Sử dụng chuyển tiếp cổng

Bạn có thể truy cập một service mà không cần gán nó vào một cổng Node bằng cách sử dụng chức năng chuyển tiếp cổng tích hợp của Kubectl. Xóa service đầu tiên của bạn và tạo một cái mới mà không có cờ --type:

Copy
$ kubectl delete service nginx
service/nginx deleted

$ kubectl expose deployment/nginx --port 80
service/nginx exposed

Điều này tạo ra một ClusterIP service có thể được truy cập trên một IP nội bộ, bên trong cluster.

Lấy chi tiết của service bằng cách chạy lệnh này:

Copy
$ kubectl get services
NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx       ClusterIP   10.100.191.238   <none>     80/TCP  2s

Service có thể được truy cập bên trong cluster tại 10.100.191.238:80.

Bạn có thể đến địa chỉ này từ máy cục bộ của bạn với lệnh sau:

Copy
$ kubectl port-forward service/nginx 8080:80

Truy cập vào localhost:8080 trong trình duyệt sẽ hiển thị trang NGINX. Kubectl đang chuyển tiếp lưu lượng đến service bên trong cluster của bạn. Bạn có thể nhấn Ctrl+C trong terminal để dừng phiên chuyển tiếp cổng khi bạn đã xong.

Áp dụng một tệp YAML

Cuối cùng, hãy xem cách áp dụng một tệp YAML khai báo vào cluster của bạn. Đầu tiên, viết một manifest Kubernetes đơn giản cho Pod của bạn:

Copy
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest

Lưu manifest này vào nginx.yaml và chạy kubectl apply để tự động tạo Pod của bạn:

Copy
$ kubectl apply -f nginx.yaml
pod/nginx created

Bạn có thể lặp lại lệnh sau khi sửa đổi tệp để áp dụng bất kỳ thay đổi nào cho cluster của bạn.

🎯 Kết luận

Kubernetes là trình điều phối container hàng đầu, và trong blog này, chúng ta đã khám phá các tính năng của nó, hiểu cách hoạt động của nó và xem xét các thành phần chính giúp ứng dụng của bạn hoạt động. Bạn đã có nền tảng để bắt đầu thử nghiệm và xây dựng với Kubernetes. 🚀

Nhưng đây chỉ là khởi đầu! Trong các bài blog sắp tới, chúng ta sẽ đi sâu vào các chủ đề Kubernetes nâng cao — từ những thách thức thực tế và các phương pháp tốt nhất đến bảo mật, mở rộng quy mô và triển khai thực hành.

🙌 Hãy theo dõi phần tiếp theo của loạt bài mà chúng ta sẽ đi xa hơn các kiến thức cơ bản và làm cho Kubernetes hoạt động hiệu quả cho bạn.

👉 Theo dõi tôi ở đây, hoặc kết nối với tôi trên LinkedIn và Twitter để nhận thông tin cập nhật, mẹo và nhiều nội dung cho lập trình viên hơn.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào