image.png
这里会以 candao-api-gateway 这个无状态工作负载(Deployment)作为用例

Rancher Server 中操作

  • 大部分情况下都是指在 Rancher Server 的 UI 上点击操作

命令行执行方式


查看 Deployment/Pod 的详细信息

Rancher Server 中操作

查看 Deployment 的详细信息,直接点开即可
image.png_
查看 Pod 的详细信息,在 Deployment 点想查看的 Pod,直接点击进去即可
image.png
查看 容器的详细信息,在 Pod 点想查看的容器,直接点击进去即可
image.png

命令行中执行

使用 kubectl describe 显示特定资源或资源组的详细信息

kubectl describe

显示特定资源或资源组的详细信息。

这个命令将许多API调用连接在一起,形成对给定资源或资源组的详细描述。

可以使用的资源类型包括以下: pods (po), services (svc), deployments, replicasets (rs), replicationcontrollers (rc), nodes (no), events (ev), limitranges (limits), persistentvolumes (pv), persistentvolumeclaims (pvc), resourcequotas (quota), namespaces (ns), serviceaccounts (sa), ingresses (ing), horizontalpodautoscalers (hpa), daemonsets (ds), configmaps, componentstatuses (cs), endpoints (ep), and secrets.

  1. # kubectl -n 命名空间 describe (-f FILENAME | TYPE [NAME_PREFIX | -l label] | TYPE/NAME)
  2. # 以下例子会显示命名空间为 candao-dc6-new 工作负载类型为 deployment 的 candao-api-gateway 的详细信息
  3. kubectl -n candao-dc6-new describe deployment candao-api-gateway
  4. # 以下例子会显示命名空间为 candao-dc6-new POD为 candao-api-gateway-78784df445-nrfhk 的详细信息
  5. kubectl -n candao-dc6-new describe pod candao-api-gateway-78784df445-nrfhk

重启 Pod

Kubernetes 没有提供诸如docker restart类似的命令用于重启容器那样重启pod的命令,可是我们可以通过其他的方式去实现

Rancher Server 中操作

方式 1:
使用 Rancher Server 提供的重新部署功能(Rancher 通过修改 deployment 的 pod template 信息触发滚动更新的逻辑)
选中需要重新部署的 Deployment,下图中选中的是 candao-api-gateway ,即可触发重启的逻辑(滚动更新
image.png
image.png
方式 2:
删除 POD 触发 Deployment 副本数量处于非满足的状态,然后重新生成新的 POD

  • 高级技巧: 按住 Command 键,同时点击 删除 可以绕过提示。
  • 关于 强制删除,强制删除 Pod 并不等待确认 Pod 中的进程是否终止,这可能导致这些进程一直运行,直到节点检测到并完成优雅的删除。如果您的进程使用共享存储或与远程 API 通信,并且依赖于 pod 的名称来标识自己,那么强制删除这些 pod 可能导致多个进程使用相同的标识运行在不同的机器上,这可能导致数据损坏或不一致。只有在确定 Pod 已终止,或者应用程序可以同时运行同一 pod 的多个副本时,才强制删除 pod。此外,如果强制删除 Pod,调度器可能会在节点释放这些资源之前在这些节点上运行新的 Pod,并导致这些 Pod 立即被驱逐。

image.png
确定删除当前 Pod
image.png
可以看到新的 POD 已经启动,旧的处于 Removing 状态
image.png

命令行中执行

方式 1:
使用 **kubectl delete 删除 POD 触发 Deployment **副本数量处于非满足的状态,然后重新生成新的 POD

kubectl delete

通过配置文件名、stdin、资源名称或label选择器来删除资源。

支持JSON和YAML格式文件。可以只指定一种类型的参数:文件名、资源名称或label选择器。

有些资源,如pod,支持优雅的(graceful)删除,因为这些资源一般是集群中的实体,所以删除不可能会立即生效,这些资源在强制终止之前默认定义了一个周期(宽限期),但是你可以使用—grace-period flag来覆盖该值,或者通过pass —now设置该周期为1。

如果托管Pod的Node节点已经停止或者无法连接API Server,使用delete命令删除Pod需等待时间更长。要强制删除资源,需指定- force flag,且设置周期(宽限期)为0。

如果执行强制删除Pod,则调度程序会在节点释放这些Pod之前将新的Pod放在这些节点上,并使之前Pod立即被逐出。

注意:执行delete命令时不会检查资源版本,如果在执行delete操作时有人进行了更新操作,那么更新操作将连同资源一起被删除。

# kubectl -n 命名空间 delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)])
#      --all[=false]: 使用[-all]选择所有指定的资源。
#      --cascade[=true]: 如果为true,级联删除指定资源所管理的其他资源(例如:被replication controller管理的所有pod)。默认为true。
#  -f, --filename=[]: 用以指定待删除资源的文件名,目录名或者URL。
#      --grace-period=-1: 安全删除资源前等待的秒数。如果为负值则忽略该选项。
#      --ignore-not-found[=false]: 当待删除资源未找到时,也认为删除成功。如果设置了--all选项,则默认为true。
#  -o, --output="": 输出格式,使用“-o name”来输出简短格式(资源类型/资源名)。
#  -l, --selector="": 用于过滤资源的Label。
#      --timeout=0: 删除资源的超时设置,0表示根据待删除资源的大小由系统决定。
# 以下例子会删除命名空间为 candao-dc6-new 名称为 candao-api-gateway-d7dc74567-clzk8 的 POD
# 并且使用强制删除 --force --grace-period=0(延迟删除设置为0s,默认30s)
kubectl -n candao-dc6-new delete pod candao-api-gateway-d7dc74567-clzk8 --force --grace-period=0

方式 2:
使用 **kubectl edit** 编辑工作负载的配置,触发滚动更新逻辑

kubectl edit

使用默认编辑器 编辑服务器上定义的资源。

使用命令行工具获取的任何资源都可以使用edit命令编辑。edit命令会打开使用KUBE_EDITOR,GIT_EDITOR 或者EDITOR环境变量定义的编辑器,可以同时编辑多个资源,但所编辑过的资源只会一次性提交。edit除命令参数外还接受文件名形式。

文件默认输出格式为YAML。要以JSON格式编辑,请指定“-o json”选项。

如果在更新资源时报错,将会在磁盘上创建一个临时文件来记录。在更新资源时最常见的错误是几个用户同时使用编辑器更改服务器上资源,发生这种情况,你需要将你的更改应用到最新版本的资源上,或者更新保存的临时副本

# kubectl -n 命名空间 edit deployment(工作负载的类型) 工作负载的名称
# 以下例子会打开命名空间为 candao-dc6-new 工作负载类型为 deployment 的 candao-api-gateway 的编辑
kubectl -n candao-dc6-new edit deployment candao-api-gateway

通过上面的命令行得到以下Yaml配置,通过编辑 spec.**template** 的配置会导致触发滚动更新的逻辑

  • _高级技巧: 例如可以模仿 Rancher 在 _annotations 增加一个时间戳来触发滚动更新的逻辑
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
    ...(省略其余无关内容)
    name: candao-api-gateway
    namespace: candao-dc6-new
    spec:
    ...(省略其余无关内容)
    template:
    metadata:
     annotations:
       cattle.io/timestamp: "2020-12-28T07:21:44Z"
       ...(省略其余无关内容)
     labels:
       app.kubernetes.io/instance: candao-api-gateway
       app.kubernetes.io/name: candao-api-gateway
    ...(省略其余无关内容)
    

调整 Pod 的副本

Rancher Server 中操作

通过点击下图的 - + 即可调整副本数
image.png

命令行中执行

方式 1:
使用 **kubectl scale** 对容器进行缩容或者扩容

kubectl scale

扩容或缩容 Deployment、ReplicaSet、Replication Controller或 Job 中Pod数量。 scale也可以指定多个前提条件,如:当前副本数量或 —resource-version ,进行伸缩比例设置前,系统会先验证前提条件是否成立。

# kubectl -n 命名空间 scale deployment(工作负载的类型) --replicas=副本数 工作负载的名称
# 以下例子会把命名空间为 candao-dc6-new 工作负载类型为 deployment 的 candao-api-gateway 的副本集调整为 2
kubectl -n candao-dc6-new scale deployment --replicas=2 candao-api-gateway

方式 2:
使用 **kubectl edit** 编辑工作负载的配置(可以参考 重启 POD - 命令行中执行 -方式2 中的 kubectl edit 介绍)
通过上面的命令行得到以下Yaml配置,通过编辑 spec.replicas** **的值改变副本数量

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
...(省略其余无关内容)
  name: candao-api-gateway
  namespace: candao-dc6-new
spec:
  replicas: 1
...(省略其余无关内容)

进入 Pod 中执行命令行

Rancher Server 中操作

在需要进入的 Pod 的后面点击省略号,然后点击 执行命令行 即可

  • 高级技巧: 点击运行命令行时按住 Command 键在新窗口中打开

image.png
image.png

命令行中执行

kubectl exec

在容器内部执行命令

# kubectl -n 命名空间 exec POD名称 [-c 容器名称(假如只有一个容器可以传,多个则是必传)] -- COMMAND [args...]
#  -c, --container="": 容器名称(假如只有一个容器可以传,多个则是必传)
#  -p, --pod="": POD名称。
#  -i, --stdin[=false]: 将控制台输入发送到容器。
#  -t, --tty[=false]: 将标准输入控制台作为容器的控制台输入。

# 以下例子会进入命名空间为 candao-dc6-new POD 为 candao-api-gateway-78784df445-nrfhk 的容器中
# 使用 /bin/sh(要看容器具体支持什么,有些容器支持 /bin/bash) 作为命令行
# 并且把将标准输入控制台作为容器的控制台输入和将控制台输入发送到容器
kubectl -n candao-dc6-new exec -it candao-api-gateway-78784df445-nrfhk sh

# 得到以下结果,证明已经进入容器中
# /opt/resin4 #

查看 Pod 运行应用的日志

标准的容器输出

Rancher Server 中操作

假如 POD 的日志是输出到标准的容器输出,就可以在需要查看日志的 Pod 的后面点击省略号,然后点击 查看日志 即可

image.png

命令行中执行

kubectl logs

输出pod中一个容器的日志。

# kubectl -n 命名空间 logs [-f] [-p] POD名称 [-c 容器名称(假如只有一个容器可以传,多个则是必传)]
#  -c, --container="": 容器名。
#  -f, --follow[=false]: 指定是否持续输出日志。
#      --interactive[=true]: 如果为true,当需要时提示用户进行输入。默认为true。
#      --limit-bytes=0: 输出日志的最大字节数。默认无限制。
#  -p, --previous[=false]: 如果为true,输出pod中曾经运行过,但目前已终止的容器的日志。
#      --since=0: 仅返回相对时间范围,如5s、2m或3h,之内的日志。默认返回所有日志。只能同时使用since和since-time中的一种。
#      --since-time="": 仅返回指定时间(RFC3339格式)之后的日志。默认返回所有日志。只能同时使用since和since-time中的一种。
#      --tail=-1: 要显示的最新的日志条数。默认为-1,显示所有的日志。
#      --timestamps[=false]: 在日志中包含时间戳。

# 以下例子会输出命名空间为 candao-dc6-new POD 为 candao-api-gateway-78784df445-nrfhk 的容器的日志
# 并且设置持续输出日志和显示最新的200条日志
# 注意:candao-api-gateway 的日志不在标准的输出中,所以以下命令会输出空的结果
kubectl -n candao-dc6-new logs candao-api-gateway-78784df445-nrfhk -f --tail=200

_

非标准的容器输出

假设我们需要查看的 POD 的日志不是标准的容器输出,而是重定向输出某个目录中的某个文件

餐饮6.0 / 零售

一般情况下来说,餐饮6.0 / 零售 的日志都是存储在 POD 运行的服务器节点的磁盘上,
一般有以下文件:

  • 启动项目的时候控制台重定向的日志信息
    • /data/candao/系统英文名称/sh-console-POD的IP.log
  • 通过 LogBack 生成的控制台日志信息
    • /data/candao/系统英文名称/console-POD的IP.log
  • 通过 LogBack 生成的业务日志信息(JSON格式)
    • /data/candao/系统英文名称/系统英文名称-POD的IP**.**log

方式 1:
服务器节点上运行命令

# 例如获取 candao-api-gateway-78784df445-nrfhk 这个 POD 的信息
kubectl get po -n candao-dc6-new -o wide candao-api-gateway-78784df445-nrfhk 

# 得到以下信息 关注 IP 这一列
# NAME                                  READY   STATUS    RESTARTS   AGE   IP             NODE             NOMINATED NODE   READINESS GATES
# candao-api-gateway-78784df445-nrfhk   1/1     Running   0          21h   10.216.86.36   192.168.20.209   <none>           <none>

直接通过获取到的 IP 拼接日志文件的路径

# 启动项目的时候控制台重定向的日志信息
tail -fn 200 /data/candao/gateway/sh-console-10.216.86.36.log

# 通过 LogBack 生成的控制台日志信息
tail -fn 200 /data/candao/gateway/console-10.216.86.36.log

# 通过 LogBack 生成的业务日志信息(JSON格式)
tail -fn 200 /data/candao/gateway/store-own-10.216.86.36.log

方式 2:
参考 进入 Pod 中执行命令行 的方式,在 POD 中的命令行中运行命令
非 candao-api-gateway

 tail -fn 200 $(echo /data/$(echo ${APP_NAME} | sed 's#candao-#candao/#'))/sh-console-${POD_IP}.log

candao-api-gateway
因为 candao-api-gateway 的日志目录和别的模块不太一样,是在 /data/candao/gateway/** **下的

 tail -fn 200 /data/candao/gateway/sh-console-${POD_IP}.log