欢迎来到关于Docker 🐋 & Kubernetes ☸️的新博客系列,我将根据我 2 年开发容器化应用程序的经验,揭开容器化的神秘力量。
我相信,在本系列结束时,您将能够轻松容器化和部署您的项目。
现在,让我们快速向您概述我将教您的内容。
table-of-blogs博客表✍️
docker-diveDocker 🐋 潜水:
- 容器背后的动机
- Docker 的演变
- 解读 Docker 术语
- 设置 Docker 和 Hello World
- 浏览第 3 方容器
- 使用 Docker 创建演示
- 构建 Docker 镜像 101
- 了解容器注册表
- 运行和管理容器
- 容器安全要点
- 与 Docker 对象交互
- 优化开发工作流程
- 代码到云:部署容器
kubernetes-journeyKubernetes ☸️ 之旅:
- Kubernetes 要点
- 构建本地 Kubernetes 集群
- 创建和扩展部署
- 使用 YAML 进行服务和部署
- 连接部署
- 切换运行时:Docker 到 CRI-O
介绍
管理 Kubernetes 集群和执行管理任务可能非常复杂且耗时。但是,使用正确的 kubectl 别名集,您可以简化 Kubernetes 管理并提高任务效率。在本文中,我们将探索一系列有用的 kubectl 别名,它们可以帮助您更快、更轻松地执行常见任务。从检索资源信息到对 Pod 进行故障排除和管理节点,这些别名将成为 Kubernetes 工具包中的宝贵工具。因此,让我们深入研究并发现简化 Kubernetes 管理所需的 kubectl 别名!
prerequisites先决条件
在开始使用这些有用的 kubectl 别名之前,请确保您的工作站满足以下先决条件:
- 库贝克特尔
- 克鲁插件管理器
- Kubectl-neat Krew 插件
- 一个~/.kube文件夹
the-alias-list别名列表
以下是您可以添加到 shell 配置中的有用 kubectl 别名的列表:
# autocomplete kubectl & helm source <(kubectl completion zsh) source <(helm completion zsh) alias k=kubectl # when using below aliases, print kubectl command and then execute it function kctl() { echo "+ kubectl $@" && command kubectl $@ } # add aliases collection like 'kgpo' for 'kubectl get pods` from https://github.com/ahmetb/kubectl-aliases [ ! -f ~/.kube/aliases.sh ] && curl -fsSL "https://raw.githubusercontent.com/ahmetb/kubectl-aliases/master/.kubectl_aliases" > ~/.kube/aliases.sh && sed -i -e 's/kubectl/kctl/g' ~/.kube/aliases.sh source ~/.kube/aliases.sh # set default namespace alias kn='kctl config set-context --current --namespace' # get events sorted by last timestamp alias kgel='kctl get events --sort-by=.lastTimestamp' # get events sorted by creation timestamp alias kgec='kctl get events --sort-by=.metadata.creationTimestamp' # get pod's descending events function kger() { kctl get events --sort-by=.lastTimestamp --field-selector involvedObject.name="$@" } # get 'real' all alias kgworld='kctl get $(kubectl api-resources --verbs=list --namespaced -o name | paste -sd ",")' # display all nodes resources request and limits alias kgnr="k get nodes --no-headers | awk '{print \$1}' | xargs -I {} sh -c 'echo {} ; kubectl describe node {} | grep Allocated -A 5 | grep -ve Event -ve Allocated -ve percent -ve -- ; echo '" # start a debug pod (including lots of troubleshooting tools) alias kdebug="kctl -n default run debug-$USER --rm -it --tty --image leodotcloud/swiss-army-knife:v0.12 --image-pull-policy=IfNotPresent -- bash" # get pod's containers list function kgpc() { kctl get pod -o jsonpath="{.spec.containers[*].name}" "$@" && echo "" } # ping a service, ex: 'kping whoami:8080' alias kping='kctl run httping -it --image bretfisher/httping --image-pull-policy=IfNotPresent --rm=true --' # get existing pod's yaml without forbidden fields, ex: 'kyaml pod whoami' function kyaml() { kubectl get "$@" -o yaml | kubectl-neat } # display and delete failed pods in current namespace alias krmfailed='kctl delete pods --field-selector=status.phase=Failed'
用例解释
让我们深入研究这些别名的一些用例和解释。
1-write-basic-commands-faster1.更快地编写基本命令
kubectl-aliases Github 存储库包含一个生成数百个基本别名的脚本,这些别名包含在上面的列表中。
生成的 800 个别名中的一些是:
alias k='kubectl' alias kg='kubectl get' alias kgpo='kubectl get pod' alias ksysgpo='kubectl --namespace=kube-system get pod' alias krm='kubectl delete' alias krmf='kubectl delete -f' alias krming='kubectl delete ingress' alias krmingl='kubectl delete ingress -l' alias krmingall='kubectl delete ingress --all-namespaces' alias kgsvcoyaml='kubectl get service -o=yaml' alias kgsvcwn='kubectl get service --watch --namespace' alias kgsvcslwn='kubectl get service --show-labels --watch --namespace' alias kgwf='kubectl get --watch -f' ...
然而,回忆命令的用途可能具有挑战性:
$> kgcmslwn main # NAME DATA AGE LABELS # kube-root-ca.crt 1 144d <none> # logstash-config 1 100d app=logstash,chart=logstash,heritage=Helm,release=ls # logstash-pipeline 1 100d app=logstash,chart=logstash,heritage=Helm,release=ls # ls-finance-config 1 61d app=ls-finance,chart=logstash,heritage=Helm,release=ls-finance # ls-finance-pipeline 1 61d app=ls-finance,chart=logstash,heritage=Helm,release=ls-finance
为了解决这个问题,我们添加了一个在执行命令之前显示完整命令的功能。这提供了清晰度并帮助您理解该命令的作用:
$> kgcmslwn main + kubectl get configmap --show-labels --watch --namespace main # NAME DATA AGE LABELS # kube-root-ca.crt 1 144d <none> # logstash-config 1 100d app=logstash,chart=logstash,heritage=Helm,release=ls # logstash-pipeline 1 100d app=logstash,chart=logstash,heritage=Helm,release=ls # ls-finance-config 1 61d app=ls-finance,chart=logstash,heritage=Helm,release=ls-finance # ls-finance-pipeline 1 61d app=ls-finance,chart=logstash,herit
2. 获取排序和过滤的事件
对 Kubernetes 集群中的事件进行排序可能具有挑战性。我们添加了别名来按上次查看日期和创建时间戳对事件进行排序。
$> kgel -A + kubectl get events --sort-by=.lastTimestamp -A # NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE # illu-for-designers 22m Warning Unhealthy pod/auth-server-67c944c549-7qmmj Startup probe failed: Get "http://10.0.8.148:8080/auth-server/actuator/health/liveness": dial tcp 10.0.8.148:8080: connect: connection refused # fix-analytics-env 3m23s Warning BackOff pod/marketplace-test-6b9955d469-9zq2n Back-off restarting failed container # elk 2m44s Normal WaitForFirstConsumer persistentvolumeclaim/ls-logstash-ls-logstash-0 waiting for first consumer to be created before binding # illu-for-designers 2m4s Warning BackOff pod/backoffice-5c88b6d84-mv88z Back-off restarting failed container $> kgec -A + kubectl get events --sort-by=.metadata.creationTimestamp -A # NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE # elk 4m4s Normal WaitForFirstConsumer persistentvolumeclaim/ls-logstash-ls-logstash-0 waiting for first consumer to be created before binding # fix-analytics-env 4m43s Warning BackOff pod/marketplace-test-6b9955d469-9zq2n Back-off restarting failed container # illu-for-designers 3m20s Warning BackOff pod/bff-66b6b7bc4b-l8s82 Back-off restarting failed container # illu-for-designers 23m Warning Unhealthy pod/auth-server-67c944c549-7qmmj Startup probe failed: Get "http://10.0.8.148:8080/auth-server/actuator/health/liveness": dial tcp 10.0.8.148:8080: connect: connection refused
此外,您可以使用别名过滤特定资源的事件kger:
$> kger auth-server-67c944c549-7qmmj + kubectl get events --sort-by=.lastTimestamp --field-selector involvedObject.name=auth-server-67c944c549-7qmmj # LAST SEEN TYPE REASON OBJECT MESSAGE # 26m Warning Unhealthy pod/auth-server-67c944c549-7qmmj Startup probe failed: Get "http://10.0.8.148:8080/auth-server/actuator/health/liveness": dial tcp 10.0.8.148:8080: connect: connection refused # 99s Warning BackOff pod/auth-server-67c944c549-7qmmj Back-off restarting failed container
3-display-every-resources-really3.显示所有资源(真的)
该kubectl get all命令实际上并不显示所有资源。为了克服这个限制,我们创建了kgworld别名。此别名使用 检索所有资源kubectl get $(kubectl api-resources --verbs=list --namespaced -o name | paste -sd ",")。
4-display-nodes-resources-requests-and-limits4. 显示节点资源请求和限制
要查看集群中节点的资源请求和限制,您可以使用别名kgnr。此别名提供了每个节点的 CPU 和内存分配的清晰概述。
$> kgnr # ip-10-0-17-119.eu-west-1.compute.internal # Resource Requests Limits # cpu 935m (23%) 6300m (160%) # memory 11952Mi (80%) 10948Mi (73%) # ip-10-0-31-235.eu-west-1.compute.internal # Resource Requests Limits # cpu 1415m (36%) 8900m (227%) # memory 14259Mi (96%) 15326Mi (103%)
5.启动瑞士军刀调试pod
当 Pod 缺乏必要的故障排除工具时,调试 Pod 可能会很困难。
别名kdebug通过启动一个预装所有基本工具的调试 Pod 来解决这个问题:arping、arptables、bridge-utils、ca-certificates、conntrack、curl、docker、dnsutils、ethtool、iperf、iperf3、iproute2、ipsec-tools 、 ipset、 iptables、 iputils-ping、 jq、 kmod、 kubectl、 ldap-utils、 less、 libpcap-dev、 man、 manpages-posix、 mtr、 net-tools、 netcat、 netcat-openbsd、 openssl、 openssh-client、 psmisc 、socat、tcpdump、telnet、tmux、traceroute、tcptraceroute、树、ngrep、vim、wget、yq。
6-get-pods-containers-list6. 获取pod的容器列表
要检索 pod 内的容器列表,您可以使用别名kgpc。当您需要使用 Pod 中的特定容器时,这非常有用:
$> kgpc ebs-csi-controller-b77c4f786-dxv4g -n kube-system + kubectl get pod -o jsonpath={.spec.containers[*].name} ebs-csi-controller-b77c4f786-dxv4g -n kube-system # ebs-plugin csi-provisioner csi-attacher csi-snapshotter csi-resizer liveness-probe
7-ping-a-service7.Ping 服务
测试 Kubernetes 服务的可用性可能具有挑战性。该kping别名使用HTTP Ping Docker 映像来 ping 服务并检查其可用性:
$> kgsvc + kubectl get service # NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE # api ClusterIP 172.20.251.151 <none> 80/TCP 12d # auth-server ClusterIP 172.20.241.45 <none> 80/TCP 144d # backend ClusterIP 172.20.89.116 <none> 80/TCP 144d # webapp ClusterIP 172.20.68.65 <none> 80/TCP 144d $> kping auth-server:80 + kubectl run httping -it --image bretfisher/httping --image-pull-policy=IfNotPresent --rm=true -- auth-server:80 # If you don't see a command prompt, try pressing enter. # connected to 172.20.241.45:80 (159 bytes), seq=1 time= 4.63 ms # connected to 172.20.241.45:80 (159 bytes), seq=2 time= 2.07 ms # connected to 172.20.241.45:80 (159 bytes), seq=3 time= 1.90 ms # connected to 172.20.241.45:80 (159 bytes), seq=4 time= 2.30 ms
8-get-a-runnable-manifest-of-an-deployed-resource8. 获取已部署资源的可运行清单
使用 检索已部署资源的 YAML 时kubectl get pod -o=yaml,某些字段是不必要的,并且可能会在重新部署 YAML 时导致问题。别名kyaml通过提供排除不必要字段的可运行清单来解决此问题。
这取决于先决条件中提到的kubectl-neat 。
9-delete-failed-and-evicted-pods9. 删除失败(和驱逐)的 Pod
失败的 Pod 可能会使集群混乱并影响性能。该krmfailed别名允许您轻松删除当前命名空间中失败的 Pod。
conclusion结论
这些 kubectl 别名提供了一种简化 Kubernetes 管理任务的便捷方法。通过使用这些别名,您可以在使用 kubectl 命令时节省时间和精力。无论您需要检索特定信息、对 Pod 进行故障排除还是管理资源,这些别名都可以满足您的需求。
因此,请尝试一下,享受更高效的 Kubernetes 管理体验!
缺少一些有用的别名?请在评论里指教🤓