JDKHOME JDKHOME
  • Web

    • 权限框架Twiggy
    • 脚手架BLZO
  • 杂货
技术思考
  • Kubernetes
  • 文档
  • jdkhome
  • 友链
  • 版权声明
  • 分类
  • 标签
  • 归档
  • Web

    • 权限框架Twiggy
    • 脚手架BLZO
  • 杂货
技术思考
  • Kubernetes
  • 文档
  • jdkhome
  • 友链
  • 版权声明
  • 分类
  • 标签
  • 归档
  • Kubernetes学习记录
  • 国内环境ubuntu18安装k8s
  • 部署nginx服务
  • Kubernetes部署ELK日志收集
  • 启动Pod遇到CrashLoopBackOff解决方案
    • 简述
    • 实例 elk服务出现 CrashLoopBackOff
      • 登录master获取pod状态
      • 查看异常pod的详细详细
      • 查看pod的日志
      • 解决
  • Filebeat使用Node方式收集k8s集群日志
  • 主动清理日志
  • k8s修改Master的Ip
  • 手动重启Pod
  • 分配pod到指定的节点
  • jenkins-pipeline自动构建并部署至k8s
  • 搭建K8S高可用集群
  • 搭建redis

Kubernetes 启动Pod 遇到 CrashLoopBackOff 解决方案

# Kubernetes 启动Pod 遇到 CrashLoopBackOff 解决方案

# 简述

CrashLoopBackOff 的含义是:

Kubernetes试图启动该Pod, 但是过程中出现错误, 导致容器启动失败或者正在被删除。

遇到这个问题, 必须得就事论事, 没有统一的解决方案。但是要说思路, 那无非就是看日志, 修改, 尝试启动, 再看日志.

# 实例 elk服务出现 CrashLoopBackOff

我在搭建elk时, elk的Pod 一直处于 CrashLoopBackOff.

# 登录master获取pod状态

ubuntu@master:~/my-study-data/elk$ kubectl get pod
NAME                                READY   STATUS             RESTARTS   AGE
elk-deployment-788969848c-84j6q     0/1     CrashLoopBackOff   6          16m
nginx-deployment-54f57cf6bf-5zqlx   1/1     Running            0          16h
1
2
3
4

# 查看异常pod的详细详细

ubuntu@master:~/my-study-data/elk$ kubectl describe pod elk-deployment-788969848c-84j6q
# ... 省略 ...
Node:         worker2/192.168.12.77
# ... 省略 ...
1
2
3
4

# 查看pod的日志

ubuntu@master:~/my-study-data/elk$ kubectl logs elk-deployment-788969848c-84j6q

# ... 省略 ...
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
# ... 省略 ...
1
2
3
4
5

这就找到了起不起来的原因

# 解决

vm.max_map_count参数,是允许一个进程在VMAs拥有最大数量(VMA:虚拟内存地址, 一个连续的虚拟地址空间),当进程占用内存超过时, 直接OOM。

elasticsearch占用内存较高。官方要求max_map_count需要配置到最小262144。

max_map_count配置文件写在系统的**/proc/sys/vm**中

前面使用 describe 已经知道, elk的Pod现在是在 worker2/192.168.12.77

那么我们进到worker2机器

通过 docker inspect 命令, 可查看docker使用宿主机的/proc/sys作为只读路径之一。

ubuntu@worker2:~$ sudo docker inspect 8ad12516c611
# ... 省略 ...
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
# ... 省略 ...
1
2
3
4
5
6
7
8
9
10

说明镜像使用宿主机的max_map_count参数。因此直接修改宿主机的max_map_count参数即可。

查看 max_map_count 值:

ubuntu@worker2:~$ more /proc/sys/vm/max_map_count
65530
1
2

修改有2种方法:

sudo sysctl -w vm.max_map_count=262144
1

但是这种方法, 机器重启后会失效。

永久修改:

在 /etc/sysctl.conf 文件最后添加一行

vm.max_map_count=262144
1

然后执行

sudo sysctl -p
1

补充

要么在Kubernets 把elk的Pod部署在固定的Node, 要么修改所有Node的vm.max_map_count。 我选择了前者,见分配pod到指定的节点。

上次更新: 2020/06/11, 18:06:00

← Kubernetes部署ELK日志收集 Filebeat使用Node方式收集k8s集群日志 →

最近更新
01
搭建redis
11-21
02
istio安装
10-25
03
搭建K8S高可用集群
09-13
更多文章>
鄂ICP备15015406号 | Copyright © 2015-2020 jdkhome
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式