当确认了在k8s中关于Pod调度的问题时,提供了以下的笔记(直到nodeSelector)。Note: This paraphrase is in Simplified Chinese. If you would like it in Traditional Chinese, please let me know.

确认了在k8s中关于Pod调度的笔记。
因为可能会很长,所以首先是nodeSelector。
如果有时间,可能会继续写下去,也可能不写…

简而言之

    • スケジューリングでは Affinity と Anti-Affinity という考え方を利用する。Affinity では特定条件に一致する所にスケジューリングする。Anti-Affinity では特定の条件に一致しない所にスケジューリングする

 

    • Pod のスケジューリング方法として大きく分けて以下の5つがある

nodeSelecter(Simplest Node Affinity)->簡易的な Node Affinity この記事の範囲

Node Affinity->特定のノード上だけで実行する
Node Anti-Affinity->特定のノード以外で実行する
Inter-Pod Affinity->特定の Pod がいるドメイン(ノード、ゾーン etc)上で実行する
Inter-Pod Anti-Affinity->特定の Pod がいないドメイン(ノード、ゾーン etc)上で実行する

请用中文原生语言重述以下内容:

参考

    • Kubernetes完全ガイド impress top gearシリーズ

 

    EKS Kubernetes Podの配置管理

验证环境

    • eksctl を利用して作成した k8s 環境を利用

kubectl は k として alias を設定済みの環境
環境情報は以下の通り

$k version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.5", GitCommit:"20c265fef0741dd71a66480e35bd69f18351daea", GitTreeState:"clean", BuildDate:"2019-10-15T19:16:51Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.9-eks-f459c0", GitCommit:"f459c0672169dd35e77af56c24556530a05e9ab1", GitTreeState:"clean", BuildDate:"2020-03-18T04:24:17Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}

关于标签

可以通过给节点添加标签来在调度时利用。大致上有以下两种标签(在意义上是相同的)。

    • ビルトインラベル->利用者が意識せず、自動的に付与されるラベル

 

    ラベル->利用者が意図して付与するラベル

内置标签

以下列举了一些示例,包含操作系统和时区等相关信息。

补充说明:内置Node标签

在实际上由 eksctl 创建的环境中,尝试查看已赋予的标签。

$k get nodes -o json|jq ".items[]|.metadata.labels"
{
  "alpha.eksctl.io/cluster-name": "test-cluster",
  "alpha.eksctl.io/instance-id": "i-0b26392bc266a5999",
  "alpha.eksctl.io/nodegroup-name": "standard-workers",
  "beta.kubernetes.io/arch": "amd64",
  "beta.kubernetes.io/instance-type": "t3.medium",
  "beta.kubernetes.io/os": "linux",
  "failure-domain.beta.kubernetes.io/region": "ap-northeast-1",
  "failure-domain.beta.kubernetes.io/zone": "ap-northeast-1c",
  "kubernetes.io/arch": "amd64",
  "kubernetes.io/hostname": "ip-192-168-44-10.ap-northeast-1.compute.internal",
  "kubernetes.io/os": "linux"
}
{
  "alpha.eksctl.io/cluster-name": "test-cluster",
  "alpha.eksctl.io/instance-id": "i-02b72bf1fd5120455",
  "alpha.eksctl.io/nodegroup-name": "standard-workers",
  "beta.kubernetes.io/arch": "amd64",
  "beta.kubernetes.io/instance-type": "t3.medium",
  "beta.kubernetes.io/os": "linux",
  "failure-domain.beta.kubernetes.io/region": "ap-northeast-1",
  "failure-domain.beta.kubernetes.io/zone": "ap-northeast-1d",
  "kubernetes.io/arch": "amd64",
  "kubernetes.io/hostname": "ip-192-168-65-145.ap-northeast-1.compute.internal",
  "kubernetes.io/os": "linux"
}

标签

利用者が手動で Node にラベルを付与することも出来る。
具体的には kubectl label nodes = という形式で任意のラベルの付与が可能

步骤1:给节点添加标签

我先試試看。

# Node 名を確認
$k get nodes
NAME                                                STATUS   ROLES    AGE     VERSION
ip-192-168-44-10.ap-northeast-1.compute.internal    Ready    <none>   7m34s   v1.14.9-eks-1f0ca9
ip-192-168-65-145.ap-northeast-1.compute.internal   Ready    <none>   7m32s   v1.14.9-eks-1f0ca9

# ラベルを付与
$k label nodes ip-192-168-44-10.ap-northeast-1.compute.internal disktype=ssd
node/ip-192-168-44-10.ap-northeast-1.compute.internal labeled

# ラベルが付与された Node のみ表示
$ k get nodes -l disktype=ssd
NAME                                               STATUS   ROLES    AGE   VERSION
ip-192-168-44-10.ap-northeast-1.compute.internal   Ready    <none>   16m   v1.14.9-eks-1f0ca9

另外,我认为在实际情况中,很多使用情况下希望在节点启动时添加标签。
在这种情况下,可以通过 kubelet 的 –node-labels 参数进行添加(未经验证)。

–node-labels mapStringString
Labels to add when registering the node in the cluster. Labels must be key=value pairs separated by ‘,’. Labels in the ‘kubernetes.io’ namespace must begin with an allowed prefix (kubelet.kubernetes.io, node.kubernetes.io) or be in the specifically allowed set (beta.kubernetes.io/arch, beta.kubernetes.io/instance-type, beta.kubernetes.io/os, failure-domain.beta.kubernetes.io/region, failure-domain.beta.kubernetes.io/zone, failure-domain.kubernetes.io/region, failure-domain.kubernetes.io/zone, kubernetes.io/arch, kubernetes.io/hostname, kubernetes.io/instance-type, kubernetes.io/os)

节点选择器(最简单的节点亲和性)

nodeSelector 是最简单的调度方式,正如以下所述。

节点选择器

nodeSelectorは、Nodeを選択するための、最も簡単で推奨されている手法です。

先程付与したラベル(disktype = ssd)を利用してこのラベルが付与した Node に Pod を起動する。
上記を実現するために Pod の YAML では nodeSelector を記載する。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd
# Pod を起動
$k apply -f pod-nginx.yaml
pod/nginx created

# disktype = ssd をラベルで設定した Node に起動した
$k describe pods |grep Node
Node:         ip-192-168-44-10.ap-northeast-1.compute.internal/192.168.44.10
Node-Selectors:  disktype=ssd

我能够将 Pod 部署到指定的 Node 上。

广告
将在 10 秒后关闭
bannerAds