成功最有效的方法就是向有经验的人学习!

kubectl 常用命令

查看

查看所有kubelet节点

kubectl get nodes
kubectl get nodes -o wide --show-labels //可以看到所有节点的label
kubectl describe node node-name //查看节点的详细信息,包括资源配置等
kubectl get all -n kube-system -l k8s-app=kube-dns //根据label查找资源,这里查找kube-system域名下k8s-app标签为kube-dns的所有资源,例如pod、service、deployment等.注意不包括configmap

查看所有pod

kubectl get pods --all-namespaces
kubectl get pods -o wide
kubectl get pods -o wide -w //可以看到实时状态变化
watch "kubectl get pods -n kube-system | grep calico" //只看带关键字calico的容器的实时状态变化

查看pod详情

kubectl describe pod podname -n namespace
kubectl get -o json pod podname -n namespace
kubectl get pods/podname -n namespace
kubectl get pods/podname -n namespace -o json

查看所有daemonset

kubectl get daemonset --all-namespaces
kubectl describe ds calico-node -n kube-system //查看daemonset的日志

按类型和名称列出一个或多个资源。

kubectl get rc,services
kubectl get rc/web service/frontend pods/web-pod-13je7

查看集群基本组件状态

kubectl get cs

查看未授权的 CSR 请求

kubectl get csr
kubectl certificate approve csr-name  #接受csr请求

查看资源

kubectl get crd
kubectl api-resources  #获取所有资源类型

修改局部变量

kubectl set env ds/calico-node CALICO_IPV4POOL_CIDR=10.210.0.0/24 -n kube-system
kubectl set image ds/calico-node calico-node=docker.io/calico/node:v3.18.1 -n kube-system

namespace相关

要使用新的namespace,必须先创建,然后才能写在yaml的metadata的字段里

kubectl create namespace newname

节点相关

kubectl describe node node-name #查看节点所有信息

设置节点不可调度/可调度

计算节点状态为 Ready, 执行 kubectl cordon node-name可致此节点为不可调度
计算节点状态为 Ready,SchedulingDisabled, 执行 kubectl uncordon node-name即可使之成为可调度的节点

节点的label

查看节点的所有label

kubectl get node --show-labels

给节点添加一个新label

kubectl label nodes kube-node node=kube-node

修改节点的label

kubectl label nodes --overwrite k8s-slave node-network-driver=ovs

删除节点的某个label

kubectl label nodes kube-node node-

根据node的label筛选节点

kubectl label nodes kube-node node=kube-node
kubectl label nodes --overwrite k8s-slave node-network-driver=sriov //修改节点k8s-slave的标签node-network-driver的值为sriov
kubectl get node -a -l "node=kube-node"

pod或者rc的配置项中添加如下配置,位置跟cotainer平行

nodeSelector:
  node: kube-node4

节点taint 和 容器tolerations

查看某节点的污点可以使用命令

kubectl describe node foo
kubectl taint nodes foo dedicated=special-user:NoSchedule  #添加或更新节点'foo'的taint,key为'dedicated',value为'special-user',effect为NoSchedule'.
kubectl taint nodes foo dedicated:NoSchedule-  #删除节点foo的taint,key为dedicated,effect为NoSchedule

kubectl taint nodes foo dedicated-  #删除节点foo的所有key为dedicated的污点

一个污点包含一个key, value, effect. 示例为 key=value:effect.
effect 只能是 NoSchedule, PreferNoSchedule or NoExecute

有污点的节点,一般pod不会调度上去,但是如果pod能够容忍这个污点就会调度上去,这就是pod的tolerations(taint是节点的属性,tolerations是pod的属性).
如下在PodSpec中定义了toleration,该tolerations完全匹配taint那么该pod就可以被调度到此节点:

tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"
tolerations:
- key: "key"
  operator: "Exists"
  effect: "NoSchedule"

官方指导

https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/

yaml文件、配置相关

查看资源的yaml

kubectl get deploy/my-nginx -o yaml
kubectl get deploy/my-nginx -o yaml > example.yaml

生成yaml文件

由于yaml文件格式不好记住,可以先通过kubectl命令生成yaml,再更改yaml。 –dry-run表示尝试,不真实执行。

kubectl run --image=nginx my-nginx -o yaml --dry-run >> xxx.yaml

修改API 资源的属性

kubectl edit pod/testnew2-prd-123 -n testnew2
//Update a container's image; spec.containers[*].name is required because it's a merge key.
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

//Update a single-container pod's image version (tag) to v4
kubectl get pod mypod -o yaml | sed 's/(image: myimage):.*$/\1:v4/' | kubectl replace -f -

解释资源详细信息,命令可能会显示旧的group/version,我们可以通过--api-version参数显示设置
不知道该如何编写YAML文件的时候,就可以使用改命令来帮助我们获得更多提示信息。

kubectl explain replicaset --api-version apps/v1

不创建文件直接创建资源

cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
  name: flannel-conf
spec: 
  config: '{
    "cniVersion": "0.3.0",
    "type": "flannel",
    "delegate": {
      "isDefaultGateway": true
    }
  }'
EOF

对容器执行命令

对单容器的pod执行命令,注意--后面必须有空格(以在容器内执行命令ip a为例)

kubectl exec -it pod_name -n namespace -- ip a

有的时候一个pod中有多个容器,只有针对整个pod的命令才有效,此时需要指定container,这里指定的是container-name(可以用kubectl describe pod查看所有的容器名称)

kubectl exec -it podname -n namespace -c containername -- ip a

强制删除pod

kubectl delete pod podname -n namespace --force --grace-period=0

文件拷贝, 如下格式把容器中指定目录的文件拷贝到本地磁盘指定目录

kubectl cp pod-name:/path/to/file /tmp/localpath/file

修改容器的镜像,如下是修改daemonset contiv-netplugin-ovs contiv-netplugin的镜像为新镜像,首先要先docker pull新镜像

kubectl set image ds/contiv-netplugin-ovs contiv-netplugin=new-image -n kube-system

然后需要删除需要更新的daemonset中的pod,然后会重建pod,这个pod使用的就是新镜像. 这里的标签是container-name=new-image-name
动态调整副本数

kubectl scale deployment.v1.apps/apitest-deployment --replicas=10 -n namespace

查看pod的log

kubectl log -n namespace pod-name

如果pod里有多个容器,需要制定容器名来查看log:

kubectl log -n namespace pod-name container-1-name

如果容器panic后重启,想查看panic日志,需要查看上一个容器的log:

kubectl logs --previous podname -n namespace
赞(0) 打赏
未经允许不得转载:陈桂林博客 » kubectl 常用命令
分享到

大佬们的评论 抢沙发

全新“一站式”建站,高质量、高售后的一条龙服务

微信 抖音 支付宝 百度 头条 快手全平台打通信息流

橙子建站.极速智能建站8折购买虚拟主机

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册