Docker 🐋 和 Kubernetes 的初学者到专家指南 ☸️ | 系列

简介: 欢迎来到关于Docker 🐋 & Kubernetes ☸️的新博客系列,我将根据我 2 年开发容器化应用程序的经验,揭开容器化的神秘力量。我相信,在本系列结束时,您将能够轻松容器化和部署您的项目。现在,让我们快速向您概述我将教您的内容。

欢迎来到关于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 别名之前,请确保您的工作站满足以下先决条件:

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 管理体验!

缺少一些有用的别名?请在评论里指教🤓

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
909 108
|
4月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1871 10
|
4月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
358 1
|
7月前
|
存储 Kubernetes 监控
Docker与Kubernetes集成挑战及方案
面对这些挑战,并不存在一键解决方案。如同搭建灌溉系统需要考虑多种因素,集成Docker与Kubernetes也需要深思熟虑的规划、相当的技术知识和不断的调试。只有这样,才能建立起一个稳定、健康、高效的Docker-Kubernetes生态,让你的应用像花园中的植物一样繁荣生长。
338 63
|
9月前
|
存储 Kubernetes 调度
Kubernetes、Docker和Containerd的关系解析
总的来说,Docker、Containerd和Kubernetes之间的关系可以用一个形象的比喻来描述:Docker就像是一辆装满货物的卡车,Containerd就像是卡车的引擎,而Kubernetes就像是调度中心,负责指挥卡车何时何地送货。
424 12
|
10月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
398 25
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
521 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
1453 19