Kubernetes(二)

三、Kubernetes API

Kubernetes 控制面 的核心是 API 服務(wù)器。 API 服務(wù)器負(fù)責(zé)提供 HTTP API,以供用戶、集群中的不同部分和集群外部組件相互通信。

Kubernetes API 使你可以查詢和操縱 Kubernetes API 中對(duì)象(例如:Pod、Namespace、ConfigMap 和 Event)的狀態(tài)。

大部分操作都可以通過 kubectl 命令行接口或 類似 kubeadm 這類命令行工具來執(zhí)行, 這些工具在背后也是調(diào)用 API。不過,你也可以使用 REST 調(diào)用來訪問這些 API。

四、Kubernetes對(duì)象

在 Kubernetes 系統(tǒng)中,Kubernetes 對(duì)象 是持久化的實(shí)體。 Kubernetes 使用這些實(shí)體去表示整個(gè)集群的狀態(tài)。特別地,它們描述了如下信息:

  • 哪些容器化應(yīng)用在運(yùn)行(以及在哪些節(jié)點(diǎn)上)
  • 可以被應(yīng)用使用的資源
  • 關(guān)于應(yīng)用運(yùn)行時(shí)表現(xiàn)的策略,比如重啟策略、升級(jí)策略,以及容錯(cuò)策略

Kubernetes 對(duì)象是 “目標(biāo)性記錄” —— 一旦創(chuàng)建對(duì)象,Kubernetes 系統(tǒng)將持續(xù)工作以確保對(duì)象存在。 通過創(chuàng)建對(duì)象,本質(zhì)上是在告知 Kubernetes 系統(tǒng),所需要的集群工作負(fù)載看起來是什么樣子的, 這就是 Kubernetes 集群的 期望狀態(tài)(Desired State)

操作 Kubernetes 對(duì)象 —— 無論是創(chuàng)建、修改,或者刪除 —— 需要使用 Kubernetes API

4.1 對(duì)象規(guī)約(Spec)和狀態(tài)(Status)

幾乎每個(gè) Kubernetes 對(duì)象包含兩個(gè)嵌套的對(duì)象字段,它們負(fù)責(zé)管理對(duì)象的配置: 對(duì)象 spec(規(guī)約) 和 對(duì)象 status(狀態(tài)) 。 對(duì)于具有 spec 的對(duì)象,你必須在創(chuàng)建對(duì)象時(shí)設(shè)置其內(nèi)容,描述你希望對(duì)象所具有的特征: 期望狀態(tài)(Desired State)

status 描述了對(duì)象的 當(dāng)前狀態(tài)(Current State),它是由 Kubernetes 系統(tǒng)和組件 設(shè)置并更新的。在任何時(shí)刻,Kubernetes 控制平面 都一直積極地管理著對(duì)象的實(shí)際狀態(tài),以使之與期望狀態(tài)相匹配。

例如,Kubernetes 中的 Deployment 對(duì)象能夠表示運(yùn)行在集群中的應(yīng)用。 當(dāng)創(chuàng)建 Deployment 時(shí),可能需要設(shè)置 Deployment 的 spec,以指定該應(yīng)用需要有 3 個(gè)副本運(yùn)行。 Kubernetes 系統(tǒng)讀取 Deployment 規(guī)約,并啟動(dòng)我們所期望的應(yīng)用的 3 個(gè)實(shí)例 —— 更新狀態(tài)以與規(guī)約相匹配。 如果這些實(shí)例中有的失敗了(一種狀態(tài)變更),Kubernetes 系統(tǒng)通過執(zhí)行修正操作 來響應(yīng)規(guī)約和狀態(tài)間的不一致 —— 在這里意味著它會(huì)啟動(dòng)一個(gè)新的實(shí)例來替換。

4.2 描述Kubernetes對(duì)象

創(chuàng)建 Kubernetes 對(duì)象時(shí),必須提供對(duì)象的規(guī)約,用來描述該對(duì)象的期望狀態(tài), 以及關(guān)于對(duì)象的一些基本信息(例如名稱)。 當(dāng)使用 Kubernetes API 創(chuàng)建對(duì)象時(shí)(或者直接創(chuàng)建,或者基于kubectl), API 請(qǐng)求必須在請(qǐng)求體中包含 JSON 格式的信息。 大多數(shù)情況下,需要在 .yaml 文件中為 kubectl 提供這些信息。 kubectl 在發(fā)起 API 請(qǐng)求時(shí),將這些信息轉(zhuǎn)換成 JSON 格式。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

使用類似于上面的 .yaml 文件來創(chuàng)建 Deployment的一種方式是使用 kubectl 命令行接口(CLI)中的 kubectl apply 命令, 將 .yaml 文件作為參數(shù)。下面是一個(gè)示例:

kubectl apply -f https://k8s.io/examples/application/deployment.yaml --record

4.3 必需字段

在想要?jiǎng)?chuàng)建的 Kubernetes 對(duì)象對(duì)應(yīng)的 .yaml 文件中,需要配置如下的字段:

  • apiVersion - 創(chuàng)建該對(duì)象所使用的 Kubernetes API 的版本
  • kind - 想要?jiǎng)?chuàng)建的對(duì)象的類別
  • metadata - 幫助唯一性標(biāo)識(shí)對(duì)象的一些數(shù)據(jù),包括一個(gè) name 字符串、UID 和可選的 namespace

你也需要提供對(duì)象的 spec 字段。 對(duì)象 spec 的精確格式對(duì)每個(gè) Kubernetes 對(duì)象來說是不同的,包含了特定于該對(duì)象的嵌套字段。 Kubernetes API 參考 能夠幫助我們找到任何我們想創(chuàng)建的對(duì)象的 spec 格式。 例如,可以從 core/v1 PodSpec 查看 Podspec 格式, 并且可以從 apps/v1 DeploymentSpec 查看 Deploymentspec 格式。

4.4 Kuberntes對(duì)象管理

命令式對(duì)象配置
聲明式對(duì)象配置

4.5 對(duì)象名和IDs(即k8s對(duì)象命名規(guī)則)

集群中的每一個(gè)對(duì)象都有一個(gè)名稱 來標(biāo)識(shí)在同類資源中的唯一性。

每個(gè) Kubernetes 對(duì)象也有一個(gè)UID 來標(biāo)識(shí)在整個(gè)集群中的唯一性。

比如,在同一個(gè)名字空間 中有一個(gè)名為 myapp-1234 的 Pod, 但是可以命名一個(gè) Pod 和一個(gè) Deployment 同為 myapp-1234.

對(duì)于用戶提供的非唯一性的屬性,Kubernetes 提供了 標(biāo)簽(Labels)注解(Annotation)機(jī)制。

4.5.1 名稱()

客戶端提供的字符串,引用資源 url 中的對(duì)象,如/api/v1/pods/some name。

某一時(shí)刻,只能有一個(gè)給定類型的對(duì)象具有給定的名稱。但是,如果刪除該對(duì)象,則可以創(chuàng)建同名的新對(duì)象。

以下是比較常見的三種資源命名約束

  • DNS 子域名
  • DNS 標(biāo)簽名
  • 路徑分段名稱

4.5.2 UIDs

Kubernetes 系統(tǒng)生成的字符串,唯一標(biāo)識(shí)對(duì)象。

在 Kubernetes 集群的整個(gè)生命周期中創(chuàng)建的每個(gè)對(duì)象都有一個(gè)不同的 uid,它旨在區(qū)分類似實(shí)體的歷史事件。

Kubernetes UIDs 是全局唯一標(biāo)識(shí)符(也叫 UUIDs)。 UUIDs 是標(biāo)準(zhǔn)化的,見 ISO/IEC 9834-8 和 ITU-T X.667.

4.6 名稱空間(namespace)

Kubernetes 支持多個(gè)虛擬集群,它們底層依賴于同一個(gè)物理集群。 這些虛擬集群被稱為名字空間。
名字空間適用于存在很多跨多個(gè)團(tuán)隊(duì)或項(xiàng)目的用戶的場(chǎng)景。對(duì)于只有幾到幾十個(gè)用戶的集群,根本不需要?jiǎng)?chuàng)建或考慮名字空間。當(dāng)需要名稱空間提供的功能時(shí),請(qǐng)開始使用它們。

名字空間為名稱提供了一個(gè)范圍。資源的名稱需要在名字空間內(nèi)是唯一的,但不能跨名字空間。 名字空間不能相互嵌套,每個(gè) Kubernetes 資源只能在一個(gè)名字空間中。

名字空間是在多個(gè)用戶之間劃分集群資源的一種方法(通過資源配額)。

不需要使用多個(gè)名字空間來分隔輕微不同的資源,例如同一軟件的不同版本: 使用標(biāo)簽來區(qū)分同一名字空間中的不同資源。

4.6.1 Kubernetes默認(rèn)名稱空間

避免使用前綴 kube- 創(chuàng)建名字空間,因?yàn)樗菫?Kubernetes 系統(tǒng)名字空間保留的。

kubectl get namespace

NAME          STATUS    AGE
default       Active    1d
kube-node-lease   Active   1d
kube-system   Active    1d
kube-public   Active    1d

Kubernetes 會(huì)創(chuàng)建四個(gè)初始名字空間:

default 沒有指明使用其它名字空間的對(duì)象所使用的默認(rèn)名字空間
kube-system Kubernetes 系統(tǒng)創(chuàng)建對(duì)象所使用的名字空間
kube-public 這個(gè)名字空間是自動(dòng)創(chuàng)建的,所有用戶(包括未經(jīng)過身份驗(yàn)證的用戶)都可以讀取它。 這個(gè)名字空間主要用于集群使用,以防某些資源在整個(gè)集群中應(yīng)該是可見和可讀的。 這個(gè)名字空間的公共方面只是一種約定,而不是要求。
kube-node-lease 此名字空間用于與各個(gè)節(jié)點(diǎn)相關(guān)的租期(Lease)對(duì)象; 此對(duì)象的設(shè)計(jì)使得集群規(guī)模很大時(shí)節(jié)點(diǎn)心跳檢測(cè)性能得到提升

4.6.2 名字空間和 DNS

當(dāng)你創(chuàng)建一個(gè)服務(wù) 時(shí), Kubernetes 會(huì)創(chuàng)建一個(gè)相應(yīng)的 DNS 條目

該條目的形式是 <服務(wù)名稱>.<名字空間名稱>.svc.cluster.local,這意味著如果容器只使用 <服務(wù)名稱>,它將被解析到本地名字空間的服務(wù)。這對(duì)于跨多個(gè)名字空間(如開發(fā)、分級(jí)和生產(chǎn)) 使用相同的配置非常有用。如果你希望跨名字空間訪問,則需要使用完全限定域名(FQDN)。

4.6.3 并非所有對(duì)象都在名字空間中

大多數(shù) kubernetes 資源(例如 Pod、Service、副本控制器等)都位于某些名字空間中。 但是名字空間資源本身并不在名字空間中。而且底層資源,例如 節(jié)點(diǎn) 和持久化卷不屬于任何名字空間。

查看哪些 Kubernetes 資源在名字空間中,哪些不在名字空間中:

# 位于名字空間中的資源
kubectl api-resources --namespaced=true

# 不在名字空間中的資源
kubectl api-resources --namespaced=false

4.7 標(biāo)簽(label)

標(biāo)簽(Labels) 是附加到 Kubernetes 對(duì)象(比如 Pods)上的鍵值對(duì)。 標(biāo)簽旨在用于指定對(duì)用戶有意義且相關(guān)的對(duì)象的標(biāo)識(shí)屬性,但不直接對(duì)核心系統(tǒng)有語義含義。 標(biāo)簽可以用于組織和選擇對(duì)象的子集。標(biāo)簽可以在創(chuàng)建時(shí)附加到對(duì)象,隨后可以隨時(shí)添加和修改。 每個(gè)對(duì)象都可以定義一組鍵/值標(biāo)簽。每個(gè)鍵對(duì)于給定對(duì)象必須是唯一的。

"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

標(biāo)簽?zāi)軌蛑С指咝У牟樵兒捅O(jiān)聽操作,對(duì)于用戶界面和命令行是很理想的。 應(yīng)使用注解 記錄非識(shí)別信息。

4.7.1 使用標(biāo)簽?zāi)康?/h3>

標(biāo)簽使用戶能夠以松散耦合的方式將他們自己的組織結(jié)構(gòu)映射到系統(tǒng)對(duì)象,而無需客戶端存儲(chǔ)這些映射。

服務(wù)部署和批處理流水線通常是多維實(shí)體(例如,多個(gè)分區(qū)或部署、多個(gè)發(fā)行序列、多個(gè)層,每層多個(gè)微服務(wù))。 管理通常需要交叉操作,這打破了嚴(yán)格的層次表示的封裝,特別是由基礎(chǔ)設(shè)施而不是用戶確定的嚴(yán)格的層次結(jié)構(gòu)。
示例標(biāo)簽:

"release" : "stable", "release" : "canary"
"environment" : "dev", "environment" : "qa", "environment" : "production"
"tier" : "frontend", "tier" : "backend", "tier" : "cache"
"partition" : "customerA", "partition" : "customerB"
"track" : "daily", "track" : "weekly"
請(qǐng)記住,對(duì)于給定對(duì)象標(biāo)簽的鍵必須是唯一的。

4.7.2 標(biāo)簽命名規(guī)則

標(biāo)簽 是鍵值對(duì)。有效的標(biāo)簽鍵有兩個(gè)段:可選的前綴和名稱,用斜杠(/)分隔。 名稱段是必需的,必須小于等于 63 個(gè)字符,以字母數(shù)字字符([a-z0-9A-Z])開頭和結(jié)尾, 帶有破折號(hào)(-),下劃線(_),點(diǎn)( .)和之間的字母數(shù)字。 前綴是可選的。如果指定,前綴必須是 DNS 子域:由點(diǎn)(.)分隔的一系列 DNS 標(biāo)簽,總共不超過 253 個(gè)字符, 后跟斜杠(/)。

如果省略前綴,則假定標(biāo)簽鍵對(duì)用戶是私有的。 向最終用戶對(duì)象添加標(biāo)簽的自動(dòng)系統(tǒng)組件(例如 kube-scheduler、kube-controller-manager、 kube-apiserver、kubectl 或其他第三方自動(dòng)化工具)必須指定前綴。

kubernetes.io/ 前綴是為 Kubernetes 核心組件保留的。

有效標(biāo)簽值必須為 63 個(gè)字符或更少,并且必須為空或以字母數(shù)字字符([a-z0-9A-Z])開頭和結(jié)尾, 中間可以包含破折號(hào)(-)、下劃線(_)、點(diǎn)(.)和字母或數(shù)字。

4.7.3 標(biāo)簽選擇器

名稱和 UID 不同, 標(biāo)簽不支持唯一性。通常,我們希望許多對(duì)象攜帶相同的標(biāo)簽。

通過 標(biāo)簽選擇算符,客戶端/用戶可以識(shí)別一組對(duì)象。標(biāo)簽選擇算符是 Kubernetes 中的核心分組原語。

API 目前支持兩種類型的選擇算符:基于等值的基于集合的。 標(biāo)簽選擇算符可以由逗號(hào)分隔的多個(gè) 需求 組成。 在多個(gè)需求的情況下,必須滿足所有要求,因此逗號(hào)分隔符充當(dāng)邏輯 &&)運(yùn)算符。

空標(biāo)簽選擇算符或者未指定的選擇算符的語義取決于上下文, 支持使用選擇算符的 API 類別應(yīng)該將算符的合法性和含義用文檔記錄下來。

基于等值的

基于等值 或 基于不等值 的需求允許按標(biāo)簽鍵和值進(jìn)行過濾。 匹配對(duì)象必須滿足所有指定的標(biāo)簽約束,盡管它們也可能具有其他標(biāo)簽。 可接受的運(yùn)算符有=、== 和 != 三種。 前兩個(gè)表示 相等(并且只是同義詞),而后者表示 不相等。例如:

environment = production
tier != frontend

前者選擇所有資源,其鍵名等于 environment,值等于 production。 后者選擇所有資源,其鍵名等于 tier,值不同于 frontend,所有資源都沒有帶有 tier 鍵的標(biāo)簽。 可以使用逗號(hào)運(yùn)算符來過濾 production 環(huán)境中的非 frontend 層資源:environment=production,tier!=frontend。

基于等值的標(biāo)簽要求的一種使用場(chǎng)景是 Pod 要指定節(jié)點(diǎn)選擇標(biāo)準(zhǔn)。 例如,下面的示例 Pod 選擇帶有標(biāo)簽 "accelerator=nvidia-tesla-p100"。

apiVersion: v1
kind: Pod
metadata:
  name: cuda-test
spec:
  containers:
    - name: cuda-test
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1
  nodeSelector:
    accelerator: nvidia-tesla-p100

基于集合的

基于集合 的標(biāo)簽需求允許你通過一組值來過濾鍵。 支持三種操作符:in、notin 和 exists (只可以用在鍵標(biāo)識(shí)符上)。例如:

environment in (production, qa)
tier notin (frontend, backend)
partition
!partition
第一個(gè)示例選擇了所有鍵等于 environment 并且值等于 production 或者 qa 的資源。
第二個(gè)示例選擇了所有鍵等于 tier 并且值不等于 frontend 或者 backend 的資源,以及所有沒有 tier 鍵標(biāo)簽的資源。
第三個(gè)示例選擇了所有包含了有 partition 標(biāo)簽的資源;沒有校驗(yàn)它的值。
第四個(gè)示例選擇了所有沒有 partition 標(biāo)簽的資源;沒有校驗(yàn)它的值。 類似地,逗號(hào)分隔符充當(dāng) 與 運(yùn)算符。因此,使用 partition 鍵(無論為何值)和 environment 不同于 qa 來過濾資源可以使用 partition, environment notin(qa) 來實(shí)現(xiàn)。
基于集合 的標(biāo)簽選擇算符是相等標(biāo)簽選擇算符的一般形式,因?yàn)?environment=production 等同于 environment in(production);!= 和 notin 也是類似的。

基于集合 的要求可以與基于 相等 的要求混合使用。例如:partition in (customerA, customerB),environment!=qa。

3.7.4 其他過濾方法

LIST 和 WATCH 過濾(由API提供)
LIST 和 WATCH 操作可以使用查詢參數(shù)指定標(biāo)簽選擇算符過濾一組對(duì)象。 兩種需求都是允許的。(這里顯示的是它們出現(xiàn)在 URL 查詢字符串中)

基于等值 的需求: ?labelSelector=environment%3Dproduction,tier%3Dfrontend
基于集合 的需求: ?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29
兩種標(biāo)簽選擇算符都可以通過 REST 客戶端用于 list 或者 watch 資源。 例如,使用 kubectl 定位 apiserver,可以使用 基于等值 的標(biāo)簽選擇算符可以這么寫:

kubectl get pods -l environment=production,tier=frontend

或者使用 基于集合的 需求:

kubectl get pods -l 'environment in (production),tier in (frontend)'

正如剛才提到的,基于集合 的需求更具有表達(dá)力。例如,它們可以實(shí)現(xiàn)值的 或 操作:

kubectl get pods -l 'environment in (production, qa)'

或者通過 exists 運(yùn)算符限制不匹配:

kubectl get pods -l 'environment,environment notin (frontend)'

3.7.5 在 API 對(duì)象中設(shè)置引用

Service 和 ReplicationController

一些 Kubernetes 對(duì)象,例如 servicesreplicationcontrollers , 也使用了標(biāo)簽選擇算符去指定了其他資源的集合,例如 pods
一個(gè) Service 指向的一組 Pods 是由標(biāo)簽選擇算符定義的。同樣,一個(gè) ReplicationController 應(yīng)該管理的 pods 的數(shù)量也是由標(biāo)簽選擇算符定義的。

兩個(gè)對(duì)象的標(biāo)簽選擇算符都是在 json 或者 yaml 文件中使用映射定義的,并且只支持 基于等值 需求的選擇算符:

"selector": {
    "component" : "redis",
}

selector:
    component: redis

這個(gè)選擇算符(分別在 json 或者 yaml 格式中) 等價(jià)于 component=redis 或 component in (redis) 。

支持基于集合需求的資源

比較新的資源,例如 JobDeploymentReplica SetDaemonSet , 也支持 基于集合的 需求。

selector:
  matchLabels:
    component: redis
  matchExpressions:
    - {key: tier, operator: In, values: [cache]}
    - {key: environment, operator: NotIn, values: [dev]}

matchLabels 是由 {key,value} 對(duì)組成的映射。 matchLabels 映射中的單個(gè) {key,value } 等同于 matchExpressions 的元素, 其 key 字段為 "key",operator 為 "In",而 values 數(shù)組僅包含 "value"。 matchExpressions 是 Pod 選擇算符需求的列表。 有效的運(yùn)算符包括 In、NotIn、Exists 和 DoesNotExist。 在 In 和 NotIn 的情況下,設(shè)置的值必須是非空的。 來自 matchLabels 和 matchExpressions 的所有要求都按邏輯與的關(guān)系組合到一起 -- 它們必須都滿足才能匹配。

選擇節(jié)點(diǎn)集(NodeSelector)

通過標(biāo)簽進(jìn)行選擇的一個(gè)用例是確定節(jié)點(diǎn)集,方便 Pod 調(diào)度。 有關(guān)更多信息,請(qǐng)參閱選擇節(jié)點(diǎn)文檔。

4.8 注解(annotation)

你可以使用 Kubernetes 注解為對(duì)象附加任意的非標(biāo)識(shí)的元數(shù)據(jù)。客戶端程序(例如工具和庫(kù))能夠獲取這些元數(shù)據(jù)信息。

4.8.1 為對(duì)象添加元數(shù)據(jù)

你可以使用標(biāo)簽或注解將元數(shù)據(jù)附加到 Kubernetes 對(duì)象。 標(biāo)簽可以用來選擇對(duì)象和查找滿足某些條件的對(duì)象集合。 相反,注解不用于標(biāo)識(shí)和選擇對(duì)象。 注解中的元數(shù)據(jù),可以很小,也可以很大,可以是結(jié)構(gòu)化的,也可以是非結(jié)構(gòu)化的,能夠包含標(biāo)簽不允許的字符。

注解和標(biāo)簽一樣,是鍵/值對(duì):

"metadata": {
  "annotations": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

以下是一些例子,用來說明哪些信息可以使用注解來記錄:

由聲明性配置所管理的字段。 將這些字段附加為注解,能夠?qū)⑺鼈兣c客戶端或服務(wù)端設(shè)置的默認(rèn)值、 自動(dòng)生成的字段以及通過自動(dòng)調(diào)整大小或自動(dòng)伸縮系統(tǒng)設(shè)置的字段區(qū)分開來。
構(gòu)建、發(fā)布或鏡像信息(如時(shí)間戳、發(fā)布 ID、Git 分支、PR 數(shù)量、鏡像哈希、倉(cāng)庫(kù)地址)。
指向日志記錄、監(jiān)控、分析或?qū)徲?jì)倉(cāng)庫(kù)的指針。
可用于調(diào)試目的的客戶端庫(kù)或工具信息:例如,名稱、版本和構(gòu)建信息。

用戶或者工具/系統(tǒng)的來源信息,例如來自其他生態(tài)系統(tǒng)組件的相關(guān)對(duì)象的 URL。

輕量級(jí)上線工具的元數(shù)據(jù)信息:例如,配置或檢查點(diǎn)。

負(fù)責(zé)人員的電話或呼機(jī)號(hào)碼,或指定在何處可以找到該信息的目錄條目,如團(tuán)隊(duì)網(wǎng)站。

從用戶到最終運(yùn)行的指令,以修改行為或使用非標(biāo)準(zhǔn)功能。

你可以將這類信息存儲(chǔ)在外部數(shù)據(jù)庫(kù)或目錄中而不使用注解, 但這樣做就使得開發(fā)人員很難生成用于部署、管理、自檢的客戶端共享庫(kù)和工具。

4.8.2 語法與規(guī)則

注解(Annotations) 存儲(chǔ)的形式是鍵/值對(duì)。有效的注解鍵分為兩部分: 可選的前綴和名稱,以斜杠(/)分隔。 名稱段是必需項(xiàng),并且必須在63個(gè)字符以內(nèi),以字母數(shù)字字符([a-z0-9A-Z])開頭和結(jié)尾, 并允許使用破折號(hào)(-),下劃線(_),點(diǎn)(.)和字母數(shù)字。 前綴是可選的。如果指定,則前綴必須是DNS子域:一系列由點(diǎn)(.)分隔的DNS標(biāo)簽, 總計(jì)不超過253個(gè)字符,后跟斜杠(/)。 如果省略前綴,則假定注解鍵對(duì)用戶是私有的。 由系統(tǒng)組件添加的注解 (例如,kube-scheduler,kube-controller-manager,kube-apiserver,kubectl 或其他第三方組件),必須為終端用戶添加注解前綴。

kubernetes.io/ 和 k8s.io/ 前綴是為Kubernetes核心組件保留的。

例如,下面是一個(gè) Pod 的配置文件,其注解中包含 imageregistry: https://hub.docker.com/

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

4.9 字段選擇器(Field selectors)

字段選擇器(Field selectors)允許你根據(jù)一個(gè)或多個(gè)資源字段的值 篩選 Kubernetes 資源。 下面是一些使用字段選擇器查詢的例子:

  • metadata.name=my-service
  • metadata.namespace!=default
  • status.phase=Pending

下面這個(gè) kubectl 命令將篩選出 status.phase 字段值為 Running 的所有 Pod:

kubectl get pods --field-selector status.phase=Running

說明:
字段選擇器本質(zhì)上是資源過濾器(Filters)。默認(rèn)情況下,字段選擇器/過濾器是未被應(yīng)用的, 這意味著指定類型的所有資源都會(huì)被篩選出來。 這使得以下的兩個(gè) kubectl 查詢是等價(jià)的:

kubectl get pods
kubectl get pods --field-selector ""
  • 支持的字段

不同的 Kubernetes 資源類型支持不同的字段選擇器。 所有資源類型都支持 metadata.namemetadata.namespace 字段。 使用不被支持的字段選擇器會(huì)產(chǎn)生錯(cuò)誤。例如:

kubectl get ingress --field-selector foo.bar=baz
Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace"
  • 支持的操作符
    你可在字段選擇器中使用 =、==和 != (= 和 == 的意義是相同的)操作符。 例如,下面這個(gè) kubectl 命令將篩選所有不屬于 default 命名空間的 Kubernetes 服務(wù):
kubectl get services  --all-namespaces --field-selector metadata.namespace!=default
  • 鏈?zhǔn)竭x擇器
    標(biāo)簽和其他選擇器一樣, 字段選擇器可以通過使用逗號(hào)分隔的列表組成一個(gè)選擇鏈。 下面這個(gè) kubectl 命令將篩選 status.phase 字段不等于 Running 同時(shí) spec.restartPolicy 字段等于 Always 的所有 Pod:
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
  • 多種資源類型
    你能夠跨多種資源類型來使用字段選擇器。 下面這個(gè) kubectl 命令將篩選出所有不在 default 命名空間中的 StatefulSet 和 Service:
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default

4.10 推薦使用的標(biāo)簽

除了 kubectl 和 dashboard 之外,您可以使用其他工具來可視化和管理 Kubernetes 對(duì)象。一組通用的標(biāo)簽可以讓多個(gè)工具之間相互操作,用所有工具都能理解的通用方式描述對(duì)象。

除了支持工具外,推薦的標(biāo)簽還以一種可以查詢的方式描述了應(yīng)用程序。

元數(shù)據(jù)圍繞 應(yīng)用(application) 的概念進(jìn)行組織。Kubernetes 不是 平臺(tái)即服務(wù)(PaaS),沒有或強(qiáng)制執(zhí)行正式的應(yīng)用程序概念。 相反,應(yīng)用程序是非正式的,并使用元數(shù)據(jù)進(jìn)行描述。應(yīng)用程序包含的定義是松散的。
共享標(biāo)簽和注解都使用同一個(gè)前綴:app.kubernetes.io。沒有前綴的標(biāo)簽是用戶私有的。共享前綴可以確保共享標(biāo)簽不會(huì)干擾用戶自定義的標(biāo)簽。

4.10.1 標(biāo)簽

為了充分利用這些標(biāo)簽,應(yīng)該在每個(gè)資源對(duì)象上都使用它們。

描述 示例 類型
app.kubernetes.io/name 應(yīng)用程序的名稱 mysql 字符串
app.kubernetes.io/instance 用于唯一確定應(yīng)用實(shí)例的名稱 mysql-abcxzy 字符串
app.kubernetes.io/version 應(yīng)用程序的當(dāng)前版本(例如,語義版本,修訂版哈希等) 5.7.21 字符串
app.kubernetes.io/component 架構(gòu)中的組件 database 字符串
app.kubernetes.io/part-of 此級(jí)別的更高級(jí)別應(yīng)用程序的名稱 wordpress 字符串
app.kubernetes.io/managed-by 用于管理應(yīng)用程序的工具 helm 字符串

為說明這些標(biāo)簽的實(shí)際使用情況,請(qǐng)看下面的 StatefulSet 對(duì)象:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxzy
    app.kubernetes.io/version: "5.7.21"
    app.kubernetes.io/component: database
    app.kubernetes.io/part-of: wordpress
    app.kubernetes.io/managed-by: helm

4.10.2 應(yīng)用和應(yīng)用實(shí)例

應(yīng)用可以在 Kubernetes 集群中安裝一次或多次。在某些情況下,可以安裝在同一命名空間中。例如,可以不止一次地為不同的站點(diǎn)安裝不同的 WordPress。

應(yīng)用的名稱和實(shí)例的名稱是分別記錄的。例如,某 WordPress 實(shí)例的 app.kubernetes.io/name 為 wordpress,而其實(shí)例名稱表現(xiàn)為 app.kubernetes.io/instance 的屬性值 wordpress-abcxzy。這使應(yīng)用程序和應(yīng)用程序的實(shí)例成為可能是可識(shí)別的。應(yīng)用程序的每個(gè)實(shí)例都必須具有唯一的名稱。

4.10.3 示例

為了說明使用這些標(biāo)簽的不同方式,以下示例具有不同的復(fù)雜性。

一個(gè)簡(jiǎn)單的無狀態(tài)服務(wù)

考慮使用 DeploymentService 對(duì)象部署的簡(jiǎn)單無狀態(tài)服務(wù)的情況。以下兩個(gè)代碼段表示如何以最簡(jiǎn)單的形式使用標(biāo)簽。

下面的 Deployment 用于監(jiān)督運(yùn)行應(yīng)用本身的 pods。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: myservice
    app.kubernetes.io/instance: myservice-abcxzy
...

下面的 Service 用于暴露應(yīng)用。

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: myservice
    app.kubernetes.io/instance: myservice-abcxzy
...

帶有一個(gè)數(shù)據(jù)庫(kù)的 Web 應(yīng)用程序

考慮一個(gè)稍微復(fù)雜的應(yīng)用:一個(gè)使用 Helm 安裝的 Web 應(yīng)用(WordPress),其中 使用了數(shù)據(jù)庫(kù)(MySQL)。以下代碼片段說明用于部署此應(yīng)用程序的對(duì)象的開始。

以下 Deployment 的開頭用于 WordPress:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: wordpress
    app.kubernetes.io/instance: wordpress-abcxzy
    app.kubernetes.io/version: "4.9.4"
    app.kubernetes.io/managed-by: helm
    app.kubernetes.io/component: server
    app.kubernetes.io/part-of: wordpress
...

這個(gè) Service 用于暴露 WordPress:

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: wordpress
    app.kubernetes.io/instance: wordpress-abcxzy
    app.kubernetes.io/version: "4.9.4"
    app.kubernetes.io/managed-by: helm
    app.kubernetes.io/component: server
    app.kubernetes.io/part-of: wordpress
...

MySQL 作為一個(gè) StatefulSet 暴露,包含它和它所屬的較大應(yīng)用程序的元數(shù)據(jù):

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxzy
    app.kubernetes.io/version: "5.7.21"
    app.kubernetes.io/managed-by: helm
    app.kubernetes.io/component: database
    app.kubernetes.io/part-of: wordpress
...

Service 用于將 MySQL 作為 WordPress 的一部分暴露:

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxzy
    app.kubernetes.io/version: "5.7.21"
    app.kubernetes.io/managed-by: helm
    app.kubernetes.io/component: database
    app.kubernetes.io/part-of: wordpress
...

使用 MySQL StatefulSetService,您會(huì)注意到有關(guān) MySQL 和 Wordpress 的信息,包括更廣泛的應(yīng)用程序。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,615評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,826評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,227評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,447評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,992評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,807評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,001評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評(píng)論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,243評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評(píng)論 1 287
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,709評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,996評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容