kaisawind's blog
  • 关于
  • 所有帖子

k8s运维故障 - Mon, Apr 1, 2019

k8s运维故障维护和紧急对应方案。

  • 1. kubernetes(k8s)设计架构
  • 2. kubectl常用命令
    • 2.1 获取节点状态
    • 2.2 设定节点进入维护状态
    • 2.3 删除节点
    • 2.4 获取服务状态
    • 2.5 重启服务
    • 2.6 服务日志
  • 3. kubeadm常用命令
  • 4. helm常用命令
    • 4.1 安装chart
    • 4.2 更新
    • 4.3 列出所有chart
    • 4.4 删除chart
  • 5. 可视化管理工具
    • 5.1 集群状态
    • 5.2 服务状态
    • 5.3 服务日志
  • 6. 服务器故障
    • 6.1 全服务器断电
    • 6.2 Node节点服务器故障
    • 6.3 master节点服务器故障
    • 6.4 Node节点服务器追加
    • 6.5 Master/Node节点服务器删除
      • 6.5.1 设定节点为维护状态
      • 6.5.2 从集群内删除节点
    • 6.6 服务故障无法自动重启
      • 6.6.1 截取故障服务的日志
      • 6.6.2 重启服务
    • 6.7 更新服务
      • 6.7.1 获取更新之后的服务镜像
      • 6.8.2 重命名镜像
      • 6.8.3 上传镜像到本地服务器
      • 6.8.4 重启服务
    • 6.9 数据库修改
    • 6.10 更新服务属性

1. kubernetes(k8s)设计架构

Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。

k8s

2. kubectl常用命令

kubenetes管理工具kubectl。kubectl需要在master节点运行。

命令作用
kubectl annotate更新资源的注解。
kubectl api-versions以“组/版本”的格式输出服务端支持的API版本。
kubectl apply通过文件名或控制台输入,对资源进行配置。
kubectl attach连接到一个正在运行的容器。
kubectl autoscale对replication controller进行自动伸缩。
kubectl cluster-info输出集群信息。
kubectl config修改kubeconfig配置文件。
kubectl create通过文件名或控制台输入,创建资源。
kubectl delete通过文件名、控制台输入、资源名或者label selector删除资源。
kubectl describe输出指定的一个/多个资源的详细信息。
kubectl edit编辑服务端的资源。
kubectl exec在容器内部执行命令。
kubectl expose输入replication controller,service或者pod,并将其暴露为新的kubernetes service。
kubectl get输出一个/多个资源。
kubectl label更新资源的label。
kubectl logs输出pod中一个容器的日志。
kubectl patch通过控制台输入更新资源中的字段。
kubectl port-forward将本地端口转发到Pod。
kubectl proxy为Kubernetes API server启动代理服务器。
kubectl replace通过文件名或控制台输入替换资源。
kubectl rolling-update对指定的replication controller执行滚动升级。
kubectl run在集群中使用指定镜像启动容器。
kubectl scale为replication controller设置新的副本数。
kubectl version输出服务端和客户端的版本信息。

2.1 获取节点状态

kubectl get node
  • NAME: 节点名
  • STATUS: 节点状态(Ready为正常,NotReady为不正常)
  • ROLES: 节点的角色
  • AGE: 节点运行时间
  • VERSION: k8s版本

kubectl get node

2.2 设定节点进入维护状态

kubectl drain <node name> --delete-local-data --force --ignore-daemonsets

2.3 删除节点

kubectl delete node <node name>

2.4 获取服务状态

kubectl get pod -n iot
  • POD: k8s种最小资源单位
  • -n: namespace的缩写(获取指定名空间下的资源状态)
  • NAME: POD名
  • READY: 资源副本数
  • STATUS: 状态
  • RESTARTS: 重启次数
  • AGE: 运行时间

kubectl get node

2.5 重启服务

由RC或RS进行管理的POD删除之后会自动创建,我们可以利用这点强制重启POD。(单一POD不适用)

kubectl delete pod <pod name> -n iot

2.6 服务日志

查看某个服务的日志

kubectl logs <pod name> -n iot -f
  • -n: namespace的缩写(获取指定名空间下的资源)
  • -f: 日志持续输出

3. kubeadm常用命令

使用kubeadm创建集群

命令作用
kubeadm init初期化k8s的master
kubeadm join将Node节点加入集群
kubeadm reset初期化节点(kubeadm init 或 kubeadm join)
kubeadm token管理token
kubeadm upgrade升级k8s集群
kubeadm versionkubeadm版本

4. helm常用命令

命令作用
helm install安装chart
helm upgradge更新chart
helm ls列出所有chart
helm delete删除所有chart

4.1 安装chart

将chart安装到指定的名空间下。 多次更新同一资源会保留最新的资源

helm install <chart> --namespace=iot

4.2 更新

更新chart

helm upgrade <chart> --namespace=iot

4.3 列出所有chart

helm ls
  • NAME: chart名
  • REVISION: 更新的版本数
  • UPDATED: 上次更新时间
  • STATUS: chart状态
  • chart: app名
  • APP VERSION: app版本
  • NAMESPACE: k8s名空间

helm list

4.4 删除chart

删除chart但是更新记录仍然会存在

helm delete <chart name>

完全删除chart

helm delete <chart name> --purge

5. 可视化管理工具

kubernetes(k8s)提供了集群可视化管理工具dashboard。

kubectl get node

5.1 集群状态

侧边栏-集群-节点

5.2 服务状态

侧边栏-命名空间

侧边栏-工作负载-容器组

kubectl get node

5.3 服务日志

侧边栏-工作负载-容器组-<服务>-日志

kubectl get node

6. 服务器故障

6.1 全服务器断电

全服务器断电,只需要把服务器重新启动,服务会自动部署和重启。

启动顺序: 数据服务器->master节点->node节点

6.2 Node节点服务器故障

故障服务器重启之后,master会自动控制Node节点进行服务启动和部署。

6.3 master节点服务器故障

故障服务器重启之后,其他master会自动控制master节点进行服务启动和部署。

6.4 Node节点服务器追加

  1. 使用kubeadmin初期话Node节点。kubeadm创建集群

  2. 使用kubeadmin join将节点加入集群

  3. Node加入集群之后,master会自动对服务进行管理。

6.5 Master/Node节点服务器删除

6.5.1 设定节点为维护状态

如果节点与集群断开连接,则不需要执行

kubectl drain <node name> --delete-local-data --force --ignore-daemonsets

6.5.2 从集群内删除节点

kubectl delete node <node name>

6.6 服务故障无法自动重启

6.6.1 截取故障服务的日志

由于硬件原因或者第三方服务愿意,导致服务重启之后立刻失败。 这种情况需要针对日志进行分析。

kubectl截取日志

kubectl logs <pod name> <pod name>.log

dashboard的日志页面,点击下载按钮下载日志

6.6.2 重启服务

由RC或RS进行管理的POD删除之后会自动创建,我们可以利用这点强制重启POD。(单一POD不适用)

kubectl delete pod <pod name> -n iot

dashboard: 通过删除容器重启服务

kubectl get node

6.7 更新服务

6.7.1 获取更新之后的服务镜像

从远程服务器获取镜像

docker pull <镜像名>

从镜像文件加载

docker load <镜像名>

6.8.2 重命名镜像

docker tag <镜像名> <k8s集群镜像名>

6.8.3 上传镜像到本地服务器

docker push <k8s集群镜像名>

6.8.4 重启服务

由RC或RS进行管理的POD删除之后会自动创建,我们可以利用这点强制重启POD。(单一POD不适用)

kubectl delete pod <pod name> -n iot

dashboard: 通过删除容器重启服务

kubectl get node

6.9 数据库修改

数据库文件被保存到了数据服务器,并且进行了备份操作。如果需要修改数据库,不能修改数据库文件,需要通过mongodb进行间接修改。(尽量不要这么做!)

获取局域网能够访问到的数据库地址:

kubectl get service mongo-service -n kube-public

kubectl get service

通过dashboard查看

kubectl get service

mongodb局域网地址:<master ip>:14561

6.10 更新服务属性

虽然可以通过直接修改k8s资源的方式修改服务属性,但是由于k8s的资源是通过helm进行维护,在下次helm upgrade时,直接修改的属性将会丢失,所以需要通过helm进行属性的修改。

helm upgrade <chart name> --namespace=iot


辽ICP备2021007608号 | © 2025 | kaisawind

Facebook Twitter GitHub