Kubernetes中的Label / NodeSelector / Annotation的使用方法
摘要
在这篇文章中,我们将解释如何编写Kubernetes的清单文件。本页面将对以下三个方面进行说明。
-
- Labelの使い方
-
- NodeSelectorの使い方
- Annotationの使い方
目录
- Kubernetesハンズオン目次
如何使用Label
在引用其他资源时,可以使用Label。
以下示例中,为了将请求从Service发送到Deployment,将各种label进行了合并。
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-deployment
spec:
replicas: 2
selector:
matchLabels:
# 後述のspec.template.metadata.labels.appと合わせる
app: sample-app
template:
metadata:
labels:
# 上記のspec.selector.matchLabels.appと合わせる
app: sample-app
spec:
containers:
# Dockerコンテナ名
- name: http-container
# 利用するDockerイメージ
image: php:7.0-apache
# localイメージ利用。ただし、localに指定したイメージが存在しない場合はレポジトリを参照する
imagePullPolicy: IfNotPresent
ports:
# service.ymlで定義する外部公開用port設定の箇所と名前を合わせることでbindされる
# nameは15文字以内でないとエラーになる
- name: ha-inner-port
# コンテナ内のport
containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: sample-service
spec:
selector:
# deployment.ymlのspec.selector.matchLabels.appと合わせる
app: sample-app
ports:
- name: ha-outer-port
# 外部公開するport
port: 8080
# deployment.ymlで定義したport名と合わせることでbindされる
targetPort: ha-inner-port
type: NodePort
申请
$ sudo kubectl apply -f pod.yml
pod/nginx created
确认 LABEL
$ sudo kubectl get all --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod/sample-deployment-85f4cb9d7c-2qncx 1/1 Running 0 20s app=sample-app,pod-template-hash=85f4cb9d7c
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 111m component=apiserver,provider=kubernetes
service/sample-service NodePort 10.98.7.194 <none> 8080:32661/TCP 20s app=http-service
NAME READY UP-TO-DATE AVAILABLE AGE LABELS
deployment.apps/sample-deployment 1/1 1 1 20s <none>
NAME DESIRED CURRENT READY AGE LABELS
replicaset.apps/sample-deployment-85f4cb9d7c 1 1 1 20s app=sample-app,pod-template-hash=85f4cb9d7c
确认动作
只要能浏览网页,就说明有来自Service到Deployment的请求流动了。
$ curl $(sudo minikube service sample-service --url)
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /
on this server.<br />
</p>
<hr>
<address>Apache/2.4.25 (Debian) Server at 172.21.115.122 Port 32691</address>
</body></html>
LabelSelector的使用方法
LabelSelector有以下两种类型。
-
- matchLabels
- matchExpressions
匹配标签
指定的标签与所有匹配的内容都将成为目标。
matchLabels:
app: nginx
tier: frontend
匹配表达式
在matchExpressions中,您可以使用operator设置灵活的条件。
可以指定以下内容作为operator。
-
- In
-
- NotIn
-
- Exists
- DoesNotExists
具体的的写法如下所示。
matchExpressions:
# envがprodかstgのいずれかである場合
- key: env
operator: In
values: [prod, stg]
# appがprodかstgのいずれかでもない場合
- key: app
operator: NotIn
values: [sample001, sample002]
# appが存在する場合
- key: app
operator: Exists
# tierが存在する場合
- key: tier
operator: DoesNotExist
例如
如果环境是生产或者测试的情况下,设置条件。
matchExpressions:
- key: env
operator: In
values: [prod, stg]
以下是在这个条件下匹配的和不匹配的内容。
匹配
labels:
app: sample-app
tier: frontend
env: prod
匹配
labels:
app: sample-app
tier: frontend
env: stg
不匹配 (Bù
labels:
app: sample-app
tier: frontend
env: dev
参考:Kubernetes道场第八天 – ReplicaSet / Deployment相关主题
NodeSelector的使用方法
NodeSelector是一种机制,用于将Pod调度到特定的节点上。
在这里,也使用了LabelSelector,但与前面提到的不同之处在于无法使用matchExpressions,只能进行完全匹配。
作为例子,尝试将Pod调度到具有环境为dev的标签的Node上。
首先,确认指定不存在的标签时不会进行调度,然后按照存在的标签进行调度的步骤进行。
定义Pod
将环境设置为在开发人员的Node上进行调度。
apiVersion: v1
kind: Pod
metadata:
name: node-selector
spec:
containers:
- name: nginx
image: nginx
# 以下でNodeの指定をする
nodeSelector:
environment: dev
terminationGracePeriodSeconds: 0
请确认标签
但是,不存在dev环境。
$ sudo kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
minikube Ready master 3h35m v1.14.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=minikube,kubernetes.io/os=linux,node-role.kubernetes.io/master=
调度失败
如果指定了不存在的节点标签,则会导致错误并且无法进行调度。
$ sudo kubectl describe pod/node-selector
# **snip**
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 24s (x2 over 24s) default-scheduler 0/1 nodes are available: 1 node(s) didn't match node selector.
在节点上贴标签。
使用以下命令在Node上添加名为”environment: dev”的标签。
$ sudo kubectl label node/minikube environment=dev
将环境=dev添加到Label中。
$ sudo kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
minikube Ready master 3h41m v1.14.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,environment=dev,kubernetes.io/arch=amd64,kubernetes.io/hostname=minikube,kubernetes.io/os=linux,node-role.kubernetes.io/master=
确认已经安排了日程。
这样,Pod就被调度到了Node上。
$ sudo kubectl describe pod/node-selector
# **snip**
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 2m28s (x5 over 6m30s) default-scheduler 0/1 nodes are available: 1 node(s) didn't match node selector.
Normal Scheduled 101s default-scheduler Successfully assigned default/node-selector to minikube
Normal Pulled 100s kubelet, minikube Container image "nginx:alpine" already present on machine
Normal Created 100s kubelet, minikube Created container nginx
Normal Started 100s kubelet, minikube Started container nginx
$ sudo kubectl get pod
NAME READY STATUS RESTARTS AGE
node-selector 1/1 Running 0 7m16s
Annotation的使用方法
据说可以做与Label相同的事情,但与Label不同的是,通常会带有元数据等。
您可以使用Kubernetes注释为对象附加任意非识别性元数据。工具和库等客户端可以检索此元数据。
apiVersion: v1
kind: Pod
metadata:
name: annotations-demo
annotations:
imageregistry: "https://hub.docker.com/"
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
相关文章
-
- 【KubernetesのAffinity】その1 – Node Affinityの使い方
- 【KubernetesのAffinity】その2 – Pod Affinity / Pod Anti-Affinityの使い方
请提供更多上下文信息以使我们能够将其翻译成中文。
-
- Kubernetes道場 17日目 – Label / NodeSelector / Annotationについて
- KubernetesのLabelとAnnotationの使い分けについて