这是一个为您提供快速参考的指南,涵盖了在使用 Kubernetes 时最常见的命令。我们将持续更新并添加更多命令,如果您有任何建议,请随时提出问题或提交拉取请求。
什么是Kubectl
Kubectl 是大多数 Kubernetes 工程师在与 Kubernetes 集群交互时主要使用的工具。它通过与 Kubernetes API 进行交互,将您输入的命令转换为 API 请求,并在 Kubernetes 集群上执行这些请求。
使用 Kubectl,您可以在集群上执行各种操作,例如创建、删除和更新部署、暴露应用程序、检查正在运行的 Pod 的日志,以及监视节点和整个集群的健康状况和容量。
要开始使用 Kubectl,您需要在本地机器上安装它。请参考下一节的安装说明。
通信原理
kubectl和Kubernetes集群之间的通信基于RESTful的HTTP请求和响应。以下图表说明了kubectl如何与Kubernetes资源进行交互:
当您使用 kubectl 发出命令时,该工具会读取您本地机器上的 kubeconfig 文件,并获取与 Kubernetes API 服务器进行身份验证所需的所有必要信息。该文件包括关于 Kubernetes 服务器地址、您的凭据和上下文信息的详细信息。
kubectl 和 API 服务器之间的连接通常通过 TLS 加密来确保没有篡改或窃听发生。
在 API 服务器处理您的请求之前,会进行身份验证和授权。API 服务器会验证您的凭据。Kubernetes 有多种认证方式,详细内容在以下文章中有详细介绍:Kubernetes - RBAC 和 Admission Controllers。
一旦您通过身份验证和授权,kubectl 命令将被转换为符合 Kubernetes API 规范的 API 请求。
该请求通常是一个 RESTful 的 HTTP 请求,包含特定的方法(GET、POST、PUT、DELETE 等)。它还针对相关的 API 端点(例如
/api/v1/namespaces/default/pods),并以 JSON 格式包含必要的数据(如果适用)。请求随后通过安全连接发送到 Kubernetes API 服务器,同时包含必需的标头和您的凭据。
在接收到 API 请求后,API 服务器会对其进行处理并执行必要的操作,例如创建或更新资源。
kubectl 从 Kubernetes API 服务器接收 API 响应,通常包含以 JSON 格式的数据、日志消息等。
最后,kubectl 将消息显示给用户在终端中。
如何安装 Kubectl
要安装 kubectl,您可以按照以下步骤进行操作:
首先,确定您的操作系统。kubectl 可以在 Windows、macOS 和 Linux 上运行。
- 对于 Windows 用户:
1.下载 kubectl? 的可执行文件。您可以在官方文档中找到适用于 Windows 的最新版本:
2.将下载的 kubectl? 可执行文件移动到您的 PATH 目录下,例如 C:\Windows\System32?,以便在任何位置都可以访问它。
3.打开命令提示符或 PowerShell,并运行以下命令以验证 Kubectl 是否正确安装:
kubectl version
- 对于 macOS 用户:
使用 Homebrew 包管理器安装 kubectl?。在终端中运行以下命令:
brew install kubectl
- 对于 Linux 用户:
使用包管理器安装 kubectl?。根据您使用的 Linux 发行版,运行以下命令之一:
- Debian/Ubuntu:
sudo apt-get update && sudo apt-get install -y kubectl
- CentOS/RHEL:
sudo yum install -y kubectl
- Fedora:
sudo dnf install -y kubectl
- 其他发行版:请参考您的发行版文档或使用适合您的包管理器来安装 kubectl?。
- 安装完成后,打开终端(命令提示符或终端窗口)并运行以下命令验证安装是否成功:
kubectl version --client
??
现在,您已经成功安装了 kubectl?,可以使用它与 Kubernetes 集群进行交互并管理资源。
集群信息
以下是一些获取和管理 Kubernetes 集群信息的常用命令:
- 获取集群信息:
- kubectl cluster-info
- 获取集群节点信息:
- kubectl get nodes
- 获取集群的命名空间:
kubectl get namespaces
- 获取集群中所有的 Pod:
kubectl get pods --all-namespaces
- 获取集群中所有的服务:
kubectl get services --all-namespaces
- 获取集群中所有的部署:
kubectl get deployments --all-namespaces
- 获取集群中所有的存储卷:
kubectl get pv
- 获取集群中所有的持久卷声明:
kubectl get pvc
- 获取集群中所有的配置映射:
kubectl get configmaps
- 获取集群中所有的角色:
kubectl get roles
- 获取集群中所有的角色绑定:
kubectl get rolebindings
- 获取集群中所有的服务账户:
kubectl get serviceaccounts
这些命令可以帮助您了解集群的整体状态和组件。您可以根据需要进一步扩展和管理集群。
资源管理
使用 Kubectl,您可以管理 Kubernetes 集群中的各种资源。以下是一些常见的资源管理命令:
- 创建一个资源(例如 Pod、部署或服务):
kubectl create <resource_type> <resource_name>
- 更新一个资源:
kubectl apply -f <resource_file>
- 替换一个资源:
kubectl replace -f <resource_file>
- 删除一个资源:
kubectl delete <resource_type> <resource_name>
- 删除一个资源文件:
kubectl delete -f <resource_file>
- 缩放一个部署:
kubectl scale deployment <deployment_name> --replicas=<replica_count>
这些命令可以帮助您创建、更新和删除集群中的资源。您可以根据需要使用适当的命令来管理资源。
检查资源
使用 Kubectl,您可以检查集群中各种资源的状态和详细信息。以下是一些常用的命令:
- 获取资源的详细信息:
kubectl describe <resource_type> <resource_name>
- 获取 Pod 的日志:
kubectl logs <pod_name>
- 获取 Pod 的详细信息:
kubectl describe pod <pod_name>
- 获取服务的详细信息:
kubectl describe service <service_name>
- 获取部署的详细信息:
kubectl describe deployment <deployment_name>
这些命令可以帮助您深入了解资源的状态、配置和问题。您可以使用它们来调试和监视集群中的组件。
创建和更新资源
使用 Kubectl,您可以创建和更新各种 Kubernetes 资源。以下是一些常见的命令:
- 创建一个资源(例如 Pod、部署或服务):
kubectl create <resource_type> <resource_name>
- 更新一个资源:
kubectl apply -f <resource_file>
- 替换一个资源:
kubectl replace -f <resource_file>
- 缩放一个部署:
kubectl scale deployment <deployment_name> --replicas=<replica_count>
这些命令可以帮助您在集群中创建和更新资源。您可以根据需要使用适当的命令来管理资源。
删除资源
使用 Kubectl,您可以删除集群中的各种资源。以下是一些常见的命令:
- 删除一个资源:
kubectl delete <resource_type> <resource_name>
- 删除一个资源文件:
kubectl delete -f <resource_file>
这些命令可以帮助您删除集群中不再需要的资源。请谨慎使用删除命令,以免意外删除重要的资源。
扩展部署
使用 Kubectl,您可以扩展部署来增加或减少 Pod 的副本数量。以下是一些常用的命令:
- 缩放一个部署:
kubectl scale deployment <deployment_name> --replicas=<replica_count>
- 增加一个部署的副本数量:
kubectl scale deployment <
暴露部署
在本节中,我们将学习如何使用 kubectl 暴露 Kubernetes 部署,使用不同的服务类型:ClusterIP、NodePort 和 LoadBalancer。暴露部署使应用程序可以被用户或其他服务访问,无论是在集群内部还是外部。
要暴露部署,可以使用以下命令:
- 使用 ClusterIP 服务类型:
kubectl expose deployment <deployment-name> --type=ClusterIP --port=<port>
这将创建一个 ClusterIP 类型的服务,将部署暴露在集群内部。
- 使用 NodePort 服务类型:
kubectl expose deployment <deployment-name> --type=NodePort --port=<port>
这将创建一个 NodePort 类型的服务,将部署暴露在集群的每个节点上的一个随机端口。
- 使用 LoadBalancer 服务类型:
kubectl expose deployment <deployment-name> --type=LoadBalancer --port=<port> --target-port=<target-port>
这将创建一个 LoadBalancer 类型的服务,将部署暴露在外部,并为其分配一个负载均衡器。
请注意,负载均衡器服务类型仅在支持负载均衡器的云提供商中受支持。
管理发布
使用以下命令,我们可以管理部署的发布。发布是部署过程的重要组成部分,它允许您在最小化停机时间并确保版本之间的平滑过渡时更新应用程序。
- 滚动更新部署:
kubectl set image deployment/<deployment-name> <container-name>=<new-image>
这将滚动更新指定部署中的容器,将其镜像更新为新的镜像。
- 查看发布状态:
kubectl rollout status deployment/<deployment-name>
这将显示指定部署的发布状态,以确定是否完成更新。
- 回滚发布:
kubectl rollout undo deployment/<deployment-name>
这将回滚指定部署的最近一次发布,将应用程序回退到先前的版本。
处理日志
使用以下命令,我们可以处理 Pod 的日志:
- 查看 Pod 日志:
kubectl logs <pod-name>
这将显示指定 Pod 的日志。
- 实时跟踪 Pod 日志:
kubectl logs -f <pod-name>
这将实时跟踪指定 Pod 的日志。
- 查看容器内特定容器的日志:
kubectl logs <pod-name> -c <container-name>
这将显示指定 Pod 中特定容器的日志。
在容器中执行命令
有时我们需要在容器中执行命令,以便进行特定操作或调试任务。以下是一些在容器中执行命令的示例:
- 在容器中执行单个命令:
kubectl exec <pod-name> -- <command>
这将在指定 Pod 的容器中执行单个命令。
- 在容器中启动交互式终端:
kubectl exec -it <pod-name> -- /bin/sh
这将在指定 Pod 的容器中启动一个交互式终端。
- 非常常见的进入容器的方式
kubectl exec -it <pod-name> -- /bin/bash # Bash shell
# 在容器和本地文件之间复制文件
kubectl cp <pod-name>:<path-to-file> <path-to-local-file> -c <container-name>
kubectl cp <path-to-local-file> <pod-name>:<path-to-file> -c <container-name>
端口转发
使用以下命令,我们可以将本地端口转发到 Pod 或服务的端口。如果应用程序没有直接暴露给外部世界,但您仍然希望访问它,端口转发是一个非常有用的功能。
- 将本地端口转发到 Pod:
kubectl port-forward <pod-name> <local-port>:<pod-port>
这将将本地端口转发到指定 Pod 的端口。
- 将本地端口转发到服务:
kubectl port-forward service/<service-name> <local-port>:<service-port>
这将将本地端口转发到指定服务的端口。
标记和注释资源
使用以下命令,我们可以向集群中的资源添加标签和注释。这对于组织和分组资源以及向资源附加元数据非常有用。
- 添加标签到资源:
kubectl label <resource-type> <resource-name> <key>=<value>
这将向指定资源添加标签。
- 添加注释到资源:
kubectl annotate <resource-type> <resource-name> <key>=<value>
这将向指定资源添加注释。
Taints and Tolerations
Taints 和 Tolerations 是控制 Pod 在节点上调度的一种方式。例如,我们可以使用 Taints 来防止 Pod 被调度到具有敏感数据的节点上。
Taints 应用于节点,指定了节点上的特殊条件。而 Tolerations 应用于 Pod,允许(但不要求)Pod 调度到具有匹配 Taints 的节点上。
- 添加 Taints 到节点:
kubectl taint nodes <node-name> <key>=<value>:<effect>
这将向指定节点添加 Taints。
- 添加 Tolerations 到 Pod 配置:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
tolerations:
- key: "<key>"
operator: "<operator>"
value: "<value>"
effect: "<effect>"
这将在 Pod 配置中添加 Tolerations。
配置Kubectl
kubectl config view # 显示合并的kubeconfig设置或指定的kubeconfig文件
kubectl config view --minify --output 'jsonpath={..namespace}' # 显示当前上下文中的命名空间
kubectl config current-context # 显示当前上下文
kubectl config use-context <context-name> # 在kubeconfig文件中设置当前上下文
kubectl config set-context <context-name> # 在kubeconfig中设置上下文条目
kubectl config set-cluster <cluster-name> # 在kubeconfig中设置集群条目
kubectl config set-credentials <user-name> # 在kubeconfig中设置用户条目
kubectl config unset users.<name> # 在kubeconfig中取消设置用户条目
在kubeconfig中设置集群条目
kubectl config set-cluster <cluster-name> \
--certificate-authority=<path-to-ca-file> \
--embed-certs=<true|false> \
--server=<address-and-port-of-api-server> \
--kubeconfig=<path-to-kubeconfig-file>
Dry Run
Dry run允许您预览将要对集群进行的更改,而不实际应用这些更改。这对于调试和测试非常有用。
kubectl apply --dry-run=client -f <file-name>
循环遍历资源
有时候需要循环遍历资源。例如,您想要删除命名空间中的所有Pod,可以使用以下命令完成。
kubectl get pods -o name | cut -d/ -f2 | xargs -I {} kubectl delete pod {}
for pod in $(kubectl get pods -o name | cut -d/ -f2); do kubectl delete pod $pod; done
循环遍历Secret数据项并打印出来
kubectl get secrets -o json | jq -r '.items[] | .metadata.name as $name | .data | to_entries[] | "\($name) \(.key): \((.value|@base64d))"'
使用cat?? 命令创建资源
使用 cat?? 命令可以从stdin创建资源
cat <<EOF | kubectl create -f -
# 创建一个名为nginx的Pod
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
EOF
获取API资源
kubectl api-resources
kubectl api-resources --namespaced=true # 获取命名空间资源
# 如何从kubectl获取curl调用,日志级别为9
kubectl get pods -v=9 2>&1 | grep curl # 获取特定资源的curl调用
kubectl get pods -v=9 2>&1 | grep curl | sed 's/.*curl -k -v -XGET/https/' | sed 's/ -H .*//' # 获取特定资源的curl调用
合并Kubeconfig文件
假设我们有两个Kubeconfig文件:config1??和config2??,我们可以使用以下命令将它们合并为一个文件。
KUBECONFIG=config1:config2 kubectl config view --flatten > merged-config
这将创建一个名为merged-config??的新文件,其中包含来自config1??和config2??的配置信息。
请注意,合并后的文件中的配置顺序将遵循KUBECONFIG??环境变量中指定的顺序。
更多
如果您对我分享的微服治理相关工具感兴趣,可以关注我了解更多微服务治理相关主题专栏: