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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 欢迎来到关于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 管理体验!

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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
10天前
|
canal Kubernetes Docker
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)
基于Kubernetes v1.25.0和Docker部署高可用集群(03部分)
|
11天前
|
Kubernetes Ubuntu Linux
基于Kubernetes v1.25.0和Docker部署高可用集群(02部分)
基于Kubernetes v1.25.0和Docker部署高可用集群(02部分)
|
10天前
|
Kubernetes iOS开发 Docker
Docker系列.Docker Desktop中如何启用Kubernetes
Docker系列.Docker Desktop中如何启用Kubernetes
21 5
|
4天前
|
Linux Docker 容器
在CentOS操作系统上使用yum安装/使用/卸载Docker容器引擎
在CentOS操作系统上安装、配置、使用和卸载Docker容器引擎的详细步骤,包括配置Docker镜像加速的方法。
23 0
|
4天前
|
Ubuntu NoSQL 关系型数据库
在Ubuntu操作系统上安装/使用/卸载Docker容器引擎
这篇文章详细介绍了在Ubuntu操作系统上安装、配置、使用、基本操作以及卸载Docker容器引擎的步骤,包括配置Docker镜像加速和使用Docker部署Nginx、MySQL和Redis服务器的方法。
20 0
|
5天前
|
Kubernetes jenkins 持续交付
Jenkins + SVN/Git + Maven + Docker + 阿里云镜像 + Kubernetes(K8S)
Jenkins + SVN/Git + Maven + Docker + 阿里云镜像 + Kubernetes(K8S)
10 0
|
8天前
|
Docker 容器
Docker cp 将宿主机上的文件复制到容器中
Docker cp 将宿主机上的文件复制到容器中
10 0
|
3天前
|
JSON JavaScript 开发者
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
【8月更文挑战第7天】Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
Composerize神器:自动化转换Docker运行命令至Compose配置,简化容器部署流程
|
1天前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
7 1
|
2天前
|
安全 Ubuntu Docker
深度挖掘Docker 容器
【8月更文挑战第16天】Docker容器间的连接是容器化技术的关键,支持容器与宿主机的数据交换。主要方法包括:1) 利用Docker网络驱动创建自定义网络,使容器相连通信;2) 采用Docker Compose通过配置文件简化多容器应用的部署与互联;3) 虽不推荐,早期使用--link参数实现容器互联;4) 通过环境变量配置连接信息;5) 共享卷支持文件共享和间接通信。推荐使用Docker网络和Docker Compose以实现高效灵活的容器间通信。
13 3