Kubectl

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]

options:
-f/--filename

kubectl create secret tls kubernetes-dashboard-tls --key ca.key --cert ca.crt -n kubernetes-dashboard

// 输出一个资源的yaml格式.
kubectl create deployment <name> --image=<img-name> --dry-run=client --output=yaml

delete:

// 删除资源
$ kubectl delete (-f FILENAME | -k DICT | TYPE [(NAME|-l label|--all)]) [optiions]

options:
-f/--filename
--all  
--all-namespaces
--force

$ kubectl delete pods --all
$ kubectl delete pod <name>
// 删除指定ns下所有资源.
$ kubectl delete all --all -n {namespace}

删除带有finalizers字段的对象,对象实际被更新了,没有真的被删除。可以通过patch来删除。

删除带有ownerReferences字段的对象,删除父对象默认会删除所有子对象,通过–cascade=false只删除父对象。

expose:

# 创建serivce:
$ kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=...] [--name=...] [--external-ip=...] [--type=type] [options]

# 创建service,并且使用NodePort
# nodeport可以使用任意节点的IP访问.
$ kubectl expose deployment hello-world --type=NodePort --name=example-service

// 获取service的yaml
kubectl expose deployment <deploy-name> --type=LoadBalancer --port=80 --dry-run=client --output=yaml

run:

# 创建pod/container(docker run):
$ kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]

set:

$ kubectl set SUBCOMMAND [options]

// 更新镜像
$ kubectl set image deployment.v1.apps/<deploy-name> <container-name>=<image:tag>

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 -n kube-system get all 

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 deploy.spec

edit:

// 在线修改资源,直接生效.
$ kubectl edit

advanced commands

apply:

$ kubectl apply

diff:

$ kubectl diff

patch

$ kubectl patch

// 删除terminating状态的resource
$ kubectl patch  persistentvolumeclaim/storage -p '{"metadata":{"finalizers":null}}' -n <ns>

$ kubectl replace

$ kubectl wait

$ kubectl kustomize

deploy command

scale:

$ kubectl scale
$ kubectl scale deployment <deploy-name> -n <ns> --replicas=0

autoscale:

$ kubectl autoscale

rollout:

// 回滚
$ kubectl rollout

// 暂停/恢复/重启 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

port-forward:

由于已知的限制,目前的端口转发仅适用于 TCP 协议.

只能通过运行转发命令的IP/FQDN访问。

$ kubectl port-forward

// 转发本地端口到deploy/rs/svc/pod
$ kubectl port-forward svc/redis-service 6379:6379 -n redis

$ kubectl port-forward --address 0.0.0.0 -n kubernetes-dashboard service/kubernetes-dashboard 8080:443

proxy:

$ kubectl proxy

// 通过proxy可以访问默认的clusterIP服务.

attach:

$ kubectl attach

cp:

$ kubectl cp

auth:

$ kubectl auth

debug:

$ kubectl debug

// debug node -- 直接进入node的shell,log在/host/var/log
kubectl debug node/<name>  -it   --image=ubuntu

cluster management

top:

$ kubectl top

$ kubectl cluster-info

$ kubectl certificate

// 节点变成unschedulable
$ kubectl cordon

// 节点变成schedulable
$ kubectl uncordon

// 安全下线节点:Ready,SchedulingDisabled
$ kubectl drain
kubectl drain <node> --delete-emptydir-data --ignore-daemonsets

//定义污点
$ kubectl taint
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.

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

circtl

用于对node调试.

https://github.com/kubernetes-sigs/cri-tools

https://kubernetes.io/docs/tasks/debug/debug-cluster/crictl/

nerdctl

调试node。

https://github.com/containerd/nerdctl

telepresence

用于本地调试集群上的服务.

https://github.com/telepresenceio/telepresence

Designed by Canux