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]

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

https://kustomize.io/

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
Designed by Canux