K8S-CheatSheet


kubernetes 常用操作

查看帮助和集群基本信息

kubectl --help                                 ## 查看帮助
kubectl --version                            ## 查看k8s版本信息
kubectl cluster-info                       ## 查看k8s集群信息,master和服务地址
kubectl cluster-info dump            ## 将集群状态信息输出到stdout
kubectl cluster-info dump --output-directory=/path/to/cluster-state    ## 将集群信息输出到指定目录

在k8s中,如果你对任何一个命令不太清楚如何使用,都可以在命令后加 --help 来查看该命令的帮助文档。

使用kubectl get获取集群资源信息

get命令用于获取集群的一个或者一组resource的相关信息。 resource包括集群节点、运行的pod、deployment、service等。

kubectl get nodes                                      ## 查看集群所有的k8s节点
kubectl get pods                                        ## 查看default的namespace下所有的pods
kubectl get pods --namespace=xx        ## 查看指定namespace下所有的pods
kubectl get pods --all-namespaces      ## 查看所有namespace下的pods
kubectl get deployment my-dep            ##查看指定的deployment
kubectl get pods pod-redis -o yaml      ## 以yaml文件形式显示一个pod的详细信息。

## 根据重启次数排序列出pod
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'

##获取app为redis的所有pod
kubectl get pods --selector=app=redis

## 获取所有app=redis的pods中的version标签
kubectl get pods --selector=app=redis rc -o jsonpath='{.items[*].metadata.labels.version}'

tips

kubectl的get命令可以获取pods, deployment, service, configmap等信息。这些是可以有缩写的,例如: kubectl get po 等价于 kubectl get pods 缩写对应关系有:

po == pods deploy == deployment svc == service cm == configmap 等等。

获取resource集群相关信息

使用kubectl get可以用来获取单个resource的详细信息,但是如果想获取resource集群相关信息时,就需要用kubectl describe了。 kubectl describe和kubectl get类似,但是kubectl describe 不支持-o 选项。

kubectl describe nodes my-node                            ## 获取节点my-node的详细信息
kubectl describe pods my-pod                                ## 获取my-pod的详细信息
kubectl describe deployment my-dp                      ## 获取deployment对象的my-dp的详细信息

另外,如果pod不在running状态,此时使用kubectl get可能无法拿到详细信息,这时可以使用kubectl describe来获取启动相关信息。

资源扩充

kubectl scala用语程序在负载加重或缩小时对副本进行扩容或缩小,比如我们创建了2个nginx副本(replica),此时负载加大或者缩小,需要对集群中的nginx进行调整,可以这么做:

## 将副本数扩展到4:
kubectl scala deployment nginx --replicas=4

## 将副本书扩缩小到1:
kubectl scala deployment nginx --replicas=1

更新资源

kubectl apply可以通过编排文件来部署、更新资源,kubernetes会在引用更新前将当前配置文件中的配置同已经应用的配置进行比较,并且只更新更改的部分,而不会主动更改任何用户未指定的部分。kubectl apply直接在原有resource的基础上进行更新。同时kubectl apply还会对resource添加一条注释,标记当前的apply操作。这个操作类似于git的commit。 使用kubectl apply来更新或者创建一个deployment可以这么做:

kubectl apply -f my-deployment.yaml             ## 如果deployment已经创建,则更新。如果没有则创建。

在k8s中,还可以使用kubectl edit对资源直接进行更新,例如:

kubectl edit deployment my-deployment

修改完之后需要保存退出,如果修改的文件格式正确,k8s会应用这个配置,并将已有deployment的pod重启来应用这个新的配置。
如果修改后的配置文件中有bug,编辑器将无法关闭(再次弹出),此时需要自行修改。

rolling-update

rolling-update是一个非常重要的命令,它保证了在集群资源进行更新时采用的是滚动更新,从而保证了服务持续可用。rolling-update每次启动一个新的pod,待pod启动完毕之后删除一个旧的pod,然后再启动一个新的pod来替换一个旧的pod,直到所有的pod都替换完毕为止。 rolling-update需要确保新的版本有不同的name,version和label,否则会报错:

## 根据rc-nginx.yaml中变更的地方更新rc-nginx-2
kubectl rolling-update rc-nginx-2 -f rc-nginx.yaml

## 如果在升级过程中,发现有问题还可以中途停止update,并回滚到前面版本
kubectl rolling-update rc-nginx-2 --rollback

此外,rolling-update还有很多其他选项,例如:

--update-period  指定间隔周期
--image=image:v2更新镜像

更多的操作和配置,可以使用kubectl rolling-update -h来查看。

删除资源

使用kubectl delete可以删除指定的资源。例如:

kubectl delete -f pod.json                                         ## 删除pod.json文件中定义的类型和名称的pod
kubectl delete pod, service baz foo                         ## 删除名为"baz"的pod和名为"foo"的service
kubectl delete pods,services -l name=myLabel    ## 删除name=myLabel标签的pod和service

强制删除一个状态异常的pod

有时当节点状态不正常时,pod的状态也会异常,例如:Unknow 此时如果要删除这个pod会hang住,因此可以用如下办法进行删除:

kubectl delete po -n pod_name --grace-period=0 --force

tips: 如果删除的pod,那么k8s会默认再启动一个同类型的pod来满足这个pod对应的deployment中配置的副本数要求。 如果删除了deployment,那么对应的pod也都会被杀死,并且不再创建新的pod。

对节点的一些操作

可以给k8s集群中的node、资源打标签。这样在编排容器时,可以为容器指定nodeSector将容器调度到指定label的机器上,比如集群中有IO密集型机器分组和计算密集型机器分组。那可以分别给这2组机器打上对应的标签,然后将不同特定的容器调度到相应的分组上。例如:

kubectl label node my-node type=compute             ## 给节点my-node添加标签type=compute

使用cordon, drain, uncordon对节点进行管理

这3个命令配合使用可以实现节点的维护工作。保证维护节点时,平滑的将被维护节点上的业务迁移到其它节点上,保证业务不受影响。例如如下流程:

1. 假设目前集群有3台机器,m1, m2, m3
2. nginx服务有2个副本运行在m1和m2上
3. 使用cordon命令将m1标记为不可调度
4. 再使用kubectl get nodes查看节点状态,发现m1还是处于Ready状态,但是同时被禁用了调度,这意味着新的pod将不会调度到m1上了。
5. 再查看nginx状态,会发现没有变化,依然运行在m1和m2上
6. 执行drain命令,将运行在m1上的pod平滑迁移到其它节点上
7. 再查看nginx的状态,会发现m1上的副本已经被迁移到了m3上,这时候就可以对m1进行一些节点维护操作,例如升级内核、升级Docker等等。
8. 节点维护完毕之后,使用uncordon命令解锁m1,使其重新变得可调度。
9. 检查节点状态,会发现m1重新变回Ready状态。

这个流程里,需要用到的命令有:

kubectl get node                                   ## 查看集群node状态
kubectl cordon m1                               ## 将m1设置为不可调度
kubectl drain m1                                  ## 将m1设置为不可用,pod将自动迁移到其它node上
kubectl uncordon m1                          ## 解除m1的锁定状态,重新可调度

与运行中的pod进行交互

跟pod进行交互常用的命令是logs和exec。 logs用来显示运行中容器内程序输出到标准输出的内容,跟docker的logs命令类似,如果要获得tail -f的方式,也可以使用-f选项。

kubectl logs my-pod                                          ## 将my-pod中的日志输出到stdout
kubectl logs my-pod -c my-container            ## 将my-pod中my-container的日志输出到stdout(一个pod中有多个container的场景下会用到)
kubectl logs -f my-pod                                       ## 流式输出pod日志到stdout

exec是用来进入到容器中:

kubectl exec my-pod -it bash                                   ## 在容器中执行命令bash

kubectl exec my-pod -c my-container -it bash    ## 在容器my-pod的my-container中执行bash命令