Đế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.
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
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):
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
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.
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.
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