Press ESC to close

The Techdoors BlogThe Techdoors Blog Mở cửa sổ và đón ánh nắng vào nhà

[CKA] 02. Vạch lá tìm sâu

Đến phần 2, mình sẽ cùng bạn đi “vạch lá tìm sâu” các thành phần con của 2 node. Mục đích để xem các thành phần này đã phối hợp ăn ý như thế nào, để tạo ra kiến trúc K8s lừng danh.

Kubernetes
├── Master Node - Control Plane 
   ├── etcd
   ├── kube-apiserver
   ├── kube-controller-manager
   └── kube-scheduler
└── Worker Node
    ├── kubelet
    └── kube-proxy

1. ETCD

1.1. Khái niệm

Theo trang kubernetes.io

etcd là kho lưu trữ key-value có tính nhất quán (consistent) và sẵn sàng cao (highy-available) được sử dụng làm kho lưu trữ chính cho tất cả dữ liệu của cụm trong Kubernetes.

etcd duy trì tính nhất quán bằng việc sử dụng giao thức Raft, đảm bảo rằng các node trong cụm có được dữ liệu giống nhau tại bất kỳ thời điểm nào.

Hình 2. Vị trí của etcd trong kiến trúc K8s.

etcd lưu trữ thông tin giống như một thư viện trong thực tế, cho phép mọi người đến đọc sách cũng như cho phép các thành phần khác truy cập và sử dụng dữ liệu của etcd.

1.2. Cấu trúc lưu trữ dữ liệu

etcd lưu trữ dữ liệu với cấu trúc cụ thể, phần đầu là thư mục gốc (root directory) – registry, theo sau là các object của kubernetes như nodes, pods, replica sets, deployments,…

Dữ liệu được lưu có format như sau:

/registry/<object-type>/<name-space>/<object-name>

Ví dụ:

/registry/pods/default/mypod
Hình 2. Cấu trúc lưu trữ dữ liệu của etcd trong K8s.

Thực hiện lệnh sau để list các key được lưu trữ (lệnh này chạy trong pod của etcd-master):

ShellScript
kubectl exec etcd-master -n kube-system etcdctl get / --prefix -keys-only
/registry/apiregistration.k8s.io/apiservices/v1.
/registry/apiregistration.k8s.io/apiservices/v1.apps
/registry/apiregistration.k8s.io/apiservices/v1.authentication.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.authorization.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.autoscaling
/registry/apiregistration.k8s.io/apiservices/v1.batch
/registry/apiregistration.k8s.io/apiservices/v1.networking.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.rbac.authorization.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.storage.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1beta1.admissionregistration.k8s.io

1.3. Cài đặt

Cách triển khai này được áp dụng trong trường hợp triển khai từ đầu (from scratch) từng thành phần như một service (triển khai trong master node).

Bước 1. Tải xuống và cài đặt

ShellScript
wget -q --https-only \
"https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz"

Bước 2. Cấu hình file etcd.service

ExecStart=/usr/local/bin/etcd \\
  --name ${ETCD_NAME} \\
  --cert-file=/etc/etcd/kubernetes.pem \\
  --key-file=/etc/etcd/kubernetes-key.pem \\
  --peer-cert-file=/etc/etcd/kubernetes.pem \\
  --peer-key-file=/etc/etcd/kubernetes-key.pem \\
  --trusted-ca-file=/etc/etcd/ca.pem \\
  --peer-trusted-ca-file=/etc/etcd/ca.pem \\
  --peer-client-cert-auth \\
  --client-cert-auth \\
  --initial-advertise-peer-urls https://${INTERNAL_IP}:2380 \\
  --listen-peer-urls https://${INTERNAL_IP}:2380 \\
  --listen-client-urls https://${INTERNAL_IP}:2379,https://127.0.0.1:2379 \\
  --advertise-client-urls https://${INTERNAL_IP}:2379 \\
  --initial-cluster-token etcd-cluster-0 \\
  --initial-cluster controller-0=https://${CONTROLLER0_IP}:2380,controller-1=https://${CONTROLLER1_IP}:2380 \\
  --initial-cluster-state new \\
  --data-dir=/var/lib/etcd

Trong đó, option --advertise-client-urls https://${INTERNAL_IP}:2379 (bật chứng chỉ TLS) giống như việc tích hợp ổ khoá vào thư viện (nơi chứa các quyển sách), giúp tăng cường bảo mật bằng cách mã hoá dữ liệu truyền qua mạng, và cần xác thực nếu muốn truy cập etcd.

2. Kube – API Server

2.1. Khái niệm

Theo trang kubernetes.io

Kube – API Server là front-end của master node (control plane), cung cấp API để truy cập và quản lý các tài nguyên trong cụm. API Server là đóng vai trò cầu nối giao tiếp giữa các thành phần khác trong hệ thống K8s.

Hình 3. Vị trí của kube-apiserver trong kiến trúc K8s.

Kubelet muốn giao tiếp với các thành phần bên trong master node đều phải đi qua kube-apiserver. Vì vậy, kube-apiserver được xem là front-end của master. Các thành phần bên trong master cũng phải đi qua trung gian “front-end” này nếu muốn giao tiếp với nhau.

Khi chạy lệnh kubectl, thực tế công cụ này đang gọi tới kube-apiserver để xử lý. Vậy khi nhận yêu cầu từ kubectl, bạn có thắc mắc kube-apiserver sẽ thực hiện gì ở bên trong, liệu có quy trình gì không. Câu trả lời là.. CÓ.

Quy trình hoạt động của kube-apiserver lúc nhận yêu cầu và xử lý gồm 6 bước như sau:

Bước 1 Authenticate user: Xác thực người dùng hoặc ứng dụng gửi yêu cầu.

Bước 2 Validate request: Kiểm tra tính hợp lệ của yêu cầu.

Bước 3 Retrieve data: Lấy dữ liệu từ etcd (cơ sở dữ liệu lưu trữ trạng thái của cụm).

Bước 4 Update ETCD: Cập nhật trạng thái mới vào etcd nếu có thay đổi.

Bước 5 Scheduler: Gửi thông tin đến scheduler để phân bổ tài nguyên cho pod.

Bước 6 Kubelet: Kubelet nhận thông tin và thực hiện các hành động cần thiết trên node.

2.2. Cài đặt

Cách này hướng dẫn cài đặt thủ công file binary từ trang phát hành của Kubernetes, khác với cách cài đặt bằng Kube admin tool (kubeadm).

Tải xuống và cấu hình chạy như một service trên master node.

wget https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-apiserver

File cấu hình

ExecStart=/usr/local/bin/kube-apiserver \\
  --advertise-address=${INTERNAL_IP} \\
  --allow-privileged=true \\
  --apiserver-count=3 \\
  --authorization-mode=Node,RBAC \\
  --bind-address=0.0.0.0 \\
  --enable-admission-plugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\
  --enable-swagger-ui=true \\
  --etcd-servers=https://127.0.0.1:2379 \\
  --event-ttl=1h \\
  --experimental-encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \\
  --runtime-config=api/all \\
  --service-account-key-file=/var/lib/kubernetes/service-account.pem \\
  --service-cluster-ip-range=10.32.0.0/24 \\
  --service-node-port-range=30000-32767 \\
  --v=2

Option etcd-servers chỉ định địa chỉ IP của component này.

3. Kube Controller Manager

Bất kỳ hệ thống nào cũng cần một “bộ não” để xử lý công việc, ví dụ như máy tính cần CPU để xử lý dữ liệu và thực hiện các phép số học, logic, dịch bit. Còn máy lạnh cần bộ điều khiển từ xa để điều chỉnh nhiệt độ phù hợp cho ngôi nhà. Do đó, K8s cũng không ngoại lệ, K8s cần một “bộ não”, một controller để quản lý và điều khiển hệ thống của mình. Vậy… controller là gì?

3.1. Khái niệm

Controller là một tiến trình (process) liên tục giám sát trạng thái của các component khác nhau trong hệ thống và hướng tới việc đưa toàn bộ hệ thống đến trạng thái hoạt động mong muốn.

Hình 3. Vị trí của kube-controller-manager trong kiến trúc K8s.

Một controller có 2 công việc

  • Theo dõi tình trạng (watch staus)
  • Khắc phục tình hình (remediate situation)

Để làm rõ khái niệm trên, mình sẽ đi sâu vào từng công việc của 2 controller chính thuộc kube-controller-manager

  • node-controller có trách nhiệm theo dõi tình trạng các node và thực hiện các hành động cần thiết để giữ cho các application chạy
  • replication-controller có nhiệm vụ dõi các bộ bản sao (replica sets), đảm bảo số lượng Pod mong muốn luôn available tại mọi thời điểm. Nếu một Pod “tèo”, nó sẽ tạo lại Pod khác (giống cơ chế hồi sinh nhỉ).

Ngoài ra còn nhiều controller khác như deployment-controller, namespace-controller, endpoint-controller, job-controller, PV-protection-controller, PV-binder-controller, service-account-controller, stateful-set, replicaset, cronjob, job-controller.

Tất cả các controller được đóng gói thành 1 tiến trình (process) duy nhất là kube-controller-manager, nên khi cài đặt xong kube-controller-manager, các controller đều sẽ được cài đặt.

3.2. Cài đặt

Cách này hướng dẫn cài đặt thủ công từ trang phát hành của Kubernetes, khác với cách cài đặt bằng Kube admin tool (kubeadm).

Tải về, giải nén và chạy dưới dạng 1 service

wget https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-controller-manager

File cấu hình kube-controller-manager.service

ExecStart=/usr/local/bin/kube-controller-manager \\
  --address=0.0.0.0 \\
  --cluster-cidr=10.200.0.0/16 \\
  --cluster-name=kubernetes \\
  --cluster-signing-cert-file=/var/lib/kubernetes/ca.pem \\
  --cluster-signing-key-file=/var/lib/kubernetes/ca-key.pem \\
  --kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\
  --leader-elect=true \\
  --root-ca-file=/var/lib/kubernetes/ca.pem \\
  --service-account-private-key-file=/var/lib/kubernetes/service-account-key.pem \\
  --service-cluster-ip-range=10.32.0.0/24 \\
  --use-service-account-credentials=true \\
  --v=2

  --node-monitor-period=5s
  --node-monitor-grace-period=40s

  --pod-eviction-timeout=5m0s

--controllers stringSlice    Default: [*]
A list of controllers to enable. '*' enables all on-by-default controllers, 'foo' enables the controller named 'foo', '-foo' disables the controller named 'foo'.
All controllers: attachdetach, bootstrapsigner, clusterrole-aggregation, cronjob, csrapproving, csrcleaner, csrsigning, daemonset, deployment, disruption, endpoint, garbagecollector, horizontalpodautoscaling, job, namespace, nodeipam, nodelifecycle, persistentvolume-binder, persistentvolume-expander, podgc, pv-protection, pvc-protection, replicaset, replicationcontroller, resourcequota, root-ca-cert-publisher, route, service, serviceaccount, serviceaccount-token, statefulset, tokencleaner, ttl, ttl-after-finished
Disabled-by-default controllers: bootstrapsigner, tokencleaner

3.3. Custom theo nhu cầu

Trong quá trình triển khai K8s, team hoặc tổ chức có nhu cầu tùy chỉnh một số option của controller như thay đổi địa chỉ kubeconfig, đổi ngưỡng để terminate các Pod nhanh hơn,… Do đó, K8s cung cấp file cấu hình cho phép người quản trị có thể tùy chỉnh controller theo nhu cầu của mình, tuy nhiên địa chỉ của file cấu hình này còn tùy thuộc vào cách cài đặt controller.

Cách 1: Nếu sử dụng kubeadm để cài đặt

kubeadm deploy kube-controller-manager dưới dạng Pod trong namespace kube-system trên master node. Có thể kiểm tra Pod controller bằng lệnh sau.

kubectl get pods -n kube-system

Kiểm tra các option trong file ở đường dẫn:

cat /etc/kubernetes/manifests/kube-controller-manager.yaml
spec:
  containers:
    - command:
        - kube-controller-manager
        - --address=127.0.0.1
        - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
        - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
        - --controllers=*,bootstrapsigner,tokencleaner
        - --kubeconfig=/etc/kubernetes/controller-manager.conf
        - --leader-elect=true
        - --root-ca-file=/etc/kubernetes/pki/ca.crt
        - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
        - --use-service-account-credentials=true

Cách 2: Nếu cài đặt kube-controller-manager từ trang phát hành Kubernetes
Kiểm tra các option trong file ở đường dẫn:

cat /etc/systemd/system/kube-controller-manager.service
[Service]
ExecStart=/usr/local/bin/kube-controller-manager \\
  --address=0.0.0.0 \\
  --cluster-cidr=10.200.0.0/16 \\
  --cluster-name=kubernetes \\
  --cluster-signing-cert-file=/var/lib/kubernetes/ca.pem \\
  --cluster-signing-key-file=/var/lib/kubernetes/ca-key.pem \\
  --kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\
  --leader-elect=true \\
  --root-ca-file=/var/lib/kubernetes/ca.pem \\
  --service-account-private-key-file=/var/lib/kubernetes/service-account-key.pem \\
  --service-cluster-ip-range=10.32.0.0/24 \\
  --use-service-account-credentials=true \\
  --v=2
Restart=on-failure
RestartSec=5

4. Kube Scheduler

Trong lĩnh vực sản xuất, việc phân loại sản phẩm, hàng hoá là vô cùng quan trọng, góp phần giảm thiểu thời gian đóng gói giao hàng đến cho người dùng. Hệ thống K8s cũng sở hữu một “máy phân loại”, có nhiệm vụ phân loại một Pod bất kỳ vào một node thích hợp, giúp tối ưu tính tài nguyên của hệ thống. Đó là Kube Scheduler.

4.1. Khái niệm

Theo trang kubernetes.io

Kube scheduler là một tiến trình trên control plane để gán các Pod lên các node. Scheduler xác định các node nào là vị trí thích hợp cho mỗi Pod trong hàng đợi theo các ràng buộc (constraint) và tài nguyên sẵn có.

4.2. How to work

Khi có một có application trong container, kube-scheduler lựa chọn một node phù hợp, đủ năng lực để khởi tạo Pod chứa container này. Việc lựa chọn, quyết định node dựa trên một số tiêu chí nhất định (certain criteria)

4.3. Cài đặt

Tải file kube-scheduler binary từ trang phát hành K8s, giải nén và sau đó chạy như 1 service

wget https://storage.googleapis.com/kubernetes release/release/v1.13.0/bin/linux/amd64/kube-scheduler

File cấu hình (kube-scheduler.service)

ExecStart=/usr/local/bin/kube-scheduler \\     
    --config=/etc/kubernetes/config/kube-scheduler.yaml \\    
    --v=2

4.4. Xem các option cài đặt hiện có (kubeadm)

Thực hiện lệnh sau

cat /etc/kubernetes/manifests/kube-scheduler.yaml

Nội dung file

spec:
  containers:
  - command:
    - kube-scheduler
    - --address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=true

4.5. Tìm kiếm service kube-scheduler trên máy

Thực hiện lệnh sau

ps -aux | grep kube-scheduler

Log

root      2477  0.8  1.6  48524 34044 ?        Ssl  17:31   0:08 kube-scheduler --address=127.0.0.1 --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=true

5. Kubelet

5.1. Khái niệm

Sau khi nhận thông tin đủ tiêu chuẩn tàu là thích hợp từ “điều phối viên” kube-scheduler. Thuyền trưởng kubelet xây dựng các container được chỉ định trên tàu của mình.

Theo trang kubernetes.io

Kubelet là một agent chạy trên mỗi node trong cụm. Nó đảm bảo rằng các container đang chạy trong 1 Pod.

Kubelet giống như thuyền trưởng của một node, chỉ huy hoạt động trên tàu như dựng container, dỡ container lên node, cung cấp thông tin về tình trạng của node thông qua kube-apiserver đến cho masternode.

kubelet có thể thực hiện 2 hành động sau:

  • Đăng ký node
  • Khởi tạo Pod

Workflow của quá trình khởi tạo Pod

Bước 1: kubelet request container runtime engine

Bước 2: Container runtime engine pull image được request

Bước 3: kubelet khởi tạo instance từ image đó

5.2. Cài đặt

6. Kube Proxy

Trong cụm K8s, mỗi Pod có thể tương tác, tiếp cận với một Pod khác, điều này được thực hiện bằng cách triển khai một giải pháp mạng là Pod network. Ngoài ra các giải pháp mạng khác còn có Calico, Cilium, Flannel,…

Vậy Pod network là gì?

Là một mạng ảo nội bộ (internal virtual network) trải rộng trên tất cả các node trong cụm mà tất cả các Pod kết nối tới, thông qua mạng này pod có thể giao tiếp với nhau.

Vậy còn kube-proxy là gì

kube-proxy là 1 tiến trình (process) chạy trên mỗi node trong cụm K8s. Công việc của nó là tìm kiếm các service mới, và mỗi khi 1 service mới đc tạo ra, nó tạo ra các rule thích hợp trên mỗi node để chuyển tiếp lưu lượng truy cập đến các service đó đến backend pod.

kube-proxy có thể tạo ra các rule iptables để quản lý và định tuyến lưu lượng mạng.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *