- Node trong Kubernetes
- Pod trong Kubernetes
- Làm việc với Pod
- Pod nhiều Container
- Ổ đĩa / Volume trong POD
Lệnh kubectl tương tác với Cluster, cú pháp chính
kubectl [command] [TYPE] [NAME] [flags]
Trong đó:
[command]
là lệnh, hành động nhưapply
,get
,delete
,describe
...[TYPE]
kiểu tài nguyên nhưns
,no
,po
,svc
...[NAME]
tên đối tượng lệnh tác động[flags]
các thiết lập, tùy thuộc loại lệnh
Cách lệnh làm việc với POD ở phần này:
Lệnh | Diến giải |
---|---|
kubectl get nodes |
Danh sách các Node trong Cluster |
kubectl describe node name-node |
Thông tin chi tiết về Node có tên name-node |
kubectl get pods |
Liệt kê các POD trong namespace hiện tại, thêm tham số -o wide hiện thị chi tiết hơn,
thêm -A hiện thị tất cả namespace, thêm -n namespacename hiện thị Pod của namespace
namespacename |
kubectl explain pod --recursive=true |
Xem cấu trúc mẫu định nghĩa POD trong file cấu hình yaml |
kubectl apply -f firstpod.yaml |
Triển khai tạo các tài nguyên định nghĩa trong file firstpod.yaml |
kubectl delete -f firstpod.yaml |
Xóa các tài nguyên tạo ra từ định nghĩa firstpod.yaml |
kubectl describe pod/namepod |
Lấy thông tin chi tiết POD có tên namepod , nếu POD trong namespace khác mặc định
thêm vào tham số -n namespace-name |
kubectl logs pod/podname |
Xem logs của POD có tên podname |
kubectl exec mypod command |
Chạy lệnh từ container của POD có tên mypod, nếu POD có nhiều container thêm vào tham số -c
và tên container |
kubectl exec -it mypod bash |
Chạy lệnh bash của container trong POD mypod và gắn terminal |
kubectl proxy |
Tạo server proxy truy cập đến các tài nguyên của Cluster.
http://localhost/api/v1/namespaces/default/pods/mypod:8085/proxy/ ,
truy cập đến container có tên mypod trong namespace mặc định.
|
kubectl delete pod/mypod |
Xóa POD có tên mypod |
Node trong Kubernetes
Trong Kubernetes Node là đơn vị nhỏ nhất xét về phần cứng. Nó là một máy vật lý hay máy ảo (VPS) trong cụm máy (cluster). Xem các nút (node) trong cụm (cluster) chạy lệnh:
kubectl get nodes
Để lấy thông tin chi tiết về một Node nào đó như tài nguyên bộ nhớ, CPU, các container ... sử dụng lệnh:
kubectl describe node tên-node
Có nhiều thông tin về NODE
Addresses
HostName
: Hostname của nodeInternalIP
: địa chỉ IP của node sử dụng trong nội bộ ClusterExternalIP
: địa chỉ IP của node có hiểu lực từ ngoài cluster liên lạc đến
Conditions
Thông tin trạng thái đang chạy của node, có các thông tin
Ready
: giá trị true - chấp nhận triển khai chạy các PodMemoryPressure
: giá trị true nếu cạn kiệt bộ nhớDiskPressure
: giá trị true nếu cạn kiệt đĩa lưu trữNetworkUnavailable
: giá trị true nếu cấu hình mạng lỗi
Capacity / Allocatable
Capacity cho biết tài nguyên có hiệu lực như CPU, bộ nhớ, số pod có thể chạy ... Allocatable
System Info
Các thông tin phần mềm trên hệ thống
Nhãn của Node
Thiết lập nhãn
kubectl label node worker1.xtl tennhan=giatrinhan
Lấy các tài nguyên có nhãn nào đó
kubectl get node -l "tennhan=giatrinhan"
Xóa nhãn
kubectl label node worker1.xtl tennhan-
Pods trong Kubernetes
Khái niệm Pod
Kubernetes không chạy các container một cách trực tiếp, thay vào đó nó bọc một hoặc vài container vào với nhau trong một cấu trúc gọi là POD. Các container cùng một pod thì chia sẻ với nhau tài nguyên và mạng cục bộ của pod.
Pod là thành phần đơn vị (nhỏ nhất) để Kubernetes thực hiện việc nhân bản (replication), có nghĩa là khi cần thiết thì Kubernetes có thể cấu hình để triển khai nhân bản ra nhiều pod có chức năng giống nhau để tránh quá tải, thậm chí nó vẫn tạo ra nhiều bản copy của pod khi không quá tải nhằm phòng lỗi (ví dụ node bị die).
Pod có thể có nhiều container mà pod là đơn vị để scale (có nghĩa là tất cả các container trong pod cũng scale theo) nên nếu có thể thì cấu hình ứng dụng sao cho một Pod có ít container nhất càng tốt.
- Cách sử dụng hiệu quả và thông dụng là dùng loại Pod trong nó chỉ chạy một container.
- Pod loại chạy nhiều container trong đó thường là đóng gọi một ứng dụng xây dựng với sự phối hợp chặt chẽ từ nhiều container trong một khu vực cách ly, chúng chia sẻ tài nguyên ổ đĩa, mạng cho nhau.
Mạng / Volume với POD
Mỗi POD được gán một địa chỉ IP, các container trong Pod chia sẻ cùng địa chỉ IP này. Các container trong cùng một Pod có thể liên lạc với nhau qua localhost (Giống PHP truy cập đến MySQL khi hai thành phần này cài đặt trong một máy).
Một Pod có thể có nhiều ổ đĩa được chia sẻ để các container có thể truy cập đọc/ghi dữ liệu.
Làm việc với Pod trong Kubernetes
Bạn có thể tạo ra Pod một cách trực tiếp (thực tế ít dùng) hoặc qua triển khai Deployment để Controller thực hiện, khi Pod được tạo ra nó được lên kế hoạch chạy trong một Node nào đó của cụm máy, nó tồn tại cho đến khi tiến trình chạy kết thúc hoặc bị xóa, bị lỗi Node ...
Controller: Khi bạn tạo các Pod không trực tiếp, tức thông qua cấu hình Deployment thì có một Controller thực hiện việc tạo quản lý các Pod cho bạn, thực hiện cách này nó cung cấp khả năng cập nhật giám sát, phục hồi ...
Liệt kê các Pod
# Liệt kê các pod ở namespace mặc định kubectl get pods # Hiện thị nhiều thông tin hơn kubectl get pod -o wide # Pod ở namepace: kubernetes-dashboard kubectl get pod -o wide -n kubernetes-dashboard # Pod ở tất cả các namespace kubectl get pod -A # Liệt kê các Pod có nhãn app: mypod kubectl get pod -l "app=mypod"
Tạo Pod từ file cấu hình .yaml
Có thể tạo Pod từ lệnh kubectl run
tuy nhiên nên khai báo Pod trong file config .yaml
rồi ra lệnh đọc file này và tạo pod với lệnh kubectl apply
Tạo ra một file đặt tên 1-swarmtest-node.yaml
, cấu trúc và các khai báo tham khảo với lệnh:
kubectl explain pod --recursive=true
Tham khảo chi tiết: Kubernetes API - Pod v1 core
1-swarmtest-node.yamlapiVersion: v1 kind: Pod metadata: labels: app: app1 ungdung: ungdung1 name: ungdungnode spec: containers: - name: c1 image: ichte/swarmtest:node resources: limits: memory: "150M" cpu: "100m" ports: - containerPort: 8085 # - containerPort: 8086
File trên khai báo một Pod, đặt tên là ungdungnode
,
gán nhãn app: app1
, ungdung: ungdung1
trong Pod chạy một Container từ image ichte/swarmtest:php
, cổng của Container 8085
Triển khai tạo Pod từ file này, thực hiện lệnh sau
kubectl apply -f firstpod.yaml
Mặc định Kubernetes không tạo và chạy POD ở Node Master để đảm bảo yêu cầu an toàn, nếu vẫn muốn chạy POD ở Master thi hành lệnh sau:
kubectl taint nodes --all node-role.kubernetes.io/master-
Tương tự có thể tạo triển khai một POD chạy container chạy nginx
2-nginx.yamlapiVersion: v1 kind: Pod metadata: name: nginxapp labels: app: nginxapp spec: containers: - name: n1 image: nginx:1.17.6 resources: limits: memory: "128Mi" cpu: "100m" ports: - containerPort: 80
Cũng khai báo một POD sử dụng Image ichte/coretools
(một image từ
Dockerfile
với Debian có cài đặt một số công cụ như vim, curl, wget ... để kiểm tra
)
apiVersion: v1 kind: Pod metadata: name: tools labels: app: tools spec: containers: - name: tools image: ichte/coretools resources: {} command: ["/bin/bash"] args: ["-c", "while true; do echo 'busybox running'; sleep 10;done"]
Xem thông tin chi tiết của Pod
Sử dụng lệnh
kubectl describe pod/namepod
Nếu Pod đó trong một namepace khác mặc định cần chỉ ra namespace -n namespace
Ví dụ tra cứu thông mypod
kubectl describe pod/mypod
Tra cứu log của Pod
kubectl logs pod/podname
Thi hành một lệnh của Pod
kubectl exec podname command [arg]
kubectl exec mypod ls /
Chạy tiến trình trong Pod và gắn vào terminal
kubectl exec -it mypod bash
Chú ý, nếu pod có nhiều container bên trong, thì cần chỉ rõ thi hành container nào bên trong nó
bằng tham số -c containername
Truy cập Pod từ bên ngoài Cluster (Kiểm tra - Debug)
Trong thông tin của Pod ta thấy có IP của Pod và cổng lắng nghe, tuy nhiên Ip này là nội bộ, chỉ các Pod trong Cluster liên lạc với nhau. Nếu bên ngoài muốn truy cập cần tạo một Service để chuyển traffic bên ngoài vào Pod (tìm hiểu sau), tại đây để debug - truy cập kiểm tra bằng cách chạy proxy
kubectl proxy
Hoặc
kubectl proxy --address="0.0.0.0" --accept-hosts='^*$'
Truy cập đến địa chỉ http://localhost/api/v1/namespaces/default/pods/mypod:8085/proxy/
Khi kiểm tra chạy thử, cũng có thể chuyển cổng để truy cập. Ví dụ cổng host 8080
được chuyển hướng truy cập đến cổng 8085
của POD mypod
kubectl port-forward mypod 8080:8085
Cấu hình thăm dò Container còn sống
Bạn có thể cấu hình livenessProbe
cho mỗi container, để Kubernetes kiểm tra xem container còn sống không.
Ví dụ, đường dẫn kiểm tra là /healthycheck
, nếu nó trả về mã header trong khoảng 200
đến 400
được coi là sống (tất nhiên bạn cần viết ứng dụng trả về mã này). Trong đó cứ 10s kiểm tra một lần
apiVersion: v1 kind: Pod metadata: name: mypod labels: app: mypod spec: containers: - name: mycontainer image: ichte/swarmtest:php ports: - containerPort: 8085 resources: {} livenessProbe: httpGet: path: /healthycheck port: 8085 initialDelaySeconds: 10 periodSeconds: 10
Xóa Pod
Bạn có thể xóa Pod bằng lệnh
kubectl delete pod/mypod
Hoặc
kubectl delete -f firstpod.yaml
Do những Pod này chạy trực tiếp (không phải triển khai qua Deployment, nên lệnh xóa Pod là nó mất hẳn, không tự động tạo lại).
Pod có nhiều container
Có thể chạy Pod mà bên trong có nhiều Container, ví dụ file multicontainerpod.yaml
sau khai báo có 2 container trong một Pod
apiVersion: v1 kind: Pod metadata: name: nginx-swarmtest labels: app: myapp spec: containers: - name: n1 image: nginx:1.17.6 resources: limits: memory: "128Mi" cpu: "100m" ports: - containerPort: 80 - name: s1 image: ichte/swarmtest:node resources: limits: memory: "150Mi" cpu: "100m" ports: - containerPort: 8085
Trong đó container n1, chạy từ image nginx:1.17.6
, s1 từ image ichte/swarmtest:node
Ổ đĩa / Volume trong POD
Để thêm các Volume đầu tiên cần định nghĩa ổ đĩa ở trường spec.volumes
.
Tại mỗi container gắn ổ đĩa vào nếu cần với thuộc tính volumeMounts
apiVersion: v1 kind: Pod metadata: name: nginx-swarmtest-vol labels: app: myapp spec: volumes: # Định nghĩa một volume - ánh xạ thư mục /home/www máy host - name: "myvol" hostPath: path: "/home/html" containers: - name: n1 image: nginx:1.17.6 resources: limits: memory: "128Mi" cpu: "100m" ports: - containerPort: 80 volumeMounts: - mountPath: /usr/share/nginx/html name: "myvol" - name: s1 image: ichte/swarmtest:node resources: limits: memory: "150Mi" cpu: "100m" ports: - containerPort: 8085 volumeMounts: - mountPath: /data/ name: "myvol"
Nếu muốn sử dụng ổ đĩa - giống nhau về dữ liệu trên nhiều POD, kể cả các POD đó chạy trên các máy khác nhau thì cần dùng các loại đĩa Remote - ví dụ NFS - loại đĩa này nói ở các phần sau.