kubectl
kubectl是kubernetes的管理工具.
https://kubernetes.io/docs/tasks/tools/#kubectl
https://github.com/cloudnativelabs/kube-shell
https://github.com/jonmosco/kube-ps1
https://github.com/ahmetb/kubectx
在master上通过kubectl命令管理集群.
kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如:v1.24 版本的客户端能与 v1.23、 v1.24 和 v1.25 版本的控制面通信。 用最新兼容版的 kubectl 有助于避免不可预见的问题。
Options
kubectl options # 查看所有命令可用选项
--kubeconfig
kubectl --kubeconfig=$HOME/.kube/config (default)
-n/--namespace
basic command
create:
# 通过yaml或json文件创建新的资源
$ kubectl create -f FILENAME [options]
kubectl create namespace <NS>
kubectl create -f resource.yaml
// 输出一个资源的yaml格式.
kubectl create deployment <name> --image=<img-name> --dry-run=client --output=yaml --namespace=<ns>
delete:
// 删除资源
$ kubectl delete (-f FILENAME | -k DICT | TYPE [(NAME|-l label|--all)]) [optiions]
options:
-f/--filename
--all
--all-namespaces
--force
--grace-period
--cascade
$ kubectl delete -f resource.yaml
$ kubectl delete pods --all -n <NS> # delete all pods in the current namespace
// 删除指定ns下所有资源.
$ kubectl delete all --all -n {namespace}
删除带有finalizers字段的对象,对象实际被更新了,没有真的被删除。可以通过patch来删除。参考patch。
删除带有ownerReferences字段的对象,删除父对象默认会删除所有子对象,通过–cascade=false只删除父对象。
kubectl delete deployment <deployment-name> --cascade=false
expose:
# 将pod/deployment/replicaset暴露为service, 会创建对应的service。
$ kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=...] [--name=...] [--external-ip=...] [--type=ClusterIP|NodePort|LoadBalancer] [options]
# 默认是ClusterIP
$ kubectl expose pod <pod-name> --port=80 --target-port=8080 --name=<svc-name>
# 暴露deployment为service。
# nodeport可以使用任意节点的IP访问.
$ kubectl expose deployment/hello-world --type=NodePort --name=example-service
$ kubectl expose deployment hello-world --type=LoadBalancer --port=80 --target-port=8080
// 获取service的yaml
kubectl expose deployment <deploy-name> --type=LoadBalancer --port=80 --dry-run=client --output=yaml
run:
# 创建pod:
$ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
kubectl run my-pod --image=nginx --replica=3 --port=80 --restart=Never
set:
$ kubectl set SUBCOMMAND [options]
// 更新资源的字段或属性
$ kubectl set image deployment/my-deployment my-container=nginx:1.21
$ kubectl set env deployment/my-deployment LOG_LEVEL=debug
$ kubectl set resources deployment/my-deployment --limits=cpu=500m,memory=1Gi
get:
// 获取resource信息(docker ps)
$ kubectl [-n <namespace>] get [resource] [flags] [options]
options:
-A/--all-namespaces
-f/--filename
-o/--output json/yaml/json/wide/name/...
-w/--watch
--watch-only
kubectl get nodes --show-labels
kubectl get nodes/no # 获取node节点信息
kubectl get namespace/ns # 获取namespace信息
kubectl get componentstatuses/cs
kubectl get all --all-namespaces
kubectl get all -n kube-system
kubectl get pod/pods/po
kubectl get po -w/--watch
kubectl get po -o wide
kubectl get deployment/deployments/deploy
kubectl get service/services/svc
explain:
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/
// 查看资源解析
$ kubectl explain RESOURCE [options]
// 查看资源的特定字段
$ kubectl explain pod.spec
$ kubectl explain deploy.spec
$ kubectl explain deploy.spec.template.spec
// 查看特定api版本的资源
$ kubectl explain deployment --api-version=apps/v1
edit:
// 在线修改资源,直接生效.
$ kubectl edit [RESOURCE_TYPE]/[RESOURCE_NAME] [options]
kubectl edit node my-node
advanced commands
apply: 创建或更新资源
$ kubectl apply -f FILENAME [options]
$ kubectl apply -f resource1.yaml -f resource2.yaml
$ kubectl apply -f ./manifests/
$ kubectl apply -f resource.yaml --dry-run=client
$ kubectl apply -f resource.yaml --force
diff:
$ kubectl diff -f <file|directory> [options]
$ kubectl diff -f resource.yaml
patch
# 通过json或yaml对资源进行部分更新。
$ kubectl patch [RESOURCE_TYPE] [RESOURCE_NAME] -p <patch-data> [options]
// 删除terminating状态的resource
$ kubectl patch persistentvolumeclaim/storage -p '{"metadata":{"finalizers":null}}' -n <ns>
# 替换已有的资源
$ kubectl replace -f <file> [options]
$ kubectl replace -f resource.yaml -n my-namespace
$ kubectl wait [RESOURCE_TYPE] [RESOURCE_NAME] --for=condition=<CONDITION> [options]
$ kubectl kustomize
deploy command
scale:
$ kubectl scale [RESOURCE_TYPE] [RESOURCE_NAME] --replicas=<number> [options]
$ kubectl scale deployment <deploy-name> -n <ns> --replicas=0
autoscale:
# 给deploy,replicaset,statefulset等资源设置自动伸缩.HPA
$ kubectl autoscale [RESOURCE_TYPE]/[RESOURCE_NAME] [flags]
kubectl autoscale deployment my-deployment --min=2 --max=10 --cpu-percent=80
rollout:
// 回滚
$ kubectl rollout [SUBCOMMAND] [RESOURCE_TYPE/RESOURCE_NAME] [options]
// 暂停/恢复/重启 deployment.
kubectl rollout pause/resume/restart deploy/katib-mysql -n kubeflow
debug&troubleshoot
describe:
// like docker inspect
$ kubectl describe (-f FILENAME | TYPE ... | TYPE/NAME) [options]
options:
-A/--all-namespaces
-f/--filename
// 查看node信息
$ kubectl describe nodes <name>
//查看pod详细信息
$ kubectl describe pods <name>
// 获取k8s-dashboard的token
$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
logs:
# like docker logs
$ kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER] [options]
options:
--all-containers
-f/--follow
-p/--previous
// 查看pod中指定container log
kubectl logs -f <pod> -c <container> -n <ns>
exec:
# like docker exec
$ kubectl exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...] [options]
options:
-c/--container
-i/--stdin
-t/--tty
$ kubectl exec -it <pod> -n <ns> -- /bin/bash
$ kubectl exec -it <pod> -n <ns> -c <container> -- /bin/sh
port-forward:
由于已知的限制,目前的端口转发仅适用于 TCP 协议.
只能通过运行转发命令的IP/FQDN访问。
$ kubectl port-forward [RESOURCE_TYPE]/[RESOURCE_NAME] [LOCAL_PORT]:[REMOTE_PORT] [options]
// 转发本地端口到deploy/rs/svc/pod
$ kubectl port-forward pod/my-pod 8080:80 -n <ns>
$ kubectl port-forward svc/redis-service 6379:6379 -n redis
# 允许所有IP访问
$ kubectl port-forward --address 0.0.0.0 -n kubernetes-dashboard service/kubernetes-dashboard 8080:443
proxy:
$ kubectl proxy
// 通过proxy可以访问默认的clusterIP服务.
attach:
$ kubectl attach [POD_NAME] [-c CONTAINER] [options]
$ kubectl attach my-pod -n <ns> -c <container>
cp:
$ kubectl cp <source> <destination> [options]
$ kubectl cp ./local-file.txt my-pod:/app/ -n my-namespace
$ kubectl cp my-pod:/app/remote-file.txt ./ -n my-namespace
auth:
$ kubectl auth [SUBCOMMAND] [options]
$ kubectl auth can-i get pods -n my-namespace
debug:
$ kubectl debug [RESOURCE] [options]
// debug node -- 直接进入node的shell,log在/host/var/log
$ kubectl debug node/<name> -it --image=
// debug pod -- 创建一个新的pod来调试现有的pod
$kubectl debug pod/<pod-name> -n <namespace> --copy-to=<new-pod-name> --container=<container-name>
$kubectl debug pod/<pod-name> -n <namespace> --container=<container-name> --image=busybox
cluster management
top:
$ kubectl top [RESOURCE_TYPE] [RESOURCE_NAME] [options]
$ kubectl top nodes
$ kubectl top pods -n <ns>
cluster-info:
$ kubectl cluster-info
certificate:
$ kubectl certificate [SUBCOMMAND] [options]
cordon:
// 节点变成unschedulable
$ kubectl cordon <node>
// 节点变成schedulable
$ kubectl uncordon <node>
drain:
// 安全从节点驱逐pod
$ kubectl drain <node-name> [options]
$ kubectl drain <node> --delete-emptydir-data --ignore-daemonsets
// 强制驱逐节点上的pod
$ kubectl drain my-node --force --ignore-daemonsets
tain:
//管理污点
$ kubectl taint nodes <node-name> <key>=<value>:<effect>
$kubectl taint nodes <node> <key>=<value>:NoSchedule-
Settings Commands
label
label Update the labels on a resource
kubectl label nodes <your-node-name> disktype=ssd
annotate:
annotate Update the annotations on a resource
completion:
completion Output shell completion code for the specified shell (bash or zsh)
others
api-resources:
// api-resources Print the supported API resources on the server.
kubectl api-resources
api-versions:
// api-versions Print the supported API versions on the server, in the form of "group/version".
kubectl api-versions
config:
// 参考kubectx
config Modify kubeconfig files.
plugin:
// 参考krew
plugin Provides utilities for interacting with plugins.
// 查看安装的plugin
$ kubectl plugin list
version:
version Print the client and server version information.
kustomize
kustomize是kubernetes的资源编排工具.
kubectl kustomize DIR [flags] [options]
同时build和apply:
kubectl apply -k dir/
shell-auotcompletion
bash/zsh 自动补全工具.
https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion
$ kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl
krew
https://github.com/kubernetes-sigs/krew
安装kubectl plugin的工具
// 下载插件列表
$ kubectl krew update
// 查找插件
$ kubectl krew search
// 安装插件
$ kubectl krew install <name>
// 升级插件
$ kubectl krew upgrade
// 卸载插件
$ kubectl krew uninstall <name>
kubectx
https://github.com/ahmetb/kubectx
在cluster和namespace之间切换的命令行工具.
包括kubectx 和 kubedns
通过krew安装,作为kubectl的plugin:
$ kubectl krew install ctx
$ kubectl krew install ns