容器化技术(九):Kubernetes中的Pod的资源管理与监控

763 阅读6分钟

一、安装Metrics-Server,采集资源使用情况

想要获得Kubernetes集群中的CPU与内存的资源情况,以前的Kubernetes集群是通过Heapster获取的。本文的Kubernetes集群为1.18的版本,资源的收集需要通过安装metrics-server来实现。有了metrics-server,我们就可以去监测Kubernetes集群中的CPU与内存的使用情况了,同时为我们的集群自动伸缩容技术hpa打好了基础。下载地址如下:

github.com/kubernetes-…

解压:

tar xvzf metrics-server-0.3.6.tar.gz

进入目录metrics-server-0.3.6/deploy/1.8+下面,有如下的yaml文件:

[root@kubernetes-master01 1.8+]# ls -lh
-rw-rw-r--. 1 root root  397 7月  24 2020 aggregated-metrics-reader.yaml
-rw-rw-r--. 1 root root  303 7月  24 2020 auth-delegator.yaml
-rw-rw-r--. 1 root root  324 7月  24 2020 auth-reader.yaml
-rw-rw-r--. 1 root root  298 7月  24 2020 metrics-apiservice.yaml
-rw-rw-r--. 1 root root 1.3K 3月  15 21:22 metrics-server-deployment.yaml
-rw-rw-r--. 1 root root  297 7月  24 2020 metrics-server-service.yaml
-rw-rw-r--. 1 root root  532 7月  24 2020 resource-reader.yaml

在安装之前,需要将文件metrics-server-deployment.yaml,修改几个地方:

  • image: k8s.gcr.io/metrics-server/metrics-server:v0.3.6修改为image: rancher/metrics-server:v0.3.6,因为防火墙的原因,镜像无法下载成功,所以直接采用rancher中的metrics-server:v0.3.6的镜像。
  • 添加两个参数:
    • --kubelet-preferred-address-types=InternalIP,Hostname:metrics-server这个容器不能通过CoreDNS 解析各个Node的主机名,metrics-server连节点时默认是连接节点的主机名,需要加个参数,让它连接节点的IP。
    • --kubelet-insecure-tls:因为10250是https端口,连接它时需要提供证书,所以加上–kubelet-insecure-tls,表示不验证客户端证书。
args:
  - --kubelet-preferred-address-types=InternalIP,Hostname
  - --kubelet-insecure-tls

条件具备,可以运行以下命令安装metrics-server了。

kubectl apply -f metrics-server-0.3.6/deploy/1.8+/

安装显示结果:

clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
serviceaccount/metrics-server created
deployment.apps/metrics-server created
service/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created

查询metrics-server是否安装成功,如下所示,metrics-server正常运行。

[root@kubernetes-master01 1.8+]# kubectl get deployment -n kube-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
coredns          2/2     2            2           35h
metrics-server   1/1     1            1           54m

安装了metrics-server后,我们就可以直接查看Pod或Node的资源占用情况了,CPU的显示中一个CPU是1000m,目前节点kubernetes-master01的CPU是使用了137m,也就是137除以1000的份额的CPU。

[root@kubernetes-master01 ~]# kubectl top node
NAME                  CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
kubernetes-master01   137m         6%     1165Mi          67%
kubernetes-worker01   39m          1%     690Mi           40%
kubernetes-worker02   37m          1%     721Mi           41%
[root@kubernetes-master01 ~]# kubectl top pod
NAME             CPU(cores)   MEMORY(bytes)
pod-busy-nginx   0m           1Mi

除了上面的命令可以直接查看资源的使用情况,我们还可以使用metrics-serverAPI服务:

  • 执行命令kubectl proxy --port=8080,用来开代理端口。

    [root@kubernetes-master01 ~]# kubectl proxy --port=8080
    Starting to serve on 127.0.0.1:8080
    
  • 再开打一个同样的ssh连接,执行命令curl localhost:8080/apis/metrics.k8s.io/v1beta1/,如下图,可以看到API返回的内容:

    [root@kubernetes-master01 ~]# curl localhost:8080/apis/metrics.k8s.io/v1beta1/
    {
      "kind": "APIResourceList",
      "apiVersion": "v1",
      "groupVersion": "metrics.k8s.io/v1beta1",
      "resources": [
        {
          "name": "nodes",
          "singularName": "",
          "namespaced": false,
          "kind": "NodeMetrics",
          "verbs": [
            "get",
            "list"
          ]
        },
        {
          "name": "pods",
          "singularName": "",
          "namespaced": true,
          "kind": "PodMetrics",
          "verbs": [
            "get",
            "list"
          ]
        }
      ]
    }
    
  • 查看具体的Pod的资源使用情况,可以根据如下的命令,指定具体的Pod与namespace。

    [root@kubernetes-master01 ~]# curl localhost:8080/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/pod-busy-nginx
    {
      "kind": "PodMetrics",
      "apiVersion": "metrics.k8s.io/v1beta1",
      "metadata": {
        "name": "pod-busy-nginx",
        "namespace": "default",
        "selfLink": "/apis/metrics.k8s.io/v1beta1/namespaces/default/pods/pod-busy-nginx",
        "creationTimestamp": "2021-03-16T03:28:49Z"
      },
      "timestamp": "2021-03-16T03:28:21Z",
      "window": "30s",
      "containers": [
        {
          "name": "busybox",
          "usage": {
            "cpu": "0",
            "memory": "32Ki"
          }
        },
        {
          "name": "nginx",
          "usage": {
            "cpu": "0",
            "memory": "1440Ki"
          }
        }
      ]
    }
    

二、对Pod进行资源配额实践

当服务部署在虚拟机上时,虚拟机本身的资源是和物理机隔离的,换句话说服务部署在虚拟机上最大只能使用虚拟机本身限制内的资源。进入Kubernetes的世界后,读者在生产中对应的微服务应用都会对应成Pod进行部署。Pod在Kubernetes中就相当于虚拟机的存在,当然也是需要对其资源进行限制的,这样才能保证集群的稳定运行。

主要的资源限制分为两类,CPU与内存。

对于资源的需求,分为默认需要的资源与资源的最大限制两类:

  • request:预定义容器需要的最基本的资源,在Pod调度到Node的过程中,需要保证Node上有Pod中定义的request需要的资源,否则不会将Pod调度到对应的Node上。
  • limit:可以分配和Pod的最大的资源的数量,如果Pod需要的的资源大于此限制,Pod可能会被关闭与删除。

在没有添加资源限制之前,vim pod-centos.yaml:

apiVersion: v1
kind: Pod
metadata:
   name: centos
spec:
   containers:
   - name: centos
     image: centos
     command: ["/bin/sh"]
     args: ["-c", "i=0; while true; do i=i+1; done"]

应用yaml,创建Pod:

[root@kubernetes-master01 k8s-yaml]# kubectl apply -f pod-centos.yaml
pod/centos created

查看资源的使用情况,因为Pod中有个while的死循环的脚本一直在运行,所以CPU一直在上升。

[root@kubernetes-master01 k8s-yaml]# kubectl top pod
NAME           CPU(cores)   MEMORY(bytes)
centos         1000m        0Mi

我们在Pod的中添加对于资源的限制:

apiVersion: v1
kind: Pod
metadata:
   name: centos-limit
spec:
   containers:
   - name: centos
     image: centos
     command: ["/bin/sh"]
     args: ["-c", "i=0; while true; do i=i+1; done"]
     resources:
       requests:
         cpu: 0.2
         memory: 50Mi
       limits:
         cpu: 0.6
         memory: 800Mi

按照以下步骤,验证下CPU是否在limit的限额之内,如下所示,CPU达到600m后,就不再上升了。

[root@kubernetes-master01 k8s-yaml]# kubectl apply -f pod-centos-limit.yaml
pod/centos-limit created
[root@kubernetes-master01 k8s-yaml]# kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
centos-limit   1/1     Running   0          7s
[root@kubernetes-master01 k8s-yaml]# kubectl top pod
NAME           CPU(cores)   MEMORY(bytes)
centos-limit   600m         0Mi

requests的含义在于,Pod至少可以分配到的资源,虽然有可能Pod并用不上这么多资源,requests是最低的保证。我们接下来运行一个只是运行sleep命令的centos的Pod centos-request,观看其资源的使用情况。

pod-centos-request.yaml文件的内容如下:

apiVersion: v1
kind: Pod
metadata:
   name: centos-request
spec:
   containers:
   - name: centos
     image: centos
     command: ["/bin/sh"]
     args: ["-c", "echo Hello; sleep 3600;"]
     resources:
       requests:
         cpu: 0.2
         memory: 50Mi
       limits:
         cpu: 0.6
         memory: 800Mi

具体的操作步骤如下:

[root@kubernetes-master01 k8s-yaml]# kubectl apply -f pod-centos-request.yaml
pod/centos-request created
[root@kubernetes-master01 k8s-yaml]# kubectl get pod
NAME             READY   STATUS    RESTARTS   AGE
centos-request   1/1     Running   0          21m
[root@kubernetes-master01 k8s-yaml]# kubectl top pod
NAME             CPU(cores)   MEMORY(bytes)
centos-request   0m           0Mi

经过验证,如上所示,虽然requests中的cpu的0.2,但是实际上Pod centos-request的cpu占用为0。

三、

如果你对Kubernetes的相关知识比较感兴趣,可以阅读本专栏的系列文章:秀丽的Kubernetes专栏