2. kubectl 使用备忘手册¶
1. 设置快捷别名¶
有一些命令的使用频率非常高,可以为其设置短一点的别名,提高输入效率。
alias kc="kubectl"
alias ka="kubectl apply -f"
alias kd="kubectl delete -f"
2. 设置自动补全¶
想进一步提高输入效率,那么自动补全也少不了。
# 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completion 包。
source <(kubectl completion bash)
# 在您的 bash shell 中永久的添加自动补全
echo "source <(kubectl completion bash)" >> ~/.bashrc
设置完后,你使用 kubectl 就可以自动补全一些子命令。
4. 简洁输出与更多输出¶
更多输出¶
# 包含 ip node 等信息
kubectl get pods -o wide
# 包含 ip role 等信息
kubectl get nodes -o wide
# 在 wide 基础上再显示标签
kubectl get no -o wide --show-labels
5. 高级输出 之 格式¶
yaml¶
# 打印 nginx pod 的详细配置,并以 yaml 格式输出
kubectl get pods nginx -o yaml
json¶
# 打印 nginx pod 的详细配置,并以 json 格式输出
kubectl get pods nginx -o json
6. 高级输出 之 筛选¶
筛选对象¶
使用 –field-selector
# 获取当前命名空间中正在运行的 Pods
kubectl get pods --field-selector=status.phase=Running
使用 –selector
# 获取所有工作节点(使用选择器以排除标签名称为 'node-role.kubernetes.io/master' 的结果)
kubectl get node --selector='!node-role.kubernetes.io/master'
筛选字段¶
使用 jsonpath
# 获取全部节点的 ExternalIP 地址
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
使用 json + jq
# 列出被一个 Pod 使用的全部 Secret
kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
使用 custom-columns
# 集群中运行着的所有镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'
# 除 "k8s.gcr.io/coredns:1.6.2" 之外的所有镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[?(@.image!="k8s.gcr.io/coredns:1.6.2")].image'
# 输出 metadata 下面的所有字段,无论 Pod 名字为何
kubectl get pods -A -o=custom-columns='DATA:metadata.*'
筛选对象+字段¶
# 获取包含 app=cassandra 标签的所有 Pods 的 version 标签
kubectl get pods \
--selector=app=cassandra -o \
jsonpath='{.items[*].metadata.labels.version}'
7. 高级输出 之 排序¶
# 列出当前名字空间下所有 Services,按名称排序
kubectl get services --sort-by=.metadata.name
# 列出 Pods,按重启次数排序
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
# 列举所有 PV 持久卷,按容量排序
kubectl get pv --sort-by=.spec.capacity.storage
# 列出事件(Events),按时间戳排序
kubectl get events --sort-by=.metadata.creationTimestamp
8. 从标准输入创建对象¶
有些对象的创建是临时的,不需要事先创建一个 yaml 再 apply,这时候就可以直接从标准输入创建对象
# 从标准输入创建多个 YAML 对象
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000000"
---
apiVersion: v1
kind: Pod
metadata:
name: busybox-sleep-less
spec:
containers:
- name: busybox
image: busybox
args:
- sleep
- "1000"
EOF
9. 清单与集群对象差异¶
# 比较当前的集群状态和假定某清单被应用之后的集群状态
kubectl diff -f ./my-manifest.yaml
10. 查看Pod 负载情况¶
# 显示给定 Pod 和其中容器的监控数据
kubectl top pod POD_NAME --containers
# 显示给定 Pod 的指标并且按照 'cpu' 或者 'memory' 排序
kubectl top pod POD_NAME --sort-by=cpu
11. 多种姿势查看日志¶
# 获取 pod 日志(标准输出)
kubectl logs my-pod
# 获取含 name=myLabel 标签的 Pods 的日志(标准输出)
kubectl logs -l name=myLabel
# 获取上个容器实例的 pod 日志(标准输出)
kubectl logs my-pod --previous
# 获取 Pod 容器的日志(标准输出, 多容器场景)
kubectl logs my-pod -c my-container
# 获取含 name=myLabel 标签的 Pod 容器日志(标准输出, 多容器场景)
kubectl logs -l name=myLabel -c my-container
# 获取 Pod 中某容器的上个实例的日志(标准输出, 多容器场景)
kubectl logs my-pod -c my-container --previous
# 流式输出 Pod 的日志(标准输出)
kubectl logs -f my-pod
# 流式输出 Pod 容器的日志(标准输出, 多容器场景)
kubectl logs -f my-pod -c my-container
# 流式输出含 name=myLabel 标签的 Pod 的所有日志(标准输出)
kubectl logs -f -l name=myLabel --all-containers
K8S 组件的日志等级非常多,共分 10 级,分别是
详细程度 |
描述 |
---|---|
|
用于那些应该 始终 对运维人员可见的信息,因为这些信息一般很有用。 |
|
如 果您不想要看到冗余信息,此值是一个合理的默认日志级别。 |
|
输出有关服务的 稳定状态的信息以及重要的日志消息,这些信息可能与系统中 的重大变化有关。这是建议大多数系统设置的默认日志级别。 |
|
包含有关系统状态变化的扩展信息。 |
|
包含调试级别的冗余信息。 |
|
跟踪级别的详细程度。 |
|
显示所请求的资源。 |
|
显示 HTTP 请求头。 |
|
显示 HTTP 请求内容。 |
|
显示 HTTP 请求内容而且不截断内容。 |
当你使用 kubectl logs 查看日志时,默认筛选等级为 1 的日志。
有时候排查问题的需要,需要更详细的日志来辅助定位,这时候可以加
--v=x
,其中 x 为日志等,可选值有 0~9
kubectl logs --v=4 kube-scheduler-master -n kube-system
12. 连到到容器中¶
# 在已有的 Pod 中运行命令(单容器场景)
kubectl exec my-pod -- ls /
# 使用交互 shell 访问正在运行的 Pod (一个容器场景)
kubectl exec --stdin --tty my-pod -- /bin/sh
# 在已有的 Pod 中运行命令(多容器场景)
kubectl exec my-pod -c my-container -- ls /