版本说明

kubectl:v1.17.6

一、kubectl 常用命令

1、获取命名空间 namespace 列表

1
kubectl get ns

2、获取服务 service 相关信息

可以通过 –all-namespaces 获取 k8s 集群所有的 serivce 列表:

1
kubectl get svc --all-namespaces

同样,像获取 deploy、pod、ingress、configmap 等等也都适用 –all-namespaces 。

也可以通过 -n \ 获取指定 namespace 下的 service 列表:

1
kubectl get svc -n public

3、备份 service 内容

1
kubectl get svc -n <namespace> <serviceName> -o yaml > xxx.yaml

这个 xxx.yaml 文件就是 service 的内容。如果 service 被删除,可以使用一下命令恢复。

1
kubectl apply -f xxx.yaml

4、删除 service

1
kubectl delete svc -n <namespace> <serviceName>

5、查看 deployment 信息

1
kubectl get deploy -n <namespace>

6、修改 deployment

1
kubectl edit deploy -n <namespace>

通常都会进入 deploy 里面修改镜像名、副本数、环境变量等等。该命令也可以用来查看 deploy 信息,不保存变动就是了。

7、查看 pod

1
kubectl get pod -n <namespace>

8、进入 pod shell 操作

交互模式:

1
2
kubectl exec -it -n <namespace> <podName> sh
# 退出pod的话,可以输入 exit 或 Ctrl+D

如果只需要查看 pod 里面的某个文件,可以不进入交互模式,将 sh 替换为 – 执行命令,比如我进入 pod ,查看 pod 的 hosts 文件:

1
kubectl exec -it -n <namespace> <podName> -- cat /etc/hosts

7、重启 pod

根据 k8s 的机制,如果移除某 pod ,deployment 会再创建一个 pod 启动。所以移除 pod ,就可以实现重启 pod 的目的:

1
kubectl delete pod <podName> -n <namespace>

8、查看 pod 所在节点

1
kubectl get pod -owide --all-namespaces

9、查看各pod的内存使用情况

1
kubectl top pod --all-namespaces

10、查看某pod的相关日志

1
kubectl logs -f --tail=100 -n <namespace> <podName>

logs -f –tail=100 表示持续查看最新的 100 行日志。

11、查看上一个死掉的容器的日志

1
kubectl logs -f -p -n <namespace> <podName>

12、查看某pod的相关信息

当日志定位不到错误的时候,可以通过以下命令来查看 pod 容器的运行事件:

1
kubectl describe pod -n <namespace> <podName>

13、k8s node 标签添加、移除相关操作

1
2
3
4
5
6
7
8
9
10
11
# 查看所有k8s机器的标签
kubectl get node --show-labels

# 如果要调度的机器agent-2上没有node标签,那么就执行以下命令:
kubectl label node agent-2 node=public

# 移除agent-2节点上的node标签
kubectl label node agent-2 node-

# 修改一个Label的值,需要加上--overwrite参数:
kubectl label node agent-2 node=public --overwrite

14、k8s 设置节点不可调度

1
2
3
4
5
6
7
[root@master ~]# kubectl cordon node-1 
node/node-1 cordoned
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 21d v1.17.6
node-1 Ready,SchedulingDisabled <none> 12h v1.17.6
node-2 Ready <none> 21d v1.17.6

15、将要删除的节点(node-1)上的 pod 平滑的转移到其他节点上

1
2
3
4
[root@master ~]# kubectl drain node-1 --delete-local-data --force --ignore-daemonsets
node/node-1 cordoned
WARNING: Ignoring DaemonSet-managed pods: kube-flannel-ds-amd64-6nt6g, kube-proxy-vtxzz
pod/nginx-64f497f8fd-hpfhf evicted

16、容器里面的文件目录与本地互相复制

1
2
3
4
5
6
7
8
9
10
11
12
13
# 容器目录/usr/data/hdfs复制到本地
kubectl cp -n <namespace> <podName>:/usr/data/hdfs /tmp/hdfs

# 容器中的文件拷贝到本地
kubectl cp -n <namespace> <podName>:/xxx-query/log/events-service-8.log /tmp/events-service-8.log

# 本地文件复制到容器中的/usr/data/hdfs
kubectl cp hdfs-site.xml -n <namespace> <podName>:/usr/data/hdfs

# pod文件到本地
root@master-1:~# kubectl cp -n public xxx-779b64c974-c5hgx:/home/xxx/xxx/xxx-0.0.1-SNAPSHOT.jar /tmp/xxx-0.0.1-SNAPSHOT.jar
tar: Removing leading `/' from member names
root@master-1:~#

17、创建configmap

取名叫 data-configmap.yaml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
kind: ConfigMap
apiVersion: v1
metadata:
name: data-configmap
namespace: public
labels:
app: data-management
data:
application-test.yml: |-
jasypt:
encryptor:
password: aG9sbHlzeXM=
property:
prefix: test(
suffix: )

spring:
application:
name: data-management
....

创建 configmap:

1
kubectl create configmap data-configmap -n public --from-file=data-configmap.yaml

18、污点相关操作

1
2
3
4
5
6
# 查看污点
kubectl describe node master-1 | grep Taints
# 为某节点增加污点
kubectl taint nodes node1 key1=value1:NoSchedule
# 为某节点移除污点
kubectl taint nodes node1 key1=value1:NoSchedule-

19、k8s 事件

1
2
3
4
5
6
7
8
9
10
11
12
13
# 当前k8s集群,所有事件类型列表:
kubectl api-resources

# 监听事件
kubectl get events -A -w

# 事件结果中的Kind是哪来的?
kubectl get events -A --sort-by='{.metadata.creationTimestamp}' -o json

kubectl get events -A --sort-by='{.metadata.creationTimestamp}' -o jsonpath='{range .items[*]}{.involvedObject.kind}, {.metadata.namespace}, {.involvedObject.name}, {.metadata.name}, {.message}{"\n"}{end}'

查看某一事件记录,将其输出为YAML格式:kubectl get events -n {namespace} {.metadata.name} -o yaml
查看某一事件详情: kubectl describe events -n {namespace} {.involvedObject.name}

20、如何查看某容器化服务的历史镜像tag

1)如果要查看deploy部署的历史镜像tag,可以执行:

1
2
# 指定namespace,以时间正序排列,获取ReplicaSet
kubectl get rs -n <namespace> --sort-by=.metadata.creationTimestamp

列表中,DESIRED、CURRENT、READY 均为 0 的就是你的历史ReplicaSet,在里面可以查看每个ReplicaSet对应的镜像tag。

关于StatefulSet、DaemonSet 如何查看历史镜像tag,等会了再补充。

二、小结

本篇文章,主要列举了 kubectl 常用的命令,主要是对 service、deploy、pod 一些常用操作。等明天再继续更新下 helm 相关的操作,这样对使用 k8s 集群更加方便,我们明天继续分享。