文章目录
一、Kubectl
简介
kubectl
是 Kubernetes 的命令行工具,用于与 Kubernetes 集群交互。它允许用户通过命令行来部署和管理应用程序、查看和管理集群资源,以及获取集群的状态信息。下面是一些 kubectl
常用的功能:
-
管理资源:
- 创建、更新、删除以及查看 Kubernetes 资源,如 pods、services、deployments 等。
- 例如,
kubectl get pods
用于获取当前集群中所有 pods 的信息。
-
配置管理:
- 配置和查看 Kubernetes 集群的配置详情。
- 使用
kubeconfig
文件管理多个集群访问。
-
排查问题:
- 收集 pods 和其他资源的日志,通过
kubectl logs
。 - 访问正在运行容器的命令行,通过
kubectl exec
。
- 收集 pods 和其他资源的日志,通过
-
查看集群状态:
- 查看集群的当前状态和运行的服务,使用诸如
kubectl cluster-info
命令。
- 查看集群的当前状态和运行的服务,使用诸如
-
应用升级和滚动更新:
- 控制应用程序的升级和回滚,通过
kubectl apply
和kubectl rollout
来管理。
- 控制应用程序的升级和回滚,通过
总之,kubectl
是运维和开发人员与 Kubernetes 集群交互的强大工具,帮助管理复杂的分布式应用程序的生命周期。要有效使用 kubectl
,用户通常需要对 Kubernetes 的资源模型和核心概念有一定的了解。
基础命令
kubectl [command] [TYPE] [NAME] [FLAGS]
- command是对k8s资源执行的动作和操作。例如,get、create、apply、delete。
- type表示要操作的资源类型。常见的资源pods、services、deployments、nodes 等。
- NAME 是资源的名称,用于指定特定资源进行操作。如果不指定 NAME,通常意味着操作涉及该类型的所有资源。
- FLAGS 是可选的标志,用于修改命令的行为或提供额外的信息。常见的标志-n(指定命名空间);-o (json yaml wide)指定输出格式;-all,当删除资源师,将操作所有这些资源,kubectl delete pods --all。
1.基本信息命令
获取资源列表:
kubectl get pods
:列出所有 Pods。kubectl get services
:列出所有 Services。kubectl get deployments
:列出所有 Deployments。kubectl get nodes
:列出集群中的所有节点。
获取详细信息
kubectl describe pod <pod-name>
:显示特定 Pod 的详细信息。kubectl describe service <service-name>
:获取特定 Service 的详细信息。
排错的时候有用
2.创建和更新资源命令
-
创建资源:
kubectl create deployment nginx --image=nginx
:创建一个 nginx Deployment。
-
应用 YAML 配置:
kubectl apply -f <filename>.yaml
:根据 YAML 文件创建或更新资源。
一般选择使用yaml文件配置。
3.删除资源命令
- 删除资源:
kubectl delete pod <pod-name>
:删除一个 Pod。kubectl delete -f <filename>.yaml
:根据 YAML 文件删除资源。
4. 查看日志和调试命令
-
查看 Pod 日志:
kubectl logs <pod-name>
:查看 Pod 的日志输出。kubectl logs -f <pod-name>
:持续跟踪 Pod 的日志。
-
在容器中执行命令:
kubectl exec -it <pod-name> -- /bin/bash
:进入 Pod 中运行的容器的交互式 shell。kubectl exec <pod-name> -- ls /app
:在指定 Pod 的容器中运行ls /app
命令。
5. 端口转发和复制文件命令
-
端口转发:
kubectl port-forward <pod-name> <local-port>:<pod-port>
:将本地端口转发到 Pod 上指定的端口。
-
复制文件:
kubectl cp <pod-name>:/path/to/file /local/path
:从一个 Pod 复制文件到本地系统。kubectl cp /local/path <pod-name>:/path/to/file
:将本地文件复制到 Pod。
6. 部署管理命令
-
滚动更新状态:
kubectl rollout status deployment/<deployment-name>
:查看滚动更新的状态。
-
回滚更新:
kubectl rollout undo deployment/<deployment-name>
:回滚到上一个 Deployment 版本。
7. 伸缩命令
-
伸缩 Deployment:
kubectl scale deployment <deployment-name> --replicas=3
:将 Deployment 的副本数量调整为 3。
8. 配置和上下文管理命令
-
查看集群信息:
kubectl cluster-info
:显示当前集群的信息。
-
切换上下文:
kubectl config use-context <context-name>
:切换到不同的 kubeconfig 上下文。
-
列出命名空间:
kubectl get namespaces
:列出所有的命名空间。
9.常用命令
kubectl get pod -A
查看所有的pod
kubectl get pods NAME -o wide
查看pod的扩展信息
kubectl cluster-info
查看集群信息
kubectl config view
用于查看当前kubeconfig配置信息的命令。
kubeconfig 文件存储了如何连接到一个或多个 Kubernetes 集群的信息,
包括集群、用户凭证和命名空间等,这允许用户管理不同的 Kubernetes 环境。
kubectl version
查看kube集群版本
查看命令说明:kubectl explain pod
这条命令可以查询命令的用法。十分重要。
二、Pod
简介
在 Kubernetes 中,Pod 是部署和管理应用的最小单位。它是 Kubernetes 中运行着一个或多个容器的抽象层。Pod 提供了一种高效的模型来运行应用工作负载。
核心概念
-
一个或多个容器:
- Pod 中可以包含一个或多个容器。这些容器共享相同的网络地址和存储卷,并且相互之间能高效通信。
- 在实际应用中,大多数 Pod 包含一个主要容器和可能存在的辅助容器(通常称为 sidecar,比如日志代理或数据处理器)。
-
共享的网络命名空间:
- 在同一 Pod 内的容器共享相同的 IP 地址和端口空间,这意味着它们可以通过
localhost
直接通信。 - 外部访问 Pod 的方式是通过 Pod 暴露的服务。
- 在同一 Pod 内的容器共享相同的 IP 地址和端口空间,这意味着它们可以通过
-
共享的存储:
- Pod 可以挂载存储卷到多个容器中,这使得容器之间可以共享文件系统数据。
-
生命周期:
- Kubernetes 负责调度 Pod 到集群中的节点上运行,并且会在 Pod 失败时自动重启。
- Pod 是短暂的,旨在设计为一次性发生故障后被删除和替换的对象,而不是在生命周期过程中修复的。
-
调度:
- Pod 是通过调度器安排在不同的节点上运行的。调度器会根据集群的可用资源和设置的约束来决定将 Pod 放置在哪个节点上。
pod常见状态
调度和初始化阶段
-
PodScheduled
- Pod 已被调度,但还未在节点上运行。
-
Unschedulable
- 调度器找不到合适的节点来运行 Pod,这可能是由于资源不足或调度约束无法满足。
-
Pending
- Pod 刚创建,正在等待节点的调度或需要的资源准备好。检查依赖条件(如存储)是否满足。
-
Initialized
- Pod 中的所有初始化容器已成功完成。
-
PodInitializing
- Pod 正在完成初始化步骤。
容器创建和运行阶段
-
ContainerCreating
- 容器正在创建中。
-
Running
- Pod 的容器已在节点上运行。
-
Ready
- Pod 的所有容器都已准备好接受请求。
异常状态与错误处理
-
CrashLoopBackOff
- Pod 持续崩溃,kubelet 正在尝试重启。
-
ImagePullBackOff
- 因为下载镜像失败,Pod 无法启动。
-
InvalidImageName
- 节点无法解析镜像名称,导致镜像无法下载。
-
ImageInspectError
- 镜像校验失败,镜像可能不完整。
-
ErrImagePull
- 拉取镜像出错,可能由于超时或权限问题。
-
ErrImageNeverPull
- 策略不允许拉取镜像(可能需要本地存在该镜像)。
-
RegistryUnavailable
- 镜像仓库不可用,可能由于网络问题或仓库宕机。
-
CreateContainerConfigError
- 不能创建 kuelet 使用的容器配置。
-
CreateContainerError
- 创建容器失败。
-
RunContainerError
- Pod 启动失败,可能是应用程序配置错误(如没有初始化 PID 1 的守护进程)。
-
ContainersNotInitialized
- 容器还未初始化完成。
-
ContainersNotReady
- 容器未准备好提供服务。
Pod 终止与其他异常
-
Terminating
- Pod 正在终止过程中。
-
NodeLost
- 所在节点失去连接,导致 Pod 无法运行。
-
Unknown
- 无法获取 Pod 当前状态,通常是由于节点通信故障。
-
DockerDaemonNotReady
- 节点上的 Docker 守护进程未启动。
-
NetworkPluginNotReady
- 节点上的网络插件尚未准备好。
三、Namespace
简介
在 Kubernetes 中,Namespace 是用于在同一集群中将资源进行逻辑隔离和分组的一种机制。它提供了一种在单个集群中管理多个环境、场景或团队的方式,这对于大型企业或多个项目共用一个集群的场景特别有用。
核心功能
-
逻辑隔离:
- Namespace 提供了一种用于将不同的项目、团队或环境(如开发、测试、生产)隔离开来的方法。
- 不同 Namespace 间的资源不会互相干扰,具有独立的命名空间。
-
资源管理:
- 可以通过 Namespace 来限制资源配额。比如:定义每个 Namespace 可以使用的 CPU 和内存限制。
- 使用
ResourceQuota
和LimitRange
限制和管理资源的使用。
-
访问控制:
- 配合 Kubernetes 的角色访问控制(RBAC)系统,可以定义用户或团队对特定 Namespace 的读写权限。
- 通过角色(Role)和角色绑定(RoleBinding)来控制 Namespace 范围内的权限。
-
命名隔离:
- 同一个集群内可以使用相同的资源名称(如 Pod、Service 名称),但位于不同的 Namespace 中,以实现命名冲突的最小化。
默认 Namespace
Kubernetes 提供了一些预定义的 Namespace,帮助组织系统组件和用户资源:
-
default:
- 默认 Namespace,没有指定 Namespace 的资源都会创建在这里。
-
kube-system:
- 存放 Kubernetes 自身的系统组件和基础服务,如 API server、scheduler、controller manager。
-
kube-public:
- 是一个通用的 Namespace,用于存放集群内公共资源信息,默认所有用户可读取。
-
kube-node-lease:
- 用于存储节点租约信息,从而提高节点心跳检测性能。
- 用于存储节点租约信息,从而提高节点心跳检测性能。
管理namespace
列出所有namespace:
kubectl get namespaces
创建一个新的 Namespace:
kubectl create namespace <namespace-name>
删除一个 Namespace:
kubectl delete namespace <namespace-name>
查看 Namespace 细节:
kubectl describe namespace <namespace-name>
在一个特定的 Namespace 中列出所有 Pods:
kubectl get pods -n my-namespace
设置默认的 Namespace 以减少每个命令中指定 Namespace 的需要:
kubectl config set-context --current --namespace=my-namespace
Namespace 是 Kubernetes 中用于逻辑隔离和组织大量资源的关键机制,特别适合多租户环境和大型集群。在现代集群管理中,通过合理地使用 Namespace,可以提高集群的安全性和可管理性。
实践应用
-
- 使用 Namespace 来分隔不同的环境(开发、测试、生产)
- 为不同的团队或项目创建单独的 Namespace
- 利用 ResourceQuota 防止资源过度使用
- 使用 RBAC[“Role-Based Access Control”(基于角色的访问控制)]来管理 Namespace 的访问权限
-
注意事项
- 删除 Namespace 会删除其中的所有资源
- 某些 Kubernetes 功能(如 DNS)在所有 Namespace 中共享
- 不同 Namespace 中的服务可以相互通信,除非有网络策略限制