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の使い分けについて
广告
将在 10 秒后关闭
bannerAds