K9S (Bài trước)
(Bài tiếp) ReplicaSet, HPA

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
kubernetes

Để 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
kubernetes

Có nhiều thông tin về NODE

Addresses

  • HostName: Hostname của node
  • InternalIP: địa chỉ IP của node sử dụng trong nội bộ Cluster
  • ExternalIP: đị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 Pod
  • MemoryPressure: 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.

kubernetes

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"
kubernetes

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.yaml
apiVersion: 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.yaml
apiVersion: 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 )

3-tools.yaml
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
kubernetes

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

4-nginx-swamtest.yaml
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

5-nginx-swamtest-vol.yaml
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.


Đăng ký nhận bài viết mới
K9S (Bài trước)
(Bài tiếp) ReplicaSet, HPA