+40

[K8S Phần 22] Thao tác với Kubectl đơn giản hơn với Alias

Giới thiệu

Hello mọi người. Trong quá trình làm việc với Kubernetes chắc chắn chúng ta sẽ phải thao tác rất nhiều với kubectl.

Mọi việc sẽ chẳng có gì đáng nói nếu chúng ta chỉ sử dụng để tạo và quản lý tài nguyên đơn giản. Chỉ khi có issue và chúng ta cần troubleshot, lúc đó mới cần thực hiện hàng loạt các lệnh kiểm tra, xem logs, debug.. thì tuần suất sử dụng lệnh mới thực sự cao. Lúc này việc sử dụng kubectl thế nào cho hiệu quả và "cool ngầu" sẽ trở nên cần thiết.

Trong bài viết ngày hôm nay mình sẽ chia sẻ một vài kinh nghiệm cá nhân của mình về cách tùy biến khi sử dụng kubectl để quản lý tài nguyên trên Kubernetes một cách hiệu quả nhé!

Những điều bạn NÊN làm

Nên chỉ làm việc với một cluster một lúc

Cấu hình của kubectl cho phép chúng ta quản lý và thao tác với multi-cluster khá đơn giản. Mình có thể switch giữa các context để chọn các cluster để xử lý.

Tuy nhiên tính năng này lại cũng có những hạn chế hay rủi ro, đó là bạn cần phải cực kỳ tập trung khi thực hiện. Nếu không có thể đang gõ đúng lệnh nhưng lại nhầm cluster đó. Và "nếu điều đó xảy ra" thì đúng là thảm họa.

Nên nhớ rằng khi chúng ta switch context thì ngoài kết quả chỉ hiển thị ngay đó, còn qua một thời gian thao tác bạn sẽ phải tự nhớ mình đang làm việc với context nào hoặc phải check lại trước khi thao tác tiêp bằng lệnh get current context.

Có một giải pháp workaround cho vấn đề này là tạo nhiều user trên client tương ứng với các cluster khác nhau, như vậy khi ta cần thao tác với cluster nào thì sẽ switch sang user đó. Tên của user ở dấu nhắc sẽ giúp chúng ta không bị nhầm lần thao tác giữa các cluster khác nhau.

Ý tương này như sau: image.png

  • Khi cần thao tác với cluster của project1 (tên là project1-cluster) thì sẽ switch sang user có tên tương ứng là "project1-cluster". Ở môi trường user này sẽ chỉ cấu hình kubeconfig kết nối tới cluster "project1-cluster"
  • Khi cần thao tác với cluster của project2 (tên là project2-cluster) thì sẽ switch sang user có tên tương ứng là "project2-cluster". Ở môi trường user này sẽ chỉ cấu hình kubeconfig kết nối tới cluster "project2-cluster"
  • Khi switch sang user nào thì tên user đó luôn gợi cho bạn về cluster bạn đang thao tác và sẽ không bị gõ lệnh nhầm server nữa

Cấu hình sẵn các namespace cần làm việc

Tương tự như với cluster, cấu hình của kubectl cho phép chúng ta định nghĩa tới namespace cụ thể cho một context. Và khi bạn đang cần (hoặc là đang chỉ được phép) thao tác ở một namespace cụ thể nào đó, ví dụ như "staging" chằng hạn. Lúc đó thay vì mỗi câu lệnh bạn phải thêm "-n staging" thì bạn có thể set luôn namespace trong context và khi gõ lệnh sẽ không cần chỉ định namespace nữa (trừ khi bạn muốn thao tác với namespace khác namespace khai báo trong context".

Khi đã áp dụng điều 1 bên trên, tức là với mỗi file kubeconfig sẽ chỉ khai báo tới một cluster duy nhất thì ta sẽ áp dụng tiếp là tạo ra các context ứng với các namespace tương ứng của cluster đó.

Ý tưởng như sau: image.png

Khi đó khi ta cần ưu tiên làm việc với namespace nào hơn thì ta sẽ set sang context tương ứng với namespace đó để đỡ phải thêm tham số "-n namespace" trong câu lệnh kubectl.

Ví dụ cụ thể, mình có 1 cluster có 2 namespace mình thường xuyên làm việc là monitoring và production. Thì mình đã tạo 2 context tương ứng:

[project1-cluster@viettq-svr ~]$ k config get-contexts
CURRENT   NAME          CLUSTER             AUTHINFO                                    NAMESPACE
          monitoring    project1-cluster    clusterUser_RG_DEMO_PROD_project1-cluster   monitoring
          production    project1-cluster    clusterUser_RG_DEMO_PROD_project1-cluster   production

Khi cần làm việc chính với namespace monitoring thì sẽ dùng context "monitoring":

[project1-cluster@viettq-svr ~]$ k config use-context monitoring
Switched to context "monitoring".
[project1-cluster@viettq-svr ~]$ k get pods
NAME                                                     READY   STATUS    RESTARTS   AGE
alertmanager-stable-kube-prometheus-sta-alertmanager-0   2/2     Running   0          191d
prometheus-msteams-57fb4647bc-gkwz8                      1/1     Running   4          191d
prometheus-stable-kube-prometheus-sta-prometheus-0       2/2     Running   0          164d
stable-grafana-6b8ff9484f-rn5bs                          3/3     Running   1          191d
stable-kube-prometheus-sta-operator-574697ccb7-2fgxv     1/1     Running   0          291d
stable-kube-state-metrics-5dbcd9689-dpvck                1/1     Running   0          291d
stable-prometheus-node-exporter-25fft                    1/1     Running   0          291d
stable-prometheus-node-exporter-45l4r                    1/1     Running   0          290d
stable-prometheus-node-exporter-72rpf                    1/1     Running   10         291d

Khi cần làm việc chính với namespace production thì sẽ dùng context "production":

[project1-cluster@viettq-svr ~]$ k config use-context production
Switched to context "production".
[project1-cluster@viettq-svr ~]$ k get pods 
NAME                                                           READY   STATUS      RESTARTS   AGE
busybox                                                        1/1     Running     172        7d4h
pro-api-app-6cfdd54875-l677c                                   1/1     Running     0          42h
pro-api-app-6cfdd54875-l8rm4                                   1/1     Running     0          42h
pro-api-portal-77576b6749-4666f                                1/1     Running     0          42h
pro-api-portal-77576b6749-xt5tm                                1/1     Running     0          42h
pro-api-web-7f557fbcf8-j6w7c                                   1/1     Running     0          41h
pro-api-web-7f557fbcf8-mgwhd                                   1/1     Running     0          42h
pro-mng-frontend-6f959785fd-hgxrp                              1/1     Running     0          35d

Cài đặt autocomplete cho kubectl

Nếu bạn có thể gõ lệnh kubectl cả ngày mà không dùng tới autocomplete thì bạn quả lý một tay to thực thụ. Nhưng bù lại bạn sẽ rất nhớ các keyword.

Tuy nhiên lời khuyên của mình là NÊN, CỰC KỲ NÊN cấu hình autocomplete, vừa tiết kiệm thời gian vừa giảm sai số khi gõ lệnh. Cấu hình autocomplete thì đơn giản có mấy bước ntn thôi:

#add permanent alias
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "alias k=kubectl" >> ~/.bashrc
echo "complete -F __start_kubectl k" >> ~/.bashrc
source ~/.bashrc

Dùng thêm alias để tăng tốc độ gõ lệnh và nhìn có vẻ "pro-vip" hơn

Khi bạn đã có cấu hình context + autocomplete thì tốc độ gõ của bạn đã được cải thiện đáng kể do không phải gõ namespace và phần còn lại thì được autocomplete rồi.

Tuy nhiên dùng thêm alias để gọi nhanh những lệnh thường dùng sẽ còn tăng tốc gõ lệnh của bạn lên gấp vài lần nữa. Nhưng trước hết chúng ta hãy điểm qua các nhóm lệnh thường dùng với kubectl trước nhé!

Nhóm tài nguyên trên kubernetes

Các bạn có thể xem thông tin các loại tài nguyên trên k8s bằng lệnh kubectl api-resources, kết quả sẽ kiểu như sau (đã lược bớt output):

NAME                      SHORTNAMES   APIVERSION                    NAMESPACED   KIND
configmaps                cm           v1                            true         ConfigMap
nodes                     no           v1                            false        Node
persistentvolumeclaims    pvc          v1                            true         PersistentVolumeClaim
persistentvolumes         pv           v1                            false        PersistentVolume
pods                      po           v1                            true         Pod
secrets                                v1                            true         Secret
serviceaccounts           sa           v1                            true         ServiceAccount
services                  svc          v1                            true         Service
deployments               deploy       apps/v1                       true         Deployment
statefulsets              sts          apps/v1                       true         StatefulSet
clusterrolebindings                    rbac.authorization.k8s.io/v1  false        ClusterRoleBinding
clusterroles                           rbac.authorization.k8s.io/v1  false        ClusterRole
rolebindings                           rbac.authorization.k8s.io/v1  true         RoleBinding
roles                                  rbac.authorization.k8s.io/v1  true         Role

Các resource thông thường chúng ta sẽ làm việc cùng gồm các loại sau: image.png

Quản lý tài nguyên với kubectl

Khi thực hiện các thao tác quản lý tài nguyên với kubectl ta thường sử dụng theo cú pháp sau:

kubectl [action] [resource-type] [resource-name] [option] Mình liệt kê một số action và option cơ bản thường dùng (chứ ko phải tất cả) ở đây: image.png

Kết hợp giữa Action + Resource-Type + Resource-Name + Option ta sẽ có được một lệnh. Ví dụ:

kubectl get pods -owide 
kubectl delete service myservice

Cách gán alias để gọi lệnh nhanh và dễ nhớ

Ta sẽ thực hiện các quy ước alias cho action và resource-type, còn các tham số option/namespace ta sẽ để dạng biến môi trường để dễ dàng gán thêm vào câu lệnh:

export ow="-owide"
export oy="-oyaml"
export sortby_age="--sort-by=metadata.creationTimestamp"
export sortby_status="--sort-by=status.phase"
export sortby_name="--sort-by=metadata.name"
export sortby_node="--sort-by=spec.nodeName"
export show_spec="--show-managed-fields=false"
export show_label="--show-labels"

Quy ước: image.png

Từ quy tắc trên ta có thể thực hiện các alias để gọi lệnh nhanh như sau: image.png

Khi cần thực hiện:

kubectl get pods ==> Chỉ cần gọi: kgp

kubectl describe node worker-1 ==> Chỉ cần gọi: kin worker-1

kubectl get pods -owide --sort-by=metadata.creationTimestamp ==> Chỉ cần gọi: kgp $ow $sortby_age.

Trong khi gõ phần $sortby_age bạn chỉ cần gõ 1-2 ký tự rồi có thể ấn tab để complete tên biến chứ cũng không phải gõ cả đầy đủ tên biến.

Theo luồng ý tưởng trên các bạn có thể add thêm nội dung alias như sau:

#Nodes
alias kgn="kubectl get nodes"
alias kin="kubectl describe nodes"

#Pods
alias kgp="kubectl get pods"
alias kep="kubectl edit pods"
alias krmp="kubectl delete pods"

#Deployments
alias kgdp="kubectl get deployments"
alias kedp="kubectl edit deployments"
alias krmdp="kubectl delete deployments"

#ReplicaSet
alias kgrs="kubectl get replicasets"
alias kers="kubectl edit replicasets"
alias krmrs="kubectl delete replicasets"

#Statefulset
alias kgsts="kubectl get statefulsets"
alias kests="kubectl edit statefulsets"
alias krmsts="kubectl delete statefulsets"

#DaemonSet
alias kgds="kubectl get daemonsets"
alias keds="kubectl edit daemonsets"
alias krmds="kubectl delete daemonsets"

#CronJob
alias kgcj="kubectl get cronjobs"
alias kedcj="kubectl edit cronjobs"
alias krmcj="kubectl delete cronjobs"

#Job
alias kgj="kubectl get jobs"
alias kedj="kubectl edit jobs"
alias krmj="kubectl delete jobs"

#Service
alias kgsvc="kubectl get services"
alias kedsvc="kubectl edit services"
alias krmsvc="kubectl delete services"

#Endpoints
alias kgep="kubectl get endpoints"
alias kedep="kubectl edit endpoints"
alias krmep="kubectl delete endpoints"

#Ingress
alias kgig="kubectl get ingress"
alias kedig="kubectl edit ingress"
alias krmig="kubectl delete ingress"

#ConfigMap
alias kgcm="kubectl get configmaps"
alias kedcm="kubectl edit configmaps"
alias krmcm="kubectl delete configmaps"

#Secret
alias kgsec="kubectl get secrets"
alias kedsec="kubectl edit secrets"
alias krmsec="kubectl delete secrets"

#Secret
alias kgsec="kubectl get secrets"
alias kedsec="kubectl edit secrets"
alias krmsec="kubectl delete secrets"

#PersistentVolumeClaim
alias kgpvc="kubectl get persistentvolumeclaims"
alias krmpvc="kubectl delete persistentvolumeclaims"
alias kedpvc="kubectl edit persistentvolumeclaims"

#PersistentVolume
alias kgpv="kubectl get persistentvolumes"
alias krmpv="kubectl delete persistentvolumes"
alias kedpv="kubectl edit persistentvolumes"

#horizontalpodautoscalers
alias kghpa="kubectl get horizontalpodautoscalers"
alias krmhpa="kubectl delete horizontalpodautoscalers"
alias kedhpa="kubectl edit horizontalpodautoscalers"

#networkpolicies
alias kgnp="kubectl get networkpolicies"
alias krmnp="kubectl delete networkpolicies"
alias kednp="kubectl edit networkpolicies"

#Role
alias kgro="kubectl get roles"
alias krmro="kubectl delete roles"
alias kedro="kubectl edit roles"

#RoleBinding
alias kgrb="kubectl get rolebindings"
alias krmrb="kubectl delete rolebindings"
alias kedrb="kubectl edit rolebindings"

#ClusterRole
alias kgcr="kubectl get clusterroles"
alias krmcr="kubectl delete clusterroles"
alias kedcr="kubectl edit clusterroles"

#ClusterRoleBinding
alias kgcb="kubectl get clusterrolebindings"
alias krmcb="kubectl delete clusterrolebindings"
alias kedcb="kubectl edit clusterrolebindings"

#storageclasses
alias kgsc="kubectl get storageclasses"
alias krmsc="kubectl delete storageclasses"
alias kedsc="kubectl edit storageclasses"

Tổng kết

Việc mới sử dụng alias sẽ cần mất thời gian để làm quen. Khi đã quen rồi chắc chắn gõ lệnh sẽ rất mượt 😃

Các bạn thấy nội dung hữu ích thì cho mình 1 nút upvote vào bài viết để lấy động lực ra biết tiếp nhé!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.