查看pod启动失败原因

Focusing specifically on the example showed in the question.

The setup is following:

  • 1 GKE node with: 1 vCPU and 3.75 GB of RAM

The resources scheduled onto this single node cluster:

  • 4 Deployments where each have following fields:
        resources:
          requests: # <-- IMPORTANT
            cpu: "100m" # <-- IMPORTANT
            memory: "128Mi"
          limits:
            cpu: "100m"
            memory: "128Mi"

For an example I tried to replicate setup as close as possible to the one in the question:

  • $ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
nginx-four-99d88fccb-v664b     0/1     Pending   0          51m
nginx-one-8584c66446-rcw4p     1/1     Running   0          53m
nginx-three-5bcb988986-jp22f   1/1     Running   0          51m
nginx-two-6c9545d7d4-mrpw6     1/1     Running   0          52m

As you can see there is a Pod that is in Pending state. Further investigation implies:

  • $ kubectl describe pod/nginx-four-99d88fccb-v664b

A lot of information will show about the Pod but the part that needs to be checked is Events:

Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  56m (x2 over 56m)  default-scheduler  0/1 nodes are available: 1 Insufficient cpu.
  Normal   Scheduled         56m                default-scheduler  Successfully assigned default/nginx-two-6c9545d7d4-mrpw6 to gke-gke-old-default-pool-641f10b7-36qb
  Normal   Pulling           56m                kubelet            Pulling image "nginx"
  Normal   Pulled            56m                kubelet            Successfully pulled image "nginx"
  Normal   Created           56m                kubelet            Created container nginx
  Normal   Started           56m                kubelet            Started container nginx

As you can see from above output:

  • FailedScheduling: ... 0/1 nodes are available: 1 Insufficient cpu

As posted in the question:

I keep getting not having enough cpu availability even the node is using only 9% cpu at the same time.

Http: server gave HTTP response to HTTPS client 解决方法

系统:CentOS 7.6 Minimal
镜像:CentOS-7-x86_64-Everything-1810
Docker版本:18.09.6, build 481bc77156

如果没有 /etc/docker/daemon.json 这个文件,可以自己新建一个

情况1.这种写法是没有配置Docker加速器的情况下

在 /etc/docker/daemon.json 中设置以下:

// 没有配置加速器的

// 单个私服的写法
{
“insecure-registries”: [“registry的IP地址:端口号”]
}
// 多个私服的写法
{
“insecure-registries”: [“registry1的IP地址:端口号”,”registry2的IP地址:端口号”]
}

1
2
3
4
5
6
7
8
9
10

情况2.这种写法是配置过Docker加速器的情况下

在 /etc/docker/daemon.json 中设置以下:

// 没有配置加速器的

// 单个私服的写法
{
“registry-mirrors”: [“http://f1361db2.m.daocloud.io”],
“insecure-registries”: [“registry的IP地址:端口号”]
}
// 多个私服的写法
{
“registry-mirrors”: [“http://f1361db2.m.daocloud.io”],
“insecure-registries”: [“registry1的IP地址:端口号”,”registry2的IP地址:端口号”]
}

1
2
3
4
5
6
7
8
9
10
11
12

以上配置完成以后使用命令

systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service

————————————————
版权声明:本文为CSDN博主「兔子不会武功」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liyin6847/article/details/90599612

Rancher环境下的catalog创建

项目描述:在Rancher 的catalog界面中新加一个catalog,用这个catalog创建的stack可以正常工作。
实现环境
在局域网内四台vmware的ESX虚拟机中进行试验,其中A(192.168.4.33)机器上启动rancherServer,另外B(192.168.4.27)和C(192.168.4.46)通过AddHost的方式添加进来。B和C主机添加进去之后,对每个主机进行编辑,各自添加一个hostname=B和C的labels,本步骤是为了后面测试catalog的docker-compose.yml中指定在哪台机器上运行是否正确。D(192.168.4.12)主机作为Registry。选择添加进catalog的的应用是GoToMyCloud官网。(注释: GoToMyCloud是一款 用于远程办公的远程PC控制软件 )
实现步骤:
说明:GoToMyCloud Web项目主要有两个服务器组成:
A: mysql数据库服务器
此服务器用容器来代替,需要在容器启动的时候带动mysql服务程序,并在第一次启动时将数据库的表建出来。
B:tomcat网页服务器
需安装java和tomcat ,将GoToMyCloud网页代码做成java的war包放在tomcat的指定路径下,就可访问网页。war包中有个配置用于指定数据库的IP地址,地址在做war包的时候,为了利用容器之间的link关系,需要进行修改,将ip地址换成mysql服务器的容器名称,这里定下来用mysqlhost。
具体的实现步骤如下
1.搭建私有registry;
2.编写Dockerfile,制作mysql和tomcat的镜像;
3.编写docker-compose.yml和rancher- compose.yml,为创建新的catalog做准备;
4.添加自定义的catalog到rancher UI中并测试。
搭建私有Registry

搭建Registry的步骤只有一步,运行如下命令就可以创建一个registry的容器:


在上面的这个命令中,一定要使用-v做个主机目录和regsitry目录的映射,这样的好处是容器崩溃了,数据依然还在,重建regsitry的话数据就可以恢复了。
客户端使用此registry时,如果不修改/etc/sysconfig/docker这个配置文件,会报“认证不过”的错误。在这个文件中找到OPTIONS这个key,在后面的值中加:
–insecure-registry 192.168.4.12:80

保存后,通过service docker restart 就可以访问这个私有的Registry了。

编写Dockerfile,制作mysql和tomcat的镜像
mysql镜像制作:
1.使用docker pull ubuntu命令先取下一个ubuntu的镜像作为基础镜像;

2.基于这个镜像使用docker run –name ubuntu_mysql –it bash命令创建一个容器,在这个容器中使用apt-get install mysql-server,安装过程中会提示输入密码这个使用Cloudsoar12,安装完成后,需要配置mysql允许外部主机访问,这里要改两个地方:

A. /etc/mysql/my.cnf中找到bind-addree=127.0.0.1这行,然后把他注释掉,然后重启mysql服务;
B.使用mysql进入服务器,设置mysql允许其他主机访问。

3.将第二步中配置好的容器通过docker commit ubuntu 192.168.2.35:80/base _mysql做成一个服务镜像,其中192.168.2.35:80是搭建的私有Registry,做成镜像后,通过push命令将这个镜像提交到私有Registry中。
4.编写Dockerfile制作应用镜像。 新建一个目录,命名为mysql,在这个目录下,放置如下三个文件:
A:GoToMyCloudDB.sql
容器首次启动时,通过这个文件可以将数据库表建出来。
B:run.sh
启动mysql服务,并且判断是否是第一次启动,如果是就导入GoToMyCloudDB.sql。里面的具体内容如下:
C:Dockerfile 文件
内容如下:

在mysql这个目录下,建出上面的三个文件后,通过使用docker build –t 192.168. 4.12:80/brank_mysql,制作服务镜像,做完后上传到私有Registry上。

tomcat镜像制作
GoToMyCloud项目对tomcat的要求是8.0以上,在dockerhub上有一个版本叫做emedeiros/tomcat的,这个里面安装好了8.0.4的tomcat,java环境也已经配置好了,选择它作为服务镜像,具体的步骤如下:

1.先使用docker pull 将emedeiros/tomcat 拉到本地;

2.新建一个目录,取名为tomcat,在这个目录下放3个文件:

A:GoToMyCloud.war,放网页代码
B:Run.sh,容器启动后的执行脚本,内容如下:
C:Dockerfile文件,里面的内容如下:

完成这步后使用docker build 将这个镜像打出来,并上传到registry上,比如叫做 192.168.2.35:80/brank_tomcat。

测试镜像
为了确认上面打出来的两个镜像是否是没有问题的,先不适用docker-compose来做,先通过docker 命令来启动两个容器,看是否可以把整个项目运行起来。验证步骤如下:

1.在192.168.4.46的主机上创建mysql 容器;docker run –name gotomycloud_mysql -d -p 3306:3306 192.168. 4.12:80/brank_mysql

2.在192.168.4.46的主机上创建tomcat 容器;

3.打开局域网里的浏览器访问192.168.4.46:8080/GoToMyCloud看是否可以正常访问,正常的话说明制作的两个镜像是没有问题的。