K8S 常用命令


整理下 K8S 的常用命令,以供参考。

基础配置

为了便于使用,可以增加命令补全,有如下两种方式:

----- 在 ~/.bashrc 增加如下配置
source <(/opt/k8s/bin/kubectl completion bash)
----- 或者将补全脚本添加到指定目录下
kubectl completion bash >/etc/bash_completion.d/kubectl

默认从 $HOME/.kube/config 读取配置,也可通过 KUBECONFIG 环境变量或者 --kubeconfig 参数指定配置。

如果有多个不同的环境,那么可以通过 kubectl config use-context 使用上下文,利用 kubectl config view 查看配置。默认会链接 localhost:8080 端口,如果只有一个环境,那么可以通过 alias 修改命令,例如 alias kubectl='/opt/bin/kubectl --server=192.168.56.107:8080 '

Podman

----- 清理所有已经停止的容器
podman container prune -f
----- 清理不使用的镜像
podman image prune --force --all
----- 停止所有的容器
podman stop $(podman ps -aq)
----- 删除所有的容器
podman rm $(podman ps -aq)
----- 删除所有的镜像
podman rmi $(podman images -q)
----- 删除指定镜像
podman rmi 90a31eddcec6
----- 执行某个容器
podman exec -it centos bash
----- 根据输出设置如下的--cgroup-driver参数
docker info | grep 'Cgroup Driver'

常用命令

因为有 namespace 的逻辑隔离,可通过 --namespace=YourNS 指定具体 namespace,或者通过 --all-namespaces 查看所有。

API

----- 查看K8S中APIServer的请求地址
kubectl get endpoints kubernetes
----- 支持的API版本信息
kubectl api-versions
----- 支持的资源类型GVK,大部分的资源都位于命名空间中
kubectl api-resources --namespaced=true
kubectl api-resources --namespaced=false
----- 显示集群信息,以及各个组件的状态信息
kubectl cluster-info
kubectl get componentstatuses

异常排查

----- 查看Pod中的日志,例如定位容器启动失败等
kubectl logs -f -n kube-system coredns-bffccccd6-6ndnj
----- 集群信息(版本、Master、DNS等),包括详情,甚至报错信息
kubectl version
kubectl cluster-info
kubectl cluster-info dump

Nodes

----- 所有Nodes的概览信息
kubectl get nodes -o wide
----- 某个Node的详细信息,例如hostname标签等信息
kubectl describe nodes NodeName
----- 删除某个节点
kubectl delete node NodeName

----- 标签操作,删除时只需要在Key后加一个减号即可
----- 从1.4开始会有些内置的标签,例如beta.kubernetes.io/os=linux beta.kubernetes.io/arch=amd64
kubectl label nodes NodeName Key=Value
kubectl label nodes NodeName Key-
kubectl get nodes --show-labels=true
kubectl get nodes -l 'cpu=high,role!=master'

----- 节点的隔离和恢复
kubectl patch node NodeName -p '{"spec":"{"unschedulable":"true"}"}'
kubectl patch node NodeName -p '{"spec":"{"unschedulable":"false"}"}'

----- 将节点设置为不可调度,将容器驱离,重新加入调度
kubectl cordon NodeName
kubectl drain NodeName
kubectl uncordon NodeName

Pods

----- 查看Pod信息、详情、标签
kubectl get pod --all-namespaces -o wide
kubectl get pods POD-NAME -o wide
kubectl get pods --show-labels
----- 查看某个Pod的详细信息和参数,也可以通过 -o json 选择其它格式
kubectl get pods POD-NAME -o yaml
----- 获取资源详细信息,一般Pod异常时最好都要看下状态
kubectl describe pods POD-NAME --namespace kube-system
----- 删除所有或者指定Pod
kubectl delete pods --all
kubectl delete pods POD-NAME

----- 在命令行中创建一个Pod,可以指定很多参数,详见如下的文档
kubectl run alpine --image=alpine --image-pull-policy=Never -i --tty /bin/sh
/ # wget 10.0.0.50:8080
kubectl attach alpine -c alpine -it
kubectl exec alpine -- printenv | grep SERVICE
kubectl exec alpine -i --tty -- /bin/sh

查看容器

----- 此命令不包括 init 容器
kubectl get pods POD_NAME_HERE -o jsonpath={.spec.containers[*].name} -n namespace
----- 查看 init 容器
kubectl get pods POD_NAME_HERE -o jsonpath={.spec.initContainers[*].name} -n namespace
----- 查看所有容器
kubectl get pod POD_NAME_HERE -o jsonpath="{.spec['containers','initContainers'][*].name}" -n namespace

Deployment

----- 查看所有Deployment,或者指定某个
kubectl get deployments -o wide
kubectl get deployments -o wide nginx
kubectl describe deployments nginx
kubectl get service -o wide
----- 创建Deployment以及Service
kubectl apply -f deployment.yaml
kubectl apply -f deployment-svc.yaml
----- 删除
kubectl delete services nginx-svc
kubectl delete deployment nginx
----- 上线状态查看
kubectl rollout status deployment/nginx
----- 部署Deployment时所创建的
kubectl get replicasets
kubectl describe replicasets
----- 在生成Pods时自动生成Labels的列表
kubectl get pods --show-labels
----- 也可以通过Labels进行过滤
kubectl get pods -l run=nginx -o wide

----- 查看服务信息,关键是获取ClusterIP以及ExternalIP
kubectl get services nginx-svc
kubectl describe services nginx-svc

----- 获取Endpoints信息
kubectl get endpoints nginx-svc

----- 也可以通过命令行创建服务
kubectl expose deployment nginx --type=LoadBalancer --name=nginx-svc

----- 通过alpine容器访问,使用ClusterIP,其中-c指定Pod中的容器名称
kubectl run alpine --image=alpine --image-pull-policy=Never --rm -i --tty /bin/sh
/ # wget 10.0.0.50:8080
kubectl exec alpine -it -- /bin/sh
kubectl attach alpine -c alpine -it

常见问题

无法清屏

在容器中打开时可能无法清除屏幕,可以通过如下方式配置。

export TERM=xterm
alias ls='ls --color=auto'

参考