一、Kubectl 基础命令
1. 查询
#资源对象类型列表
kubectl explain
或
kubectl api-resources
# 指定 kubeconfig
kubectl --kubeconfig <config-path> get pods
# 指定名字空间的 pods
kubectl --namespace <namespace> get pods
kubectl -n <namespace> get pods
# 显示更多的信息(pod 所在节点,clusterip 等)
kubectl get pods -o wide
# 查询所有名字空间的 pods
kubectl get pods --all-namespace
kubectl get pods -A # 缩写
# 列出所有的名字空间
kubectl get ns # ns 是 namespace 的缩写
# 查看 default 空间的所有服务
kubectl get svc
# 查看 ingress
kubectl get ingress
# 查看当前命名空间下的所有资源(不包含CRD)
kubectl get all
# 列出所有资源及资源实例(不包含CRD)
kubectl get all --all
# 列出所有的自定义资源
kubectl get crds
# 列出某自定义资源的所有实例
kubectl get <crd-name>
# 举例,列出所有的 istio virtualservice
kubectl get virtualservices.networking.istio.io
kubectl get virtualservices # 缩写方式
# 查询 k8s 的资源使用情况 (CPU/Memory/Storage)
kubectl top node
kubectl top deployment
2. 添加/修改
kubectl create
只允许创建原来不存在的资源,而 kubectl apply
可以创建/修改资源(有一部分信息不支持通过 apply 修改)。虽然说官方不推荐使用 apply
进行资源的创建。。
# 临时运行一个 pod/deployment
# 1. 创建一个 nginx pod,并同时为其创建一个 service(ClusterIp)暴露出 80 端口,targetPort 默认和 port 一致
kubectl run nginx --image=nginx --expose=true --port=80 --generator=run-pod/v1
# 这一句的效果等同上面 run 命令的 --expose=true --port=80,只是这边的 targetPort 和 port 可以不一致
kubectl expose pod nginx --port=80 --target-port=80
# 为节点添加标签
kubectl label node "disk=ssd"
#删除标签
kubectl label node disk-
# 修改已经存在的标签
kubectl label node "disk=hdd" --override
# 递归便利整个文件夹的 yaml 文件
kubectl create --recursive -f . # 递归遍历当前文件夹中的 yaml,依次 create
# 直接修改资源
kubectl edit pod <pod-name> # 会直接弹出 vim 界面供修改,内容为 yaml 格式。
3. 调试 Pod:在 pod 内执行命令
kubectl exec <pod-name> -- <command> # -- 用于分隔 kubectl 命令和要在容器内部执行的命令
# 常用调试命令
kubectl exec <pod-name> -- ping xxx
kubectl exec <pod-name> -- nslookup xxx
kubectl exec <pod-name> -- cat xxx
kubectl exec -it <pod-name> bash # 使用容器的 shell,如果没有 bash,可以试试使用 sh。如果连 sh 都没有,那就只有上面的方法可用了。
另外 kubectl 1.18 提供了一个 Pod 调试命令 kubectl alpha debug
,可启动一个专用的调试容器,对某 Pod 进行调试。不过该项功能目前还处于 Alpha 状态,只建议试用。命令如下:
# Create an interactive debugging session in pod mypod and immediately attach to it.
# (requires the EphemeralContainers feature to be enabled in the cluster)
kubectl alpha debug mypod -i --image=busybox
上面提到的 EphemeralContainers 特性需要 kubernetes 1.16+
4. 删除
# 删除整个名字空间
kubectl delete ns <space-name> # ns 是 namespace 的缩写
# 删除所有的 pods
kubectl delete pod --all
# 删除 default 名字空间中(几乎)所有的资源(不包括 CRD 自定义资源,比如 istio 的 virtualservice/gateway/destinationrule)
kubectl delete all --all # 第一个 all 表示所有的资源类型(pod/service/ingress,但不包括 secret),第二个 all 表示资源的所有实例。
# 删除默认名字空间中的所有 istio 配置
kubectl delete destinationrules --all
kubectl delete virtualservices --all
kubectl delete gateway --all
# 或者一次清除三个
kubectl delete destinationrules,virtualservices,gateway --all
5. 污点、驱逐维护、滚动更新/回滚
# 添加、删除污点
kubectl taint -h
# 封锁/取消封锁某个节点(将该节点的状态设为 Unschedulable)
kubectl cordon -h
kubectl uncordon -h
# 驱逐该节点上的所有 Pod,仅 Daemonset 除外
kubectl drain -h
# deployment 的回滚
## deployment 默认使用滚动更新,历史版本上限由 `spec.revisionHistoryLimit` 控制
kubectl rollout history deploy # 查看(当前名字空间)所有 deployments 的历史版本
kubectl rollout history deploy <deployment-name> # 查看指定 deployment 的所有历史版本
kubectl rollout undo deploy # 回退(当前名字空间)所有的 deployments
kubectl rollout undo deploy <deployment-name> --to-revision=3 # 回退指定 deployment 到版本 3
6. 常用命令举例
- 列出未完全 Ready 的 pods:
kubectl get pods -A | grep -Ev '([0-9]+)/\1'
(-A
即--all-namespaces
)- 强烈推荐使用
k9s
,通过快捷键Ctrl-z
只查看所有有问题的资源。 - 错误示范:
kubectl get pods -A --field-selector=status.phase!=Running
,不会列出状态为 CrashBackoffLoop 的 pods!以及已Running
但未Ready
的 pods!
- 强烈推荐使用
- 查看崩溃容器的日志:
kubectl logs <pod-name> --previous
,即上一个 pod 的日志
7. 使用 kube-ctx 方便地管理多个集群
通常创建完集群后,我们能得到一个 kubeconfig
文件,我们可以使用改文件与集群通信。
可是如果有多个集群需要管理,那每次都得指定 --kubeconfig xxx
,就显得很麻烦,该如何简化操作呢?
首先观察 kubeconfig
文件的内容,它是一个 yaml
格式的文件,包含了管理集群需要的所有信息:
- cluster 部分:apiserver 地址及集群授权数据
- context 部分:集群管理员用户的账号名及 TLS 证书(公钥)+私钥,用于验证身份
current-context
: 当前 context 的名称
观察 kubeconfig 的结构可以发现,它是支持多个 clusters/context 的。那多个集群的 kubeconfig
是不是能合并成一个,然后使用 current-context
切换集群呢?答案是可以!
首先我们将多个集群的 kubeconfig 合并成一个,方法如下:
# 1. 合并前先确定两个 kubeconfig 的 cluster-name 和 context-name 不能一样!一定要改成不一样的!否则会相互覆盖!
# 2. KUBECONFIG 以 PATH 类似的语法设定多个 config 的位置
KUBECONFIG=<config1>:<config2> kubectl config view --flatten > $HOME/.kube/config
然后就可以通过 kubectx 方便地切换集群了。
kubectl ctx # 查看所有集群
kubectl ctx <context-name> # 切换集群
P.S. 其实也可用于切换集群内的用户身份,以后再研究下。