4 min read

Kubectl 运维乱记

Kubectl  运维乱记

命令简化

将以下内容追加到环境变量中,可以简化运维操作

往~/.bashrc文件加入以下内容:

alias k=kubectl
source <(kubectl completion bash | sed s/kubectl/k/g)
alias kcd='kubectl config set-context $(kubectl config current-context) --namespace'
KUBE_EDITOR=/usr/bin/vim

依赖以下包

# yum install bash-completion -y

关于查询短暂存储位置

K8S 会在当前的 Node 自动创建一个目录来实际承载这个卷,目录的位置在 Node 的 /var/lib/kubelet/pods 路径下。要查看这个目录中的内容,需要先找到 Pod Id 和对应的 Node,然后登录到这个 Node,就能找到这个目录了,POD ID使用以下命令可以对应上:

$ kubectl get pods -o custom-columns=PodName:.metadata.name,PodUID:.metadata.uid,PodNode:.spec.nodeName

删除非运行状态的Pod

$ export ns=XXX
$ kubectl -n $ns get pod --field-selector status.phase!=Running -o name | xargs $ kubectl  -n $ns delete

查看以带状态的Pod

打印出非Running状态的Pod

$ kubectl get pods --field-selector status.phase!=Running

进化版

$ kubectl get pod --field-selector status.phase!=Running -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NAMEDPACE:.metadata.namespace

高阶进化版

$ kubectl get pod --field-selector status.phase!=Running -o=custom-columns=POD_NAME:.metadata.name,STATUS:.status.phase,NAMEDPACE:.metadata.namespace,CONTAINER_NAME:.spec.containers[*].name

输出所有非Running状态的Pod

$ kubectl get pods -A --field-selector status.phase!="Running" -o=jsonpath='{.items[*].metadata.name}'

查看当前节点CIDR

$ kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'

查看节点配置

$ kubectl get --raw "/api/v1/nodes/kube-master-1/proxy/configz" | jq .

创建命名空间,不存在则创建,存在则忽略

kubernetes 1.19以上

$ kubectl create namespace <add-namespace-here> --dry-run=client -o yaml | kubectl apply -f -

$ kubernetes 1.18以下

$ kubectl create namespace <add-namespace-here> --dry-run -o yaml | kubectl apply -f -

删除可能不存在的资源

$ kubectl delete ns istio-system --ignore-not-found=true

SVC更新类型

$ kubectl -n istio-system patch svc istio-ingressgateway -p '{"spec": {"ports": [{"nodePort": 443, "port": 443,"targetPort": 8443,"name": "https"},{"nodePort": 80, "port": 80,"targetPort": 8080,"name": "http2"}],"type": "NodePort"}}'

打印集群中的污点信息

  • 1
$ kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints --no-headers
  • 2
$ kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.taints[*].key}{"\n"}{end}' 
  • 3

只打印有污点的节点

$ kubectl get nodes -o go-template='{{printf "%-50s %-12s\n" "Node" "Taint"}}{{- range .items}}{{- if $taint := (index .spec "taints") }}{{- .metadata.name }}{{ "\t" }}{{- range $taint }}{{- .key }}={{ .value }}:{{ .effect }}{{ "\t" }}{{- end }}{{- "\n" }}{{- end}}{{- end}}'

打印集群中的节点资源

$ kubectl get nodes -o custom-columns=NAME:.metadata.name,ARCH:.status.nodeInfo.architecture,KERNEL:.status.nodeInfo.kernelVersion,KUBLET:.status.nodeInfo.kubeletVersion,CPU:.status.capacity.cpu,RAM:.status.capacity.memory

打印集群所有的节点

$ kubectl get nodes -o jsonpath='{range.items[*]}{.metadata.name}'

集体排水:慎用

$ for node in `kubectl get nodes -o jsonpath='{range.items[*]}{.metadata.name}'`
do
	drain="kubectl drain $node --ignore-daemonsets &"
	eval $drain
done

Node

新节点加入

$ kubeadm token create --print-join-comman

节点维护或排水

$ kubectl drain nodename --force --ignore-daemonsets --delete-local-data
$ kubectl cordon node-name
$ kubectl drain node-name 
$ kubectl uncordon node-name

命名空间

当前所在的命名空间

方法1:

$ kubectl config get-contexts | grep -e "^\*" |  awk '{print $5}' 

方法2:

$ kubectl config view --minify | awk '/namespace:/{print $2}'

切换命名空间

$ kubectl config set-context --current --namespace=default

--current 可以使用kubectl config current-context

滚动重启应用

$ kubectl rollout restart deployment nginx-deploy

**提示:**由于大多数容器仍在运行,因此整个过程是感知的。

按标签输出pod

$ kubectl get pod -l environment=dev,tier=backend
$ kubectl get pod -l 'environment in (dev,prod)'

输出pod名称

第一个

$ kubectl get pods -o=jsonpath='{.items[0].metadata.name}'

全部

$ kubectl get pods -o=jsonpath='{.items[*].metadata.name}'

//格式化
$ kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.startTime}{"\n"}{end}'

输出节点与pod名

$ kubectl get po -o json | jq -r '.items | sort_by(.spec.nodeName)[] | [.spec.nodeName,.metadata.name] | @tsv'

自定义排序

$ kubectl get po -o wide --sort-by=.spec.nodeName

查看运行的容器镜像

$ kubectl -n gitee get po -o jsonpath={..image}|tr -s '[[:space:]]' '\n'|sort -ru

查看指定Pod 地址

$ kubectl get pods pod_name  -o jsonpath --template={.status.podIP}

查看Pod资源声明情况

$ kubectl get pods -A -o  go-template --template='
{{ range $i, $pod := .items -}}
  {{range .spec.containers -}}
    {{ $pod.metadata.namespace }} {{ $pod.metadata.name }} {{.resources.requests.cpu}} {{.resources.requests.memory}} {{.resources.limits.cpu}} {{.resources.limits.memory}}
  {{end -}}
{{end}}'

使用到的镜像

$ kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c

对应Pod使用的镜像

$ kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
sort

输出PV资源

$ kubectl get pv -o json | jq -r '.items | sort_by(.spec.capacity.storage)[]|[.metadata.name,.spec.capacity.storage]| @tsv'