专栏名称: 分布式实验室
最专业的Docker文章,最权威的Docker新闻。关注容器生态圈的发展。
目录
相关文章推荐
Java知音  ·  SpringBoot 实现接口防刷的 5 ... ·  昨天  
Java知音  ·  SpringBoot 实现接口防刷的 5 ... ·  昨天  
51好读  ›  专栏  ›  分布式实验室

Kubernetes 部署失败的 10 个最普遍原因(二)

分布式实验室  · 公众号  · 后端  · 2017-05-05 07:46

正文

请到「今天看啥」查看全文



kubectl describe replicaset gateway-quota-551394438

Name:        gateway-quota-551394438

Namespace:    fail

Image(s):    nginx

Selector:    app=gateway,pod-template-hash=551394438

Labels:        app=gateway

   pod-template-hash=551394438

Replicas:    1 current / 3 desired

Pods Status:    1 Running / 0 Waiting / 0 Succeeded / 0 Failed

No volumes.

Events:

FirstSeen    LastSeen    Count   From                SubObjectPath   Type        Reason          Message

---------    --------    -----   ----                -------------   --------    ------          -------

11m        11m     1   {replicaset-controller }            Normal      SuccessfulCreate    Created pod: gateway-quota-551394438-pix5d

11m        30s     33  {replicaset-controller }            Warning     FailedCreate        E


哦!我们的 ReplicaSet 无法创建更多的 pods 了,因为配额限制了:exceeded quota: compute-resources, requested: pods=1, used: pods=1, limited: pods=1。


和资源限额类似,我们也有 3 个选项:


  1. 要求集群管理员提升该 namespace 的配额


  2. 删除或者收缩该 namespace 下其它的 deployment


  3. 直接编辑配额


7. 集群资源不足


除非你的集群开通了集群自动伸缩功能,否则总有一天你的集群中 CPU 和内存资源会耗尽。


这不是说 CPU 和内存被完全使用了,而是指它们被 Kubernetes 调度器完全使用了。如同我们在第 5 点看到的,集群管理员可以限制开发者能够申请分配给 pod 或者容器的 CPU 或者内存的数量。聪明的管理员也会设置一个默认的 CPU/内存 申请数量,在开发者未提供申请额度时使用。


如果你所有的工作都在 default 这个 namespace 下工作,你很可能有个默认值 100m 的容器 CP U申请额度,对此你甚至可能都不清楚。运行 kubectl describe ns default 检查一下是否如此。


我们假定你的 Kubernetes 集群只有一个包含 CPU 的节点。你的 Kubernetes 集群有 1000m 的可调度 CPU。


当前忽略其它的系统 pods(kubectl -n kube-system get pods),你的单节点集群能部署 10 个 pod(每个 pod 都只有一个包含 100m 的容器)。


10 Pods * (1 Container * 100m) = 1000m == Cluster CPUs


当你扩大到 11 个的时候,会发生什么?


下面是一个申请 1CPU(1000m)的 deployment 例子:


# cpu-scale.yaml

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: cpu-scale

spec:

template:

metadata:

 labels:

   app: cpu-scale

spec:

 containers:

   - name: test-container

     image: nginx

     resources:

       requests:

         cpu: 1


我把这个应用部署到有 2 个可用 CPU 的集群。除了我的 cpu-scale 应用,Kubernetes 内部服务也在消耗 CPU 和内存。


我们可以用 kubectl create -f cpu-scale.yaml 部署这个应用,并观察 pods:


$ kubectl get pods

NAME                        READY     STATUS    RESTARTS   AGE

cpu-scale-908056305-xstti   1/1       Running   0          5m


第一个 pod 被调度并运行了。我们看看扩展一个会发生什么:


$ kubectl scale deploy/cpu-scale --replicas=2

deployment "cpu-scale" scaled







请到「今天看啥」查看全文