- vừa được xem lúc

[Kubernetes] Kubectl và các command cơ bản

0 0 59

Người đăng: Thu Nguyen Thi Thanh

Theo Viblo Asia

Mở đầu

Kubectl là công cụ quản trị Kubernetes thông qua giao diện dòng lệnh, cho phép bạn thực thi các câu lệnh trong Kubernetes cluster. Kubectl sử dụng Kubernetes API để tương tác với Kubernetes cluster. Để có thể sử dụng kubectl trong cluster, bạn sẽ cần phải thực hiện một số bước cài đặt và cấu hình cho nó, hãy xem thêm tại đây.

Thông qua các lệnh kubectl, bạn có thể triển khai các ứng dụng, theo dõi và quản lý tài nguyên của cluster. Trong bài viết này, mình sẽ cùng các bạn tìm hiểu các câu lệnh cơ bản nhất của kubectl, rất cần thiết cho việc quản trị các hệ thống Kubernetes.

Tạo và quản lý tài nguyên trong cluster

Kubectl create

Giả sử bạn đã có một Kubernetes cluster đang hoạt động, giờ đây bạn có thể triển khai ứng dụng của mình lên trên cluster. Để triển khai một ứng dụng lên cluster của mình, bạn cần tạo ra nhiều các loại tài nguyên khác nhau. Và với kubectl, bạn có thể tạo gần như bất cứ loại tài nguyên nào trong 1 cụm. Tài nguyên bạn tạo ra có thể bao gồm: namespace (ns), deployment, service, cronjob (cj), job. Bạn có thể quan sát một số ví dụ dưới đây:

Tạo một namespace mới

thanhthu ~ kubectl create namespace hello namespace/hello created

Tạo một deployment redis, sử dụng image redis

thanhthu ~ kubectl create deployment redis --image=redis deployment.apps/redis created

Tạo một job in ra "Hi, thanhthu"

thanhthu ~ kubectl create job hi --image=busybox -- echo "Hi, thanhthu"
job.batch/hi created

Kubectl edit

Sau khi đã tạo ra các tài nguyên cần thiết cho ứng dụng của mình, rất có thể trong quá trình test, vận hành sau đó bạn sẽ cần phải cập nhật và chỉnh sửa lại chúng. Khi đó, chúng ta có thể nghĩ đến việc sử dụng lệnh kubectl edit. Với lệnh này, bạn có thể chỉnh sửa bất cứ tài nguyên nào đang chạy trên cụm của mình.

Ví dụ, khi bạn muốn chỉnh sửa job vừa tạo ở trên, bạn có thể sử dụng lệnh Kubectl edit deployment/edit. Sau đó, file config của job này sẽ được mở với trình soạn thảo văn bản mặc định của bạn như sau:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata: annotations: deployment.kubernetes.io/revision: "1" creationTimestamp: "2020-12-17T02:20:22Z" generation: 1 labels: app: redis managedFields: - apiVersion: apps/v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:annotations: .: {} f:deployment.kubernetes.io/revision: {} f:status: f:availableReplicas: {} f:conditions: .: {} k:{"type":"Available"}: .: {} f:lastTransitionTime: {} f:lastUpdateTime: {} f:message: {} 

Sau đó bạn có thể chỉnh sửa những config cần thiết rồi lưu chúng lại:

thanhthu ~ kubectl edit deployment/redis
deployment.apps/redis edited

Kubectl delete

Khi bạn không còn cần dùng đến một tài nguyên nào đó, hãy sử dụng kubectl để xóa chúng đi để tránh lãng phí tài nguyên của cụm. Ví dụ:

thanhthu ~ kubectl delete job hi job.batch "hi" deleted
thanhthu ~ kubectl delete namespace hello namespace "hello" deleted

Lưu ý: Một lưu ý nho nhỏ là sau khi một tài nguyên bị xóa đi thì nó sẽ không thể khôi phục lại được mà bạn buộc phải tạo lại nó. Vậy nên trước khi xóa một tài nguyên nào đó, bạn hãy chắc chắn hiểu về tài nguyên đó và biết mình đang làm gì nhé ?))

Kubectl apply

Ngoài các cách tạo và chỉnh sửa tài nguyên kubernetes cluster đã nêu ở trên thì chúng ta còn có lệnh kubectl apply. So với việc sử dụng kubectl create hay kubectl edit thì kubectl apply mang lại nhiều sự linh hoạt hơn. kubectl apply quản lý các ứng dụng thông qua các tệp định nghĩa tài nguyên Kubernetes. Các tệp định nghĩa tài nguyên trong Kubernetes được gọi là các manifest file và có thể được viết bằng yaml hoặc json. Nó tạo và cập nhật các tài nguyên trong một cluster thông qua việc chạy kubectl apply. Đây là phương pháp tạo và sử dụng tài nguyên thường được áp dụng trong thực tế.

Ví dụ, tôi có một manifest file yaml có tên là deployment-nginx.yaml định nghĩa một deployment đơn giản như sau:

apiVersion: apps/v1
kind: Deployment
metadata: name: nginx-deployment
spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80

Sau đó, để tạo deployment trên, tôi chỉ cần thực hiện lệnh với cấu trúc kubectl apply (-f FILENAME | -k DIRECTORY).

thanhthu ~ kubectl apply -f deployment-nginx.yaml deployment.apps/nginx-deployment created

Để cập nhật các tài nguyên, ta chỉ cần chỉnh sửa các manifest file và thực hiện apply lại chúng.

Theo dõi, giám sát và khắc phục lỗi

Khi các ứng dụng triển khai trên cluster của bạn gặp lỗi hoặc khi vấn đề xuất phát từ chính cluster của bạn thì làm thế nào để bạn có thể tìm ra lỗi và khắc phục chúng? Trong những tình huống như vậy, người quản trị cluster thường sẽ nghĩ ngay đến việc sử dụng các lệnh kubectl để tìm ra nguyên nhân cũng như tìm ra cách giải quyết. Kubectl cung cấp nhiều các lệnh rất hữu ích giúp ta thực hiện điều đó.

Kubectl get

Câu lệnh kubectl get dùng để lấy danh sách về một đối tượng tài nguyên trong cluster, cùng với các thông tin cơ bản. Ví dụ:

thanhthu ~ kubectl get pods NAME READY STATUS RESTARTS AGE
redis-85d47694f4-tqp9d 1/1 Running 0 3h49m
nginx-deployment-6b474476c4-gkcbb 1/1 Running 0 122m
thanhthu ~ kubectl get namespaces NAME STATUS AGE
kube-system Active 139d
default Active 139d
kube-public Active 139d
kube-node-lease Active 139d
ingress-nginx Active 138d
cert-manager Active 138d
thanhthu  ~  kubectl get node NAME STATUS ROLES AGE VERSION
i121035-lt Ready master 139d v1.18.6+k3s1
thanhthu ~ kubectl get secret NAME TYPE DATA AGE
default-token-5xdxb kubernetes.io/service-account-token 3 139d

Ngoài ra, để lấy thông tin của một đối tượng với các thông số đầu đủ hơn, ta có thể sử dụng thêm tùy chọn -o wide, hoặc sử dụng tùy chọn -o yaml để lấy thông tin dưới dạng yaml như sau:

thanhthu ~ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
redis-85d47694f4-tqp9d 1/1 Running 0 3h58m 10.42.0.165 i121035-lt <none> <none>
nginx-deployment-6b474476c4-gkcbb 1/1 Running 0 131m 10.42.0.169 i121035-lt <none> <none>
thanhthu ~ kubectl get pod -o yaml apiVersion: v1
items:
- apiVersion: v1 kind: Pod metadata: creationTimestamp: "2020-12-17T02:20:22Z" generateName: redis-85d47694f4- labels: app: redis pod-template-hash: 85d47694f4 managedFields: - apiVersion: v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:generateName: {} f:labels: .: {} f:app: {}

Khi xảy ra lỗi, sử dụng kubectl get sẽ giúp ta có thể xác định được lỗi đang nằm ở đối tượng nào trong cluster.

Kubectl describe

Với kubectl describe, ta có thể lấy được thông tin mô tả chi tiết về một loại đối tượng. Trường hợp sử dụng phổ biến nhất của câu lệnh này là xem thông tin mô tả của một pod hay một node trong cụm để xem có lỗi được mô tả trong phần Events hay không hoặc tài nguyên có bị hạn chế hay không.

thanhthu ~ kubectl describe pods redis-85d47694f4-tqp9d Name: redis-85d47694f4-tqp9d
Namespace: default
Priority: 0
Node: i121035-lt/192.168.19.38
Start Time: Thu, 17 Dec 2020 09:20:22 +0700
Labels: app=redis pod-template-hash=85d47694f4
Annotations: <none>
Status: Running
IP: 10.42.0.165
IPs: IP: 10.42.0.165
Controlled By: ReplicaSet/redis-85d47694f4
Containers: redis: Container ID: docker://38aedd80a7b28383b7512c26def6acd02727ba31d3d61b4a3adbf2d4672cfea2 Image: redis Image ID: docker-pullable://_@.com:0f724af268d0d3f5fb1d6b33fc22127ba5cbca2d58523b286ed3122db0dc5381 Port: <none> Host Port: <none> State: Running Started: Thu, 17 Dec 2020 09:20:34 +0700 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-5xdxb (ro)
Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-5xdxb: Type: Secret (a volume populated by a Secret) SecretName: default-token-5xdxb Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>

Kubectl logs

Trong khi kubectl describe chủ yếu cho bạn biết thông tin về các sự khiện xảy ra với các ứng dụng đang chạy trong các pods của mình thì kubectl logs cung cấp chi tiết về tất cả những gì đang diễn ra trong kubernetes cluster của bạn liên quan đến một pod cụ thể. Bạn cũng cần hiểu được sự khác biệt này để xác định được lỗi xảy ra nằm bên trong ứng dụng của bạn hay nằm ở phía Kubernetes.

 thanhthu  ~  kubectl logs redis-85d47694f4-tqp9d 1:C 17 Dec 2020 02:20:34.518 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 17 Dec 2020 02:20:34.518 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 17 Dec 2020 02:20:34.518 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 17 Dec 2020 02:20:34.519 * Running mode=standalone, port=6379.
1:M 17 Dec 2020 02:20:34.519 # Server initialized
1:M 17 Dec 2020 02:20:34.520 * Ready to accept connections

Kubectl exec

Để khắc phục lỗi hoặc khi các lệnh đã nêu ở trên đều không mang lại cho bạn các thông tin cần thiết để tìm ra lỗi, rất có thể bạn sẽ phải truy cập vào một container cụ thể trong pod để khắc phục sự cố trực tiếp từ trong container. Cấu trúc của lệnh kubectl exec như sau:

kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...]

Ví dụ:

 thanhthu ~ kubectl exec -it redis-85d47694f4-tqp9d -c redis -- /bin/bash
_@.com:/data# 

Lưu ý: Với pod chỉ chứa 1 container thì bạn không cần chỉ định thêm tên container trong pod. Tuy nhiên với pod chứa nhiều container thì bạn cần sử dụng thêm tùy chọn -c để chỉ định tên của một container cụ thể. Ngoài ra, lệnh kubectl exec phải luôn đi kèm với shell mà bạn đang sử dụng trong pod.

Tạm kết

Trên đây là những câu lệnh cơ bản nhất mình thường sử dụng để quản trị một cụm Kubernetes cluster. Ngoài ra, còn rất nhiều các lệnh cùng nhiều tùy chọn khác nhau. Kubectl là một công cụ mạnh mẽ và rất hữu ích cho công việc quản trị cụm, bạn có thể tham khảo thêm một số lệnh khác từ Kubectl Cheat sheet này nhé. Cảm ơn các bạn đã theo dõi bài viết của mình!

Nguồn tham khảo

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đề thi interview DevOps ở Châu Âu

Well. Chào mọi người, mình là Rice - một DevOps Engineers ở đâu đó tại Châu Âu.

0 0 88

- vừa được xem lúc

In calculus, love also means zero.

Mình nhớ hồi năm 2 đại học, thầy giáo môn calculus, trong một giây phút ngẫu hứng, đã đưa ra cái definition này. Lúc đấy mình cũng không nghĩ gì nhiều.

0 0 65

- vừa được xem lúc

Chuyện thay đổi

Thay đổi là một thứ gì đó luôn luôn đáng sợ. Cách đây vài tháng mình có duyên đi làm cho một banking solution tên là X.

0 0 47

- vừa được xem lúc

Pet vs Cattle - Thú cưng và gia súc

Khái niệm. Pets vs Cattle là một khái niệm cơ bản của DevOps. Bài viết này sẽ nói về sự phát triển của các mô hình dịch vụ từ cốt lõi Pets and Cattle. 1.

0 0 34

- vừa được xem lúc

Git workflow được Google và Facebook sử dụng có gì hay ho

Với developer thì Git hẳn là công cụ rất quen thuộc và không thể thiếu rồi. Thế nhưng có mấy ai thực sự hiểu được Git.

0 0 85

- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

Namespace trong Kubernetes là gì. Tại sao nên sử dụng namespace.

0 0 113