8個Kubernetes運維的技巧
本文轉(zhuǎn)載自微信公眾號「新鈦云服」,作者祝祥 翻譯。轉(zhuǎn)載本文請聯(lián)系新鈦云服公眾號。
在本文中,我們將探索一些技巧和竅門,這些技巧將使使用Kubernetes更加容易。下面給出的大多數(shù)技巧都使用kubectl,這是一個功能強(qiáng)大的命令行工具,可讓您對Kubernetes集群執(zhí)行命令。
1.設(shè)置默認(rèn)namespace
您可以使用namespace(例如,Dev1,Dev2,QA1,QA2等)將Kubernetes集群劃分為多個環(huán)境,并且每個環(huán)境可以由不同的用戶管理。運行kubectl命令的不便之一是,每次編寫命令時,都需要在最后使用該--namespace 選項。運維人員通常會忘記這一點,最終在錯誤的namespace中創(chuàng)建對象(pod,service,deployment)。
使用此技巧,您可以在運行kubectl命令之前設(shè)置namespace首選項。在執(zhí)行kubectl命令之前運行以下命令,它將為您的當(dāng)前上下文保存所有后續(xù)kubectl命令的namespace:
- kubectl config set-context $(kubectl config current-context) --namespace=mynamespace
下面列出了一些最常用和有用的namespace命令:
- kubectl get namespaces
- kubectl create namespace mynamespace
- kubectl get pods --all-namespaces (列出所有namespace中具有狀態(tài)的所有Pod。)
- kubectl get po -o wide -n -n -n (此命令將標(biāo)識每個namespace中的容器)
- kubectl describe namespace
- kubectl config view --minify | grep namespace (此命令將確保您為當(dāng)前上下文正確設(shè)置namespace。)
2.配置常用的aliases別名以節(jié)省時間
Kubernetes命令可能很長,因此設(shè)置一些別名來運行kubectl非常有幫助。您將不再需要一遍又一遍地拼出完整的命令,當(dāng)您想在一個會話中執(zhí)行多個Kubernetes命令時,您的工作變得更加輕松。
我們在下面列出了一些常用命令的別名。在執(zhí)行kubectl命令之前運行這些命令,以節(jié)省一些時間。示例:您只需要輸入 k 而不是輸入 kubectl:
- alias k='kubectl'
- alias kc='k config view --minify | grep name'
- alias kdp='kubectl describe pod'
- alias krh='kubectl run --help | more'
- alias ugh='kubectl get --help | more'
- alias c='clear'
- alias kd='kubectl describe pod'
- alias ke='kubectl explain'
- alias kf='kubectl create -f'
- alias kg='kubectl get pods --show-labels'
- alias kr='kubectl replace -f'
- alias kh='kubectl --help | more'
- alias krh='kubectl run --help | more'
- alias ks='kubectl get namespaces'
- alias l='ls -lrt'
- `alias ll='vils -rt | tail-1'`
- alias kga='k get pod --all-namespaces'
- alias kgaa='kubectl get all --show-labels'
3.使用vi編輯YAML
有許多不同的編輯器可用于編寫YAML文件,但是在很多時候,您可能需要在終端上快速調(diào)整生成的YAML。這是使用我們經(jīng)常使用vi的地方,vi是最初為Unix操作系統(tǒng)創(chuàng)建的文本編輯器。
Vi編輯器有據(jù)可查,并且得到了開源社區(qū)很好的支持。但是,創(chuàng)建YAML文件時vi編輯器的問題之一是格式問題。我們需要一種縮進(jìn)制表符并與空格對齊的方法。在編輯YAML文件時,總是使用制表符和空格鍵來產(chǎn)生空格(例如,在按回車鍵時,將2個空格作為YAML的默認(rèn)值)。
創(chuàng)建 ~/.vimrc 并添加以下內(nèi)容,從而使創(chuàng)建YAML文件并用vi編輯變得更加容易:
- set smarttab
- set expandtab
- set shiftwidth=4
- set tabstop=4
- set number
4.從kubectl命令創(chuàng)建YAML
我們可以使用kubectl工具從命令行創(chuàng)建復(fù)雜的YAML文件。
大多數(shù)人會認(rèn)為,使用YAML文件很無聊,而Kubernetes的YAML文件可能非常冗長且難以從頭開始創(chuàng)建。使用kubectl命令而不是使用編輯器從空白頁創(chuàng)建YAML文件要容易得多。
以下命令將創(chuàng)建一個YAML文件 yamlfile。通過這些kubectl命令創(chuàng)建YAML文件后,您可以根據(jù)需要對其進(jìn)行修改并使用它,而不用從頭開始編寫:
- kubectl run busybox --image=busybox --dry-run=client -o yaml --restart=Never > yamlfile.yaml
- kubectl create job my-job --dry-run=client -o yaml --image=busybox -- date > yamlfile.yaml
- kubectl get -o yaml deploy/nginx > 1.yaml (Ensure that you have a deployment named as nginx)
- kubectl run busybox --image=busybox --dry-run=client -o yaml --restart=Never -- /bin/sh -c "while true; do echo hello; echo hello again;done" > yamlfile.yaml
- kubectl run wordpress --image=wordpress –-expose –-port=8989 --restart=Never -o yaml
- kubectl run test --image=busybox --restart=Never --dry-run=client -o yaml -- bin/sh -c 'echo test;sleep 100' > yamlfile.yaml (最后的增加 --bin 。這將創(chuàng)建yaml文件。)
創(chuàng)建YAML文件的另一個好辦法是使用wget 命令直接從Internet獲得文件 。
5.在Kubernetes namespace之間切換
在技巧1中,我們學(xué)習(xí)了一些有用的命令來使用Kubernetes namespace并保存它們,以便您不必添加到每個命令中。讓我們擴(kuò)展技巧,使其更容易在namespace和kubectl上下文之間切換。
有幾種工具可以提供幫助,但是我們喜歡使用kubectx和kubens分別管理上下文和namespace。您可以在此處(https://github.com/ahmetb/kubectx/)找到kubectx和kubens的詳細(xì)信息。
這是如何下載用于kubectx和kubens實用程序的Linux二進(jìn)制文件:
- wget
https://github.com/ahmetb/kubectx/releases/download/v0.9.0/kubectx_v0.9.0_linux_x86_64.tar.gz
- wget
https://github.com/ahmetb/kubectx/releases/download/v0.9.0/kubens_v0.9.0_linux_x86_64.tar.gz
然后,使用以下命令提取它們:
- tar -xvf kubectx_v0.9.0_linux_x86_64.tar.gz
- tar -xvf kubens_v0.9.0_linux_x86_64.tar.gz
最后,將它們移至PATH:
- tar -xvf kubectx_v0.9.0_linux_x86_64.tar.gz
- tar -xvf kubens_v0.9.0_linux_x86_64.tar.gz
安裝后,您可以簡單地使用kubens列出namespace并在它們之間切換:
當(dāng)使用多個集群時,kubectx使在上下文之間切換變得輕而易舉:
6. Shell自動補(bǔ)全
您知道kubectl為BASH和ZSH提供自動完成功能嗎?這是一個可選配置。
假設(shè)您了解Kubernetes的概念并且對kubectl有一定的經(jīng)驗,但是也許您
不太擅長記住命令。首先安裝bash-completion,然后啟用kubectl自動補(bǔ)全。您可以在適用于您環(huán)境的“ Install and Set kubectl(https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion) ”文檔頁面中找到所有詳細(xì)信息。
以下是具有自動完成功能的配置選項:
7.查看資源利用率
Top命令可能是監(jiān)視進(jìn)程和系統(tǒng)資源的最受歡迎的工具之一。它提供了一個基于字符的簡單界面,可以快速訪問關(guān)鍵信息。
您可以看到每個節(jié)點的資源利用率:
每個Pod的資源利用率:
便捷的監(jiān)視命令可以幫助您以理想的時間間隔顯示命令,而不必一遍又一遍地運行它。以下示例使它每五秒鐘運行一次(默認(rèn)值為兩秒鐘):
- watch kubectl top node -n 5
注意: 需要為您的環(huán)境下載watch工具。
您的Kubernetes集群也需要運行heapster才能執(zhí)行top命令,否則您將收到以下錯誤:“Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)”
8.擴(kuò)展kubectl并使用原始輸出創(chuàng)建自己的命令
Kubectl命令提供了apiserver存儲的資源的摘要視圖。apiserver存儲了許多未顯示的字段。您可以將kubectl get命令與原始資源輸出一起使用,以創(chuàng)建自己的可視化文件和命令。
您可以使用以下命令在JSON中打印原始資源:
- kubectl get deployments -o json
您還可以使用api直接調(diào)用資源:
- kubectl get --raw=/apis/apps/v1/deployments
您甚至可以將輸出與jq之類的工具結(jié)合使用,以提供不同的可視化效果,過濾輸出或?qū)⑤敵鎏峁┙o其他工具以實現(xiàn)自動化。
例如,在具有多個namespace和部署的集群上很難找到問題,但是下面的示例使用原始API掃描集群中的所有deployment,并僅過濾具有失敗副本的deployment:
- kubectl get --raw=/apis/apps/v1/deployments | jq ``'.items[] | {name: .metadata.name, replicas: .status.replicas, available: (.status.availableReplicas // 0), unavailable: (.status.unavailableReplicas // 0)} | select (.unavailable > 0)'
以下是上面命令的快速說明:
- 首先,我們調(diào)用Kubernetes API返回所有deployment。默認(rèn)輸出為JSON。很難形象化JSON文檔的結(jié)構(gòu),但是您可以通過管道將其傳遞給jq以獲得更好的輸出,例如下面的示例:
- kubectl get --raw=/apis/apps/v1/deployments | jq .
- 請注意,輸出中對每個deployment都有一個數(shù)組。最后我們要檢查這個數(shù)組的狀態(tài)字段。下面的命令顯示如何在字段不可用時僅打印所需的數(shù)據(jù)和默認(rèn)值0:
- kubectl get --raw=/apis/apps/v1/deployments | jq ``'.items[] | {name: .metadata.name, replicas: .status.replicas, available: (.status.availableReplicas // 0), unavailable: (.status.unavailableReplicas // 0)}'
- 最后一個難題是使用select函數(shù)僅顯示具有不可用副本的deployment:
- kubectl get --raw=/apis/apps/v1/deployments | jq ``'.items[] | {name: .metadata.name, replicas: .status.replicas, available: (.status.availableReplicas // 0), unavailable: (.status.unavailableReplicas // 0)} | select (.unavailable > 0)'
*本文譯自 https://www.ibm.com/cloud/blog/8-kubernetes-tips-and-tricks,版權(quán)歸原作者所有