- Lợi ích và Tính năng của Kubernetes
Tự động phục hồi Cập nhật liên tục (Rolling Update) Phát hiện dịch vụ và Cân bằng tải Sắp xếp lưu trữ Mở rộng ngang
- Các Thành phần Cốt lõi
2.1 Thành phần Node Master
- kube-apiserver
Chịu trách nhiệm tiếp nhận yêu cầu từ client, xác thực và ủy quyền Tương tác với cơ sở dữ liệu etcd Tiếp nhận yêu cầu đăng ký từ các node worker
- kuber-scheduler Bộ lập lịch
Chọn một node worker phù hợp để chạy container
- kube-controller-manager Trình quản lý bộ điều khiển
Quản lý tất cả các bộ điều khiển trong cụm Kubernetes (có trạng thái, không trạng thái, v.v.)
2.2 Thành phần Node Worker
- Động quản lý container
Có thể là docker, containerd Kubernetes từ phiên bản 1.25 trở đi đã ngừng sử dụng docker, chuyển sang containerd để tăng hiệu suất
- kubelet
Gọi động cơ container của node worker để quản lý toàn bộ vòng đời container Gửi yêu cầu đăng ký đến api server
- kube-proxy
Chịu trách nhiệm xuất bản dịch vụ và cân bằng tải (sử dụng lvs)
- Quy trình Tạo Container
-
Người dùng gửi yêu cầu tạo pod đến thành phần api server qua công cụ client
-
Sau khi nhận được yêu cầu, api server sẽ ghi thông tin yêu cầu (tên pod, image, volume, mạng, v.v.) vào cơ sở dữ liệu etcd
-
Thành phần scheduler sẽ định kỳ yêu cầu api server để hỏi có yêu cầu hoạt động nào không; api server truy vấn cơ sở dữ liệu etcd và phản hồi cho scheduler, scheduler sẽ biết có yêu cầu tạo pod
-
Scheduler chọn một node phù hợp theo thuật toán để lên kế hoạch tạo Pod, và trả về thông tin node đã chọn cho api server; api server ghi mối quan hệ giữa node và pod cần tạo vào cơ sở dữ liệu etcd
-
Sau khi khởi động, kubelet sẽ đăng ký với api server để api server biết có node đang chạy dịch vụ kubelet, và ghi thông tin node vào cơ sở dữ liệu etcd; như vậy scheduler mới có thể chọn node phù hợp để tạo pod dựa trên ghi chú trong cơ sở dữ liệu
-
Kubelet cũng định kỳ yêu cầu api server để hỏi có hoạt động nào cần thực hiện, api server truy vấn cơ sở dữ liệu và phản hồi cho kubelet, sau khi kubelet biết thông tin pod cần tạo, nó sẽ gọi container engine để tạo container
-
Sau khi container được tạo, để tiện truy cập, kube-proxy cung cấp cân bằng tải
-
Quy trình Triển khai
Đồng bộ hóa thời gian, tắt tường lửa, cấu hình không mật khẩu cho host, phân giải tên host, tắt swap trên tất cả các host, sửa đổi tham số kernel của host Cài đặt dependencies, docker-ce, containerd, kubeadm, kubectl, kubelet Cấu hình công cụ client crictl Tạo tệp khởi tạo cụm trên node Master Image được import bởi containerd nằm trong namespace k8s.io Định nghĩa biến môi trường KUBECONFIG Triển khai calico để kết nối mạng container
- Kubernetes-Pod
- Đơn vị nhỏ nhất mà cụm Kubernetes có thể quản lý
- Một pod chỉ chứa một container, pod giống như một cái hộp đựng container
- Hỗ trợ một pod chứa nhiều container, nhưng không nên sử dụng trong thực tế
- Thiết kế底层: Kubernetes sẽ sử dụng image pause để tự động tạo một container quản lý, dùng cho các thao tác quản lý container (IP, lưu trữ, v.v.) pause: Khi Kubernetes xây dựng container trong pod, nó cũng tự động tạo một container khác, sử dụng image pause, có container này Kubernetes mới có thể thực hiện lưu trữ, ip, v.v.
5.1 Lệnh pod
kubectl create -f xxx.yaml
Tạo container
kubectl get pod -n (namespace) -o wide
Xem thông tin chi tiết của pod
kubectl get pod -A
Xem tất cả pod
crictl ps -a
Xem thông tin container đã tạo
kubectl describe pod xx -n xx
Xem quá trình tạo pod, xử lý lỗi
kubectl logs xx -n xx
Xem log
kubectl exec -ti xx -n xx bash
Kết nối và đăng nhập
kubectl cp (tệp trên máy vật lý) xx:/(đường dẫn trong container) -n xx
Sao chép tệp giữa máy vật lý và pod
5.2 Tùy chọn thường dùng cho pod
apiVersion: v1 Chỉ định phiên bản api server, hiện tại là v1
kind: Pod Loại
metadata: Chỉ định thông tin metadata của Pod
name: web_db Tên container
namespace: web Namespace
spec: Định nghĩa thông tin cụ thể của container chạy trong pod
containers:
- name: mysql
image: mysql:8.0 Chỉ định tên image
imagePullPolicy: IfNotPresent Chỉ định chính sách tải image [Always|IfNotPresent|Never]
resources: Giới hạn tài nguyên
limits:
cpu: "2"
memory: "4Gi"
requests:
cpu: "1"
memory: "2Gi"
readinessProbe:
exec:
command: Chỉ định lệnh tự động thực hiện trong container
- mysqladmin
- ping
initialDelaySeconds: 5
periodSeconds: 2
# command:
# - sleep
# args: Chỉ định tham số lệnh
# - "3600"
# ports: Chỉ định cổng dịch vụ của container
# - containerPort: 80
# env: Truyền biến môi trường
# - name: Tên biến
# value: Giá trị
# restartPolicy [ Always | Never | OnFailure ] Chính sách khởi động lại container: phù hợp cho ứng dụng không trạng thái
5.3 Cơ chế kiểm tra trạng thái khỏe của pod
livenessprobe Kiểm tra pod có khởi động bình thường không
readnessprobe Kiểm tra pod có thể tiếp nhận yêu cầu bình thường không
httpGet Gửi yêu cầu http, nếu mã trạng thái giữa 200-400 thì dịch vụ khỏe, ngược lại không khỏe
readinessProbe:
httpGet:
path: /test
port: 80
scheme: HTTP
initialDelaySeconds: 10 // Thời gian trì hoãn
periodSeconds: 10 // Chu kỳ, tần suất
successThreshold: 3 // Số lần kiểm tra sau khi phục hồi
timeoutSeconds: 1 // Thời gian chờ
tcpSocket Áp dụng cho tất cả dịch vụ tcp
livenessProbe:
tcpSocket:
port: 6379
initialDelaySeconds: 10 // Thời gian trì hoãn
periodSeconds: 10 // Chu kỳ, tần suất
successThreshold: 3 // Số lần kiểm tra sau khi phục hồi
timeoutSeconds: 1 // Thời gian chờ
exec Thực thi lệnh shell, kiểm tra mã trạng thái của lệnh
readinessProbe:
exec:
- rpm
- -q
- httpd
initialDelaySeconds: 10 // Thời gian trì hoãn
periodSeconds: 10 // Chu kỳ, tần suất
successThreshold: 3 // Số lần kiểm tra sau khi phục hồi
timeoutSeconds: 1 // Thời gian chờ
- Kubernetes-Deployment (Không trạng thái)
Một loại pod đặc biệt
Lợi ích: 1, Hỗ trợ tự động duy trì bản sao 2, Hỗ trợ cập nhật liên tục
Ứng dụng: Dịch vụ thường xuyên cập nhật
Quy trình tạo deployment: -----> RS(ReplicaSet) -----> POD
- Bộ chọn nhãn (Kubernetes sử dụng nhãn để thiết lập mối quan hệ giữa tất cả các tài nguyên)
- Mỗi tài nguyên sẽ có nhãn tương ứng, nhãn thực tế là dữ liệu cặp khóa-giá trị
- Sử dụng nhãn để ánh xạ giữa ReplicaSet và Pod Bộ chọn nhãn: Nhãn là cặp dữ liệu key:value Thiết lập mối quan hệ giữa RS và Pod thông qua nhãn
6.1 Tạo deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: test1-deploy ###Tên cho deployment không trạng thái
spec:
replicas: 6 ##Số lượng bản sao pod
selector: ###Chỉ định nhãn cho replica set
matchLabels: ###Chỉ định nhãn cho replica set
app: centos7 ###Chỉ định nhãn cho replica set
template: ###Chỉ định nhãn cho pod
metadata: ###Chỉ định nhãn cho pod
labels: ###Chỉ định nhãn cho pod
app: centos7 Tên nhãn
spec: ###Viết thông tin container thực tế
containers:
- name: test1
image: centos:7
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
kubectl get deploy Xem deployment không trạng thái
kubectl get rs Xem replica set
kubectl get nodes --show-labels Xem nhãn pod
kubectl describe deploy nginx Xem thông tin mô tả của deployment
Thêm tham số cập nhật liên tục
apiVersion: apps/v1
kind: Deployment
metadata:
name: test2-nginx
spec:
replicas: 6
selector:
matchLabels:
app: nginx
strategy:
type: RollingUpdate //Loại cập nhật
rollingUpdate:
maxSurge: 2 //Số lượng cập nhật mỗi lần, định nghĩa tỷ lệ cập nhật mỗi lần, có thể là số hoặc phần trăm
maxUnavailable: 3 //Số lượng không hoạt động tối đa, nếu quá 3 pod cập nhật thất bại, toàn bộ cập nhật thất bại, tự động hoàn nguyên
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: test2-nginx
image: nginx:1.16
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80