0
0
Posts
Việt Hoàng
Việt Hoàngviethoang28

Kiến trúc và các thành phần trong K8S

Đăng vào 1 tuần trước

• 10 phút đọc

Chủ đề:

KubernetesK8S

Phần này sẽ mô tả về kiến trúc và các thành phần trong K8S. Muốn hiểu phần này được tốt nhất thì nên đọc phần bài về giới thiệu K8Scài đặt K8S

Như trong phần cài đặt K8S chúng ta có thể nhìn thấy các thành phần kubeadm, kubelet, kube-proxy, ectd, flannet nằm trên các node. Trong phần này ta sẽ làm rõ hơn về chúng.

Kubernetes được xếp vào một trong các orchestration tools nằm trong hệ sinh thái của container. Do vậy K8S có các thành phần để đảm bảo thực hiện được việc tự động triển khai, mở rộng và vận hành container trên các cụm cluster (chính là các máy chạy các container sau này).

Kubernetes có thể được triển khai trên một hoặc nhiều máy vật lý, máy ảo hoặc cả máy vật lý và máy ảo để tạo thành cụm cluster. Cụm cluster này chịu sự điều khiển của Kubernetes và sinh ra các container khi người dùng yêu cầu. Kiến trúc logic của Kubernetes bao gồm 02 thành phần chính dựa theo vai trò của các node, đó là: Master nodeWorker node

  • Master node: Đóng vai trò là thành phần Control plane, điều khiển toàn bộ các hoạt động chung và kiểm soát các container trên node worker. Các thành phần chính trên master node bao gồm: API-server, Controller-manager, Schedule, Etcd và cả Docker Engine. Lưu ý: Có thể trong hình vẽ dưới bạn không nhìn thấy thành phần là docker được hiển thị ra nhưng trên master node cần có docker, lý do là để chạy các thành phần của K8S trên các container.
  • Worker node: Vai trò chính của worker node là môi trường để chạy các container mà người dùng yêu cầu, do vậy thành phần chính của worker node bao gồm: kubelet, kube-proxy và chắc chắn là Docker

Thường thì khi triển khai thực tế thì số lượng node worker sẽ nhiều hơn số lượng node master. Do vậy node master hay chính xác là K8S cần hoàn thành tốt nhiệm vụ liên quan tới việc quản lý, xử lý các container sao cho linh hoạt và trơn tru nhất. Ngoài ra, nếu như với các hệ thống thực tế cần có khả năng High Availability thì chúng ta cần triển khai nhiều node master

architecture-K8S

Các thành phần chính trong cụm cluster K8S bao gồm:

  • ectd
  • API-server
  • Controller-manager
  • Schedule
  • Agent
  • Proxy
  • CLI

Tuy một số thành phần kể tên ở trên không được liệt kê trong hình vẽ nhưng chúng là thành phần cần phải có để đảm bảo hoạt động của cụm Cluseter K8S. Sau đây chúng ta sẽ mô tả về vài trò của các thành phần chính trong kiến trúc của K8S. Sau khi hoàn tất phần này, chúng ta sẽ tìm hiểu về các khái niệm chính, mục tiêu là để người đọc hiểu được các thuật ngữ khi làm việc này này với K8S.

etcd

  • Etcd là một thành phần database phân tán, sử dụng ghi dữ liệu theo cơ chế key/value trong K8S cluster. Etcd được cài trên node master và lưu tất cả các thông tin trong Cluser. Etcd sử dụng port 2380 để listening từng request và port 2379 để client gửi request tới.
  • Ectd nằm trên node master.

API-server

API server là thành phần tiếp nhận yêu cầu của hệ thống K8S thông qua REST, tức là nó tiếp nhận các chỉ thị từ người dùng cho đến các services trong hệ thống Cluster thông qua API - có nghĩa là người dùng hoặc các service khác trong cụm cluster có thể tương tác tới K8S thông qua HTTP/HTTPS.

  • API-server hoạt động trên port 6443 (HTTPS) và 8080 (HTTP).
  • API-server nằm trên node master.

Controller-manager

Thành phần controller-manager là thành phần quản lý trong K8S, nó có nhiệm vụ xử lý các tác vụ trong cụm cluster để đảm bảo hoạt động của các tài nguyên trong cụm cluster. Controller-manager có các thành phần bên trong như sau:

  • Node Controller: Tiếp nhận và trả lời các thông báo khi có một node bị down.

  • Replication Controller: Đảm bảo các công việc duy trì chính xác số lượng bản replicate và phân phối các container trong pod (Pod tạm hình dung là một tập hợp các container khi người dùng có nhu cầu tạo ra và cùng thực hiện chạy một ứng dụng).

  • Endpoints Controller: Populates the Endpoints object (i.e., join Services & Pods).

  • Service Account & Token Controllers: Tạo ra các accounts và token để có thể sử dụng được các API cho các namespaces.

  • Thành phần controller-manager hoạt động trên node master và sử dụng port 10252.

Scheduler

kube-scheduler có nhiệm vụ quan sát để lựa chọn ra các node mỗi khi có yêu cầu tạo pod. Nó sẽ lựa chọn các node sao cho phù hợp nhất dựa vào các cơ chế lập lịch mà nó có. Kube-scheduler được cài đặt trên node master và sử dụng port 10251.

Agent - kubelet

Agent hay chính là kubelet, một thành phần chạy chính trên các node worker. Khi kube-scheduler đã xác định được một pod được chạy trên node nào thì nó sẽ gửi các thông tin về cấu hình (images, volume ...) tới kubelet trên node đó. Dựa vào thông tin nhận được thì kubelet sẽ tiến hành tạo các container theo yêu cầu.

Vai trò chính của kubelet là:

  • Dõi theo các pod trên node được gán để hoạt động.
  • Mount các volume cho pod
  • Đảm bảo hoạt động của các container của pod hoạt động tốt trên node đó (node worker có cài docker đó).
  • Report về trạng thái của các pod để cụm cluster biết được xem các container còn hoạt động tốt hay không.

Kubelet chạy trên các node worker và sử dụng port 10250 và 10255.

Proxy

  • Các service chỉ hoạt động ở chế độ logic, do vậy muốn bên ngoài có thể truy cập được vào các service này thì cần có thành phần chuyển tiếp các request từ bên ngoài và bên trong.
  • Kube-proxy được cài đặt trên các node worker, sử dụng port 31080

CLI

kubectl là thành phần cung cấp câu lệnh để người dùng tương tác với K8S. kubectl có thể chạy trên bất cứ máy nào, miễn là có kết nối được với K8S API-server

Pod network

Như trong các phần trước, chúng ta còn thấy một thành phần khác đó là pod network, đây là thành phần xử lý về network trong cụm K8S cluster. Pod network đảm bảo cho các container có thể truyền thông được với nhau. Có nhiều lựa chọn về pod network, nhưng trong tài liệu này chỉ giới thiệu về flannet

Tại sao trên node master cũng có các thành phần kubeletkube-proxy

  • Trong hình dưới ta có thể thấy trên node master có các thành phần là kubeletkube-proxy. Tại sao lại như vậy.
K8S-topology

Câu trả lời là: Do các node master cũng có các service (ứng dụng) được sử dụng để đảm bảo hoạt động của K8S, do vậy chúng được chạy trong các container và thuộc một pod với namespaces là kube-system.

Ta có thể sử dụng lệnh kubectl get pod --all-namespaces -o wide để quan sát việc này. Kết quả của lệnh như dưới.

sh Copy
export KUBECONFIG=/etc/kubernetes/admin.conf

kubectl get pod --all-namespaces -o wide

Kết quả như sau (chú ý quan sát ở cột NODE):

sh Copy
  NAMESPACE     NAME                             READY     STATUS    RESTARTS   AGE       IP              NODE
  kube-system   etcd-master                      1/1       Running   0          1d        172.16.68.130   master
  kube-system   kube-apiserver-master            1/1       Running   0          1d        172.16.68.130   master
  kube-system   kube-controller-manager-master   1/1       Running   0          1d        172.16.68.130   master
  kube-system   kube-dns-6f4fd4bdf-ctxx7         3/3       Running   0          1d        10.244.0.2      master
  kube-system   kube-flannel-ds-kjnhs            1/1       Running   0          1d        172.16.68.130   master
  kube-system   kube-flannel-ds-wz648            1/1       Running   0          1d        172.16.68.131   node1
  kube-system   kube-flannel-ds-xtcj9            1/1       Running   0          1d        172.16.68.132   node2
  kube-system   kube-proxy-5slwp                 1/1       Running   0          1d        172.16.68.132   node2
  kube-system   kube-proxy-5trrj                 1/1       Running   0          1d        172.16.68.130   master
  kube-system   kube-proxy-b54bs                 1/1       Running   0          1d        172.16.68.131   node1
  kube-system   kube-scheduler-master            1/1       Running   0          1d        172.16.68.130   master

Ngoài ra, riêng thành phần kubelet trên master node thì không chạy trong container, thay vào đó thì kubelet chạy như một service trong hệ điều hành. Ta có thể kiểm tra bằng lệnh kiểm tra hoạt động của service kubelet.

sh Copy
   systemctl status kubelet

Kết quả:

sh Copy
  kubelet.service - kubelet: The Kubernetes Node Agent
     Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/kubelet.service.d
             └─10-kubeadm.conf
     Active: active (running) since Thu 2018-01-25 23:50:36 +07; 1 day 21h ago
       Docs: http://kubernetes.io/docs/
   Main PID: 11378 (kubelet)
      Tasks: 16
     Memory: 46.7M
        CPU: 1h 45min 52.258s
     CGroup: /system.slice/kubelet.service
             └─11378 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manife

  Jan 26 00:14:03 master kubelet[11378]: W0126 00:14:03.070593   11378 kubelet.go:1592] Deleting mirror pod "etcd-master_kube-system(2141fb05-01f3-11e8-a135-525400811cc0)" because it i
  Jan 26 00:14:03 master kubelet[11378]: W0126 00:14:03.162630   11378 kubelet.go:1592] Deleting mirror pod "kube-apiserver-master_kube-system(217a6f08-01f3-11e8-a135-525400811cc0)" be
  Jan 26 00:14:03 master kubelet[11378]: W0126 00:14:03.216007   11378 kubelet.go:1592] Deleting mirror pod "kube-controller-manager-master_kube-system(21b796d0-01f3-11e8-a135-52540081
  Jan 26 00:14:03 master kubelet[11378]: W0126 00:14:03.317123   11378 kubelet.go:1592] Deleting mirror pod "kube-scheduler-master_kube-system(21d62e54-01f3-11e8-a135-525400811cc0)" be
  Jan 26 00:14:12 master kubelet[11378]: W0126 00:14:12.846969   11378 conversion.go:110] Could not get instant cpu stats: different number of cpus
  Jan 26 00:14:29 master kubelet[11378]: I0126 00:14:29.425093   11378 reconciler.go:217] operationExecutor.VerifyControllerAttachedVolume started for volume "kube-dns-config" (UniqueN
  Jan 26 00:14:29 master kubelet[11378]: I0126 00:14:29.427162   11378 reconciler.go:217] operationExecutor.VerifyControllerAttachedVolume started for volume "kube-dns-token-tpdkw" (Un
  Jan 26 00:14:30 master kubelet[11378]: W0126 00:14:30.147023   11378 pod_container_deletor.go:77] Container "7cb2acf1d1e6fa6183dcde381bbf120ff60308ac77a55921f23de2618130df52" not fou
  Jan 26 00:14:53 master kubelet[11378]: W0126 00:14:53.026037   11378 conversion.go:110] Could not get instant cpu stats: different number of cpus
  Jan 26 00:15:03 master kubelet[11378]: W0126 00:15:03.045872   11378 conversion.go:110] Could not get instant cpu stats: different number of cpus
  lines 1-23/23 (END)
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