Kubernetes Cookbook 编程指南 中文版教程
创建时间:2018-12-07  访问量:3673  7  0

Kubernetes Cookbook 编程指南 中文版教程

在任何基础架构中,计算的资源管理都是相关重要的。我们应该充分了解我们的应用程序,并保留足够的CPU和内存容量,这样就可以很好的阻止资源耗尽。在本节,我们将介绍,如何在Kubernetes 节点中管理节点的容易。此外,我们也将描述如何管理Pod计算资源。

开始

在开始管理计算资源之前,你应该充分了解你的应用程序,要知道它们运行时所需要的最大资源。开始之前,检查当前节点容量,我们可以使用kubectl命令,它在第1章构建你自己的Kubernetes中介绍过。

// check current node capacity
# kubectl get nodes -o json | jq '.items[] | {name: .metadata.name,capacity: .status.capacity}'
{
	"name": "kube-node1",
	"capacity": {
		"cpu": "1",
		"memory": "1019428Ki",
		"pods": "40"
	}
}{
	"name": "kube-node2",
	"capacity": {
		"cpu": "1",
		"memory": "1019428Ki",
		"pods": "40"
	}
}

目前,你应该知道,我们有两个节点,每个节点都是1核CPU和1019428字节的内存。每个节点最大能有40个Pod的容量。然后,我们就可以开始计划了。节点中允许使用多少资源?容器中又允许使用多少资源?

如何去做...

当Kubernetes调度器在节点上调度一个Pod运行,它将总是保证容器资源的总限制要少于节点的容量。如果一个节点上的资源耗尽了,Kubernetes将不会再在其上调度任何新的容器。当你启动一个Pod时,如果没有节点可用,那么Pod将会保持在Pending状态,因为Kubernetes调度器不能找到任何可以运行这个Pod的节点。

管理节点的容量

有时候,我们想要在节点上明确为其它或将来需要使用进程保留一些资源。比如说,我们想要在所有节点上保留200MB资源。首先,需要创建一个Pod并在Kubernetes中运行一个pause容器。Pause是每个Pod上都有的一个容器以用于转发流量。在这种情形下,我们将创建一个资源保留Pod,它不做任何事,只占用了200MB限制的资源:

// configuration file for resource reserver
# cat /etc/kubernetes/reserve.yaml
apiVersion: v1
kind: Pod
metadata:
	name: resource-reserver
spec:
    containers:
    - name: resource-reserver
        image: gcr.io/google_containers/pause:0.8.0
        resources:
            limits:
                memory: 200Mi

因为它是一个pod infra容器,我们不能使用kubectl来启动它。注意,我们将它放在/etc/kubernetes/文件夹中。你可以将它放在不同的路径下;写下这个路径并将它添加到kubelet配置文件中来启动它。找到你在第1章构建你自己的Kubernetes中指定的kubelet的配置文件,并在启动kubelet时添加以下参数:--config=/etc/kubernetes/reserve.yaml。重启kubelet。在重启kubelet之后,我们看一下节点中kubelet的日志:

I0325 20:44:22.937067 21306 kubelet.go:1960] Starting kubelet main
sync loop.
I0325 20:44:22.937078 21306 kubelet.go:2012] SyncLoop (ADD):
"resource-reserver-kube-node1_default"
I0325 20:44:22.937138 21306 kubelet.go:2012] SyncLoop (ADD):
"mynginx-e09bu_default"
I0325 20:44:22.963425 21306 kubelet.go:2012] SyncLoop (ADD):
"resource-reserver-kube-node1_default"
I0325 20:44:22.964484 21306 manager.go:1707] Need to restart pod
infra container for "resource-reserver-kube-node1_default" because it
is not found

kubelet将检查infra容器是否存在,然后再相应的创建它:

// check pods list
# kubectl get pods
NAME READY STATUS RESTARTS AGE
resource-reserver-kube-node1 1/1 Running 0 3m

Kubernetes Master意识到资源保留Pod已经创建了。让我们描述下细节并深入观察一下:

# kubectl describe pods resource-reserver-kube-node1
Name: resource-reserver-kube-node1
Namespace: default
Image(s): gcr.io/google_containers/pause:0.8.0
Node: kube-node1/10.0.0.224
Start Time: Fri, 25 Mar 2016 20:44:24 +0000
Labels: <none>
Status: Running
IP: 192.168.99.3
Replication Controllers: <none>
Containers:
    resource-reserver:
        ...
        QoS Tier:
        	memory: Guaranteed
        Limits:
        	memory: 200Mi
        Requests:
        	memory: 200Mi
        State: Running
        	Started: Fri, 25 Mar 2016 20:44:24 +0000
        Ready: True

我们可以发现limits和request都被设置为了200Mi;这意味着,这个容器已经保留了最小和最大为200MB的资源。重在其它节点上复相同的步骤并使用kubectl命令检查这个状态:

# kubectl get pods
NAME READY STATUS RESTARTS AGE
resource-reserver-kube-node1 1/1 Running 0 11m
resource-reserver-kube-node2 1/1 Running 0 42m

limits或requests?

Kubernetes调度器在一个节上通过检查剩余计算资源来调度一个Pod的运行。我们可以为每个我们要运行的Pod指定limits和requests。limit意味着这个Pod可占用的最大资源。request意味着这个Pod所需要最小资源。我们可以使用以下面的不等式来表示它们之间的关系:0 <= request <= the resource this pod occupies <= limit <= node capacity。

管理Pod中的计算资源

管理Pod中容量的概念,节点也一样。它们都在容器资源的spec下指定了requests和limits。

我们来创建一个nginx pod,使用kubectl create -f nginx-resource.yaml,并指定特定的requests和limits,然后启动它:

# cat nginx-resources.yaml
apiVersion: v1
kind: Pod
metadata:
    name: nginx
    labels:
    	name: nginx
spec:
    containers:
    - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        resources:
            requests:
                cpu: 250m
                memory: 32Mi
            limits:
                cpu: 500m
                memory: 64Mi
                

// create the pod
# kubectl create -f nginx-resources.yaml
pod "nginx" created

下面是这个Pod中可用的资源:

  • CPU: 250 milli core ~ 500 milli core

  • Memory: 32MB ~ 64 MB

请注意最小CPU限制被设置为10 millicore。你不可以指定一个比最少限制还少的值。我们通过kubectl获得更详细的信息:

# kubectl describe pod nginx
Name: nginx
Namespace: default
Image(s): nginx
Node: kube-node1/10.0.0.224
Start Time: Fri, 25 Mar 2016 21:12:43 +0000
Labels: name=nginx
Status: Running
Reason:
Message:
IP: 192.168.99.4
Replication Controllers: <none>
Containers:
    nginx:
        ...
        QoS Tier:
            cpu: Burstable
            memory: Burstable
        Limits:
            memory: 64Mi
            cpu: 500m
        Requests:
            cpu: 250m
            memory: 32Mi
        State: Running
        	Started: Fri, 25 Mar 2016 21:12:44 +0000
        Ready: True
        Restart Count: 0

一切都如期望的一样。Qos层是Burstable。相比于Guaranteed、Burstable,有一个缓存来打破这个限制;然而,Guaranteed会总是为Pod保留确定的资源。请注意,如果你使用Guaranteed指定了太多的Pod,集群利用率将会变得很低,因为如果容器没有一直达到极限就会浪费资源。

还可参考

本节,你学习了如何限制Kubernetes中的计算资源。我们给容器以更多的控制。查看以下章节:

  • 第1章构建你自己的Kubernetes,准备环境和Node配置这一节

  • 第2章理解Kubernetes相关概念,命名空间的使用这一节

  • 第3章玩转容器,配置文件的使用

  • 第8章记录与监示,监示Master和Node这一节