<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>kubenetes | 伪架构师</title>
    <link>/tags/kubenetes/</link>
      <atom:link href="/tags/kubenetes/index.xml" rel="self" type="application/rss+xml" />
    <description>kubenetes</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Wed, 23 Jan 2019 07:46:52 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>kubenetes</title>
      <link>/tags/kubenetes/</link>
    </image>
    
    <item>
      <title>GKE 中配置 Pod 的垂直伸缩</title>
      <link>/post/vertical-pod-autoscaling/</link>
      <pubDate>Wed, 23 Jan 2019 07:46:52 +0800</pubDate>
      <guid>/post/vertical-pod-autoscaling/</guid>
      <description>

&lt;p&gt;原文：&lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/how-to/vertical-pod-autoscaling&#34; target=&#34;_blank&#34;&gt;Configuring vertical pod autoscaling&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;在 GKE 1.11.3 中提供了 Pod 垂直伸缩功能的 Beta 版本。这一功能在未来可能会收取费用，没有提供 SLA 以及过期策略，也有可能发生不向后兼容的更改。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;本文阐述如何在 GKE 中配置 Pod 的垂直伸缩，该功能包含对 Pod 的 CPU 和内存申请进行调整的能力。&lt;/p&gt;

&lt;h2 id=&#34;概述&#34;&gt;概述&lt;/h2&gt;

&lt;p&gt;可以配置 &lt;a href=&#34;https://cloud.google.com/kubernetes-engine/docs/concepts/verticalpodautoscaler&#34; target=&#34;_blank&#34;&gt;VerticalPodAutoscaler&lt;/a&gt; CRD来对容器的&lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/&#34; target=&#34;_blank&#34;&gt;CPU&lt;/a&gt;以及&lt;a href=&#34;https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/&#34; target=&#34;_blank&#34;&gt;内存&lt;/a&gt;需求进行分析和调整。&lt;/p&gt;

&lt;h2 id=&#34;开始之前&#34;&gt;开始之前&lt;/h2&gt;

&lt;p&gt;开始这一任务之前，首先要完成以下步骤：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;确认开启了 &lt;a href=&#34;https://console.cloud.google.com/apis/library/container.googleapis.com?q=kubernetes%20engine&amp;amp;_ga=2.131271884.-250761375.1547990554&amp;amp;_gac=1.19137164.1547990557.EAIaIQobChMIkbeckbr83wIVRKSWCh0_yAmwEAAYASAAEgJmc_D_BwE&#34; target=&#34;_blank&#34;&gt;GKE API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;安装 &lt;a href=&#34;https://cloud.google.com/sdk/downloads&#34; target=&#34;_blank&#34;&gt;Cloud SDK&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;设置缺省的 &lt;a href=&#34;https://support.google.com/cloud/answer/6158840&#34; target=&#34;_blank&#34;&gt;Project ID&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gcloud config set project [PROJECT_ID]&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如果运行的是 zonal 集群，设置缺省的 &lt;a href=&#34;https://cloud.google.com/compute/docs/zones#available&#34; target=&#34;_blank&#34;&gt;compute zone&lt;/a&gt;：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gcloud config set compute/zone [COMPUTE_ZONE]&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;如果运行的是 regional 集群，设置缺省的 &lt;a href=&#34;https://cloud.google.com/compute/docs/zones#available&#34; target=&#34;_blank&#34;&gt;compute region&lt;/a&gt;：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gcloud config set compute/region [COMPUTE_REGION]&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;更新 &lt;code&gt;gcloud&lt;/code&gt; 到最新版本：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gcloud components update&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;为集群启用-pod-的垂直自动伸缩功能&#34;&gt;为集群启用 Pod 的垂直自动伸缩功能&lt;/h2&gt;

&lt;p&gt;可以使用下面的命令创建包含 Pod 垂直自动伸缩功能的新集群：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-plain&#34;&gt;gcloud beta container clusters create [CLUSTER_NAME] \
    --enable-vertical-pod-autoscaling
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;[CLUSTER_NAME]&lt;/code&gt; 就是该集群的名称。&lt;/p&gt;

&lt;p&gt;如果要给现有集群启用 Pod 垂直自动伸缩功能，可以用下列命令：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-plain&#34;&gt;cloud beta container clusters update [CLUSTER-NAME] \
    --enable-vertical-pod-autoscaling
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;[CLUSTER_NAME]&lt;/code&gt; 就是该集群的名称。&lt;/p&gt;

&lt;h2 id=&#34;获取资源推荐&#34;&gt;获取资源推荐&lt;/h2&gt;

&lt;p&gt;下面的练习中会创建一个 VerticalPodAutoscaler，其中的 &lt;code&gt;updateMode&lt;/code&gt; 设置为 &lt;code&gt;Off&lt;/code&gt;。接下来创建一个包含两个 Pod 的 Deployment，每个 Pod 包含一个容器。当 Pod 创建时，VerticalPodAutoscaler 会分析容器的 CPU 和内存需要，并将推荐设置保存在 &lt;code&gt;status&lt;/code&gt; 字段中。VerticalPodAutoscaler 在这一过程中不会对运行中的容器采取任何更新资源需求的措施。&lt;/p&gt;

&lt;p&gt;VerticalPodAutoscaler 的配置如下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: autoscaling.k8s.io/v1beta1
kind: VerticalPodAutoscaler
metadata:
  name: my-rec-vpa
spec:
  selector:
    matchLabels:
      purpose: try-recommend
  updatePolicy:
    updateMode: &amp;quot;Off&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;将代码保存为 &lt;code&gt;my-rec-vpa.yaml&lt;/code&gt; 并创建该资源：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl create -f my-rec-vpa.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Deployment 的代码如下：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-rec-deployment
  labels:
    purpose: try-recommend
spec:
  replicas: 2
  template:
    metadata:
      labels:
        purpose: try-recommend
    spec:
      containers:
      - name: my-rec-container
        image: nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上述代码中并未设置 CPU 和内存的请求数量。而 Deployment 中的 Pod，具有标签 &lt;code&gt;purpose: try-recommend&lt;/code&gt;，符合 VerticalPodAutoscaler 的 &lt;code&gt;selector&lt;/code&gt; 中定义的选择标准，因此是会受到管理的。&lt;/p&gt;

&lt;p&gt;将上述代码命名为 &lt;code&gt;my-rec-deployment.yaml&lt;/code&gt;，创建对象：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl create -f my-rec-deployment.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;稍候片刻，查看 VirticalPodAutoscaler：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get vpa my-rec-vpa --output yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;会显示 CPU 和内存资源的推荐设置：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;...
  recommendation:
    containerRecommendations:
    - containerName: my-rec-container
      lowerBound:
        cpu: 25m
        memory: 262144k
      target:
        cpu: 25m
        memory: 262144k
      upperBound:
        cpu: 7931m
        memory: 8291500k
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;现在看到了推荐的 CPU 和内存请求了，可以选择删除 Deployment，加入 CPU 和内存请求的相关内容，并重新启动。&lt;/p&gt;

&lt;h3 id=&#34;自动更新资源&#34;&gt;自动更新资源&lt;/h3&gt;

&lt;p&gt;接下来的练习会创建一个 Deployment ，其中包含两个 Pod，每个 Pod 包含一个容器，容器请求 100m 的 CPU 以及 50M 的内存。然后创建一个 VerticalPodAutoscaler 对象，自动对 CPU 和内存的请求进行修正。&lt;/p&gt;

&lt;p&gt;下面是该 Deployment 的代码：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    purpose: try-auto-requests
spec:
  replicas: 2
  template:
    metadata:
      labels:
        purpose: try-auto-requests
    spec:
      containers:
      - name: my-container
        image: k8s.gcr.io/ubuntu-slim:0.1
        resources:
          requests:
            cpu: 100m
            memory: 50Mi
        command: [&amp;quot;/bin/sh&amp;quot;]
        args: [&amp;quot;-c&amp;quot;, &amp;quot;while true; do timeout 0.5s yes &amp;gt;/dev/null; sleep 0.5s; done&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;把上述代码保存为文件 &lt;code&gt;my-deployment.yaml&lt;/code&gt;，并创建对象：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl create -f my-deployment.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;列出运行中的 Pod：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get pods&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;输出内容中包含了 &lt;code&gt;my-deployment&lt;/code&gt; 中的 Pod：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-plain&#34;&gt;NAME                            READY     STATUS             RESTARTS   AGE
my-deployment-cbcdd49fb-d6bf9   1/1       Running            0          8s
my-deployment-cbcdd49fb-th288   1/1       Running            0          8s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;为了后续方便，记录下 Pod 名称。&lt;/p&gt;

&lt;p&gt;这个 Deployment 申请的 CPU 和内存非常小，所以可能提供更多资源会给这一 Deployment 带来更好的效果。&lt;/p&gt;

&lt;p&gt;下面代码用于创建一个 &lt;code&gt;VerticalPodAutoscaler&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: autoscaling.k8s.io/v1beta1
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa
spec:
  selector:
    matchLabels:
      purpose: try-auto-requests
  updatePolicy:
    updateMode: &amp;quot;Auto&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这段代码中的 &lt;code&gt;selector&lt;/code&gt; 字段中声明，所有带有标签 &lt;code&gt;purpose: try-auto-requests&lt;/code&gt; 的 Pod 都会受其影响。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;updateMode&lt;/code&gt; 字段取值为 &lt;code&gt;Auto&lt;/code&gt;，代表 VerticalPodAutoscaler 会更新 Pod 的 CPU 和内存请求，也就是说 VerticalPodAutoscaler 会删除 Pod、调整 CPU 和内存申请，然后启动一个新 Pod。&lt;/p&gt;

&lt;p&gt;把代码保存为 &lt;code&gt;my-vpa.yaml&lt;/code&gt;，并创建该资源：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl create -f my-vpa.yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;几分钟之后，再次查看 Pod：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get pods&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;会看到 Pod 名称已经发生了变化，如果没有，请隔一段时间再次查看。&lt;/p&gt;

&lt;p&gt;获取一个新 Pod 的信息：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get pod [POD_NAME] --output yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;输出内容中，会看到 VerticalPodAutoscaler 提高了内存和 CPU 的设置。还会看到注解中也发生了更新：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;apiVersion: v1
kind: Pod
metadata:
  annotations:
    vpaUpdates: &#39;Pod resources updated by my-vpa: container 0: cpu capped to node
      capacity, memory capped to node capacity, cpu request, memory request&#39;
...
spec:
  containers:
  ...
    resources:
      requests:
        cpu: 510m
        memory: 262144k
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;查看一下 VerticalPodAutoscaler 的详情：&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get vpa my-vpa --output yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;输出内容中显示了三组对 CPU 和内存申请的建议：&lt;code&gt;lowerBound&lt;/code&gt;、&lt;code&gt;target&lt;/code&gt; 和 &lt;code&gt;upperBound&lt;/code&gt;：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;...
  recommendation:
    containerRecommendations:
    - containerName: my-container
      lowerBound:
        cpu: 536m
        memory: 262144k
      target:
        cpu: 587m
        memory: 262144k
      upperBound:
        cpu: 27854m
        memory: &amp;quot;545693548&amp;quot;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;target&lt;/code&gt; 的含义是，该容器使用 587m 的 CPU 和 262144 KB 的内存会获得更好的运行效果。&lt;/p&gt;

&lt;p&gt;VerticalPodAutoscaler 会使用 &lt;code&gt;lowerBound&lt;/code&gt; 和 &lt;code&gt;upperBound&lt;/code&gt; 来决定是否重新创建 Pod，如果一个 Pod 申请的资源少于 &lt;code&gt;lowerBound&lt;/code&gt; 或者大于 &lt;code&gt;upperBound&lt;/code&gt;，就会被 VerticalPodAutoscaler 删除并使用 &lt;code&gt;target&lt;/code&gt; 推荐的规格进行重建。&lt;/p&gt;

&lt;h3 id=&#34;selector-不可重叠&#34;&gt;Selector 不可重叠&lt;/h3&gt;

&lt;p&gt;VerticalPodAutoscaler 包含了一个 &lt;code&gt;selector&lt;/code&gt; 字段，用来决定该对象的影响范围。如果创建了不止一个的 &lt;code&gt;VerticalPodAutoscaler&lt;/code&gt;，要保证其 selector 不能发生重叠。&lt;/p&gt;

&lt;p&gt;例如下面的两个 VerticalPodAutoscaler：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;...
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa-1
spec:
  selector:
    matchLabels:
      app: metrics
      department: engineering
...
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;...
...
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa-2
spec:
  selector:
    matchLabels:
      department: engineering
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;带有 &lt;code&gt;app: metrics&lt;/code&gt; 和 &lt;code&gt;department: engineering&lt;/code&gt; 标签的 Pod 会被两个对象同时管理，会引发问题。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
