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

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

0 0 26

Người đăng: Trịnh Quốc Việt

Theo Viblo Asia

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:

  • 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:

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:

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:

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:

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

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é!

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