当确认了在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 上。