k8s运维故障

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

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 version kubeadm版本

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

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wind.kaisa@gmail.com

💰

×

Help us with donation