banner
Jun 26, 2023
176 Views

Giới thiệu và cài đặt cơ bản Kubernetes: Quản lý ứng dụng phân tán dễ dàng

Written by
banner

Giới thiệu:

Kubernetes (K8s) là một hệ thống mã nguồn mở để quản lý và triển khai các ứng dụng điện toán phân tán. Nó được thiết kế để tự động hóa việc triển khai, mở rộng và quản lý các ứng dụng chạy trên các container.

Dưới đây là một số khái niệm cơ bản trong Kubernetes:

  1. Node: Một node là một máy chủ trong cụm Kubernetes. Nó có thể là một máy tính vật lý hoặc một máy ảo và chạy các container.
  2. Pod: Pod là một đơn vị cơ bản trong Kubernetes, chứa một hoặc nhiều container chia sẻ tài nguyên và không gian mạng. Các container trong cùng một pod chia sẻ cùng một mạng IP và có thể giao tiếp trực tiếp với nhau thông qua localhost.
  3. Service: Service cung cấp một cách để truy cập các pod trong Kubernetes thông qua một địa chỉ IP ổn định. Nó tạo ra một lớp trừu tượng để giao tiếp với các pod và cung cấp khả năng cân bằng tải và phát hiện các pod mới.
  4. Namespace: Namespace là một phần trong một cụm Kubernetes để tạo ra một phân chia logic và tách biệt giữa các tài nguyên. Nó giúp tổ chức và quản lý tài nguyên trong môi trường đa người dùng hoặc đa ứng dụng.
  5. Ingress: Ingress là một tài nguyên trong Kubernetes cho phép điều hướng các yêu cầu HTTP và HTTPS từ bên ngoài vào các dịch vụ trong cụm Kubernetes.
  6. Deployment: Deployment là một tài nguyên cho phép triển khai ứng dụng trong Kubernetes. Nó quản lý một tập hợp các pod và đảm bảo rằng số lượng và phiên bản của các pod đáp ứng yêu cầu được chỉ định. Deployment cung cấp khả năng cập nhật và rollback ứng dụng một cách dễ dàng.
  7. StatefulSet: StatefulSet là một tài nguyên sử dụng để triển khai các ứng dụng stateful trong Kubernetes, ví dụ như cơ sở dữ liệu. Nó đảm bảo rằng các pod được tạo ra và duy trì theo trạng thái cố định và duy nhất trong suốt quá trình triển khai và mở rộng.
  8. DaemonSet: DaemonSet cho phép triển khai một bản sao của pod trên mỗi node trong cụm Kubernetes. Nó được sử dụng cho các công việc mà bạn muốn chạy trên mỗi node, chẳng hạn như logging agent hoặc monitoring agent.
  9. Job: Job là một tài nguyên cho phép thực thi một công việc một lần trong Kubernetes. Nó khởi chạy một hoặc nhiều pod để thực hiện công việc và đảm bảo rằng công việc hoàn thành thành công trước khi kết thúc.
  10. CronJob: CronJob là một tài nguyên cho phép lập lịch và thực thi các công việc trong Kubernetes dựa trên lịch trình cron. Nó cho phép bạn thực hiện các tác vụ định kỳ, chẳng hạn như sao lưu dữ liệu hàng ngày hoặc thực hiện các công việc theo lịch trình cụ thể.
  11. ConfigMap: ConfigMap là một tài nguyên trong Kubernetes để lưu trữ các thông tin cấu hình không nhạy cảm, như cài đặt môi trường, cài đặt ứng dụng hoặc các giá trị cấu hình khác. Nó giúp tách biệt giữa mã nguồn và cấu hình, và cho phép thay đổi cấu hình mà không cần triển khai lại các tài nguyên.
  12. Secret: Secret là một tài nguyên trong Kubernetes để lưu trữ các thông tin nhạy cảm như thông tin xác thực, khóa API, chứng chỉ SSL, và mật khẩu. Dữ liệu trong Secret được mã hóa và chỉ có thể được giải mã bởi Kubernetes khi được sử dụng trong các tài nguyên khác.
  13. ReplicaSet: ReplicaSet là một tài nguyên quản lý số lượng replica của một tập hợp các pod. Nó đảm bảo rằng số lượng pod được duy trì ở một mức nhất định và tự động khởi động lại pod mới nếu pod đang chạy bị lỗi hoặc bị tắt.
  14. ReplicationController: ReplicationController là một phiên bản cũ hơn của ReplicaSet. Nó có chức năng tương tự, nhưng không hỗ trợ tất cả các tính năng của ReplicaSet. ReplicaSet được khuyến nghị sử dụng thay thế cho ReplicationController.

Cài đặt cơ bản

10.0.2.8 rancher
10.0.2.9 k8s-master
10.0.2.10 k8s-worker-01
10.0.2.11 k8s-worker-02
  • Cài docker cho cả 4 máy.
  • Sửa hostname cho từng máy với lệnh sudo hostname <HOSTNAME>. Thay <HOSTNAME> bằng các hostname tương ứng ở tất cả các nodes
  • Tắt swap. k8s yêu cầu vậy , k8s các bản sau này đã hỗ trợ swap nhưng có vẻ chưa ổn lắm nên cứ tắt cho chắc ở tất cả các nodes.
    • Chạy lệnh sau sudo swapoff -a
    • Sửa file /etc/fstab và comment hết các dòng liên quan tới swap
  • Cài các thành phần bắt buộc vào từng node cả master và worker như sau ở tất cả các nodes
    • kubelet (Kubernetes Agent): Là thành phần chạy trên mỗi node trong cụm Kubernetes. Nhiệm vụ chính của kubelet là quản lý và duy trì trạng thái của các container chạy trên node đó. Nó tương tác với container runtime (ví dụ: Docker) để quản lý vòng đời của các container, đảm bảo chúng được chạy và hoạt động đúng cách.
    • kubeadm (Kubernetes Administrator): Là công cụ dòng lệnh hỗ trợ trong quá trình triển khai một cụm Kubernetes. Kubeadm cho phép bạn khởi tạo một cụm mới, thêm nút vào cụm hiện có và quản lý cấu hình của cụm. Nó giúp đơn giản hóa quá trình cài đặt và cấu hình Kubernetes bằng cách tự động thực hiện các bước cần thiết.
    • kubectl (Kubernetes Control): Là công cụ dòng lệnh chính để tương tác với cụm Kubernetes. Kubectl cho phép bạn quản lý các đối tượng Kubernetes như Pod, Service, Deployment, Namespace và nhiều hơn nữa. Bằng cách sử dụng kubectl, bạn có thể triển khai ứng dụng, xem và điều chỉnh trạng thái của các đối tượng trong cụm, xem nhật ký và thực hiện các tác vụ quản lý khác.
    • kubernetes-cni (Kubernetes Container Networking Interface): Là công cụ có vai trò quan trọng trong việc cung cấp mạng cho các pod (container) trong một cụm Kubernetes.
$ sudo apt update
$ sudo apt install apt-transport-https curl
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add
$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" >> ~/kubernetes.list
$ sudo mv ~/kubernetes.list /etc/apt/sources.list.d
$ sudo apt update
$ sudo apt install -y kubelet kubeadm kubectl kubernetes-cni
  • Bật master - chỉ chạy ở master
$ sudo rm /etc/containerd/config.toml
$ sudo systemctl restart containerd
$ sudo kubeadm init --pod-network-cidr=10.0.2.0/16
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ export KUBECONFIG=/etc/kubernetes/admin.conf
$ kubectl apply

Lúc này kubeadm sẽ hiện ra 1 câu lệnh cho bạn chạy ở các worker để join node

  • Copy file /etc/kubernetes/admin.conf ở admin và chạy lệnh sau ở tất cả các worker nodes sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  • Bật workers
$ sudo rm /etc/containerd/config.toml
$ sudo systemctl restart containerd
$ kubeadm join 10.0.2.9:6443 --token 70452e.4bkx5kdqdzadlmw8 --discovery-token-ca-cert-hash sha256:8de464fe326ee9c324c6d6316fbe2bf49b297879d3d99a116813ea5a4d822c99 
  • Cài calico ở tất cả các nodes. Calico là một giải pháp mạng mã nguồn mở được sử dụng trong Kubernetes (k8s) để cung cấp mạng SDN (Software-Defined Networking) cho các mạng cluster. Nó giúp quản lý và tổ chức việc kết nối mạng giữa các Pod và Node trong một môi trường Kubernetes.
$ kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
$ curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml -O

Sửa dòng cidr thành mạng đang dùng và chạy lệnh kubectl create -f custom-resources.yaml

Thành quả

Thử nghiệm

Thử chạy nginx 10 replicas xem sao. Gõ lệnh sau ở bất kỳ node nào để tạo 1 nginx deployment

$ kubectl create deployment nginx-app --image=nginx --replicas=10
deployment.apps/nginx-app created

Chạy lệnh sau để kiểm tra tiến độ tạo deployment

$ kubectl get deployment nginx-app
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
nginx-app   5/10    10           5           12s

Expose port 80 thôi

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

Thử xem trong cluster nó là port nào

root@k8s-worker-01:/home/kub# kubectl get svc nginx-app
NAME        TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx-app   NodePort   10.106.118.201   <none>        80:30160/TCP   20m

Lúc này vào nodes nào qua port 30160 cũng sẽ thấy nginx

Article Tags:
· · · · · · ·
Article Categories:
config
banner

Leave a Reply

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