K8S動手教程2.3:Pod標籤和選擇器

2020-09-10 韋陀學院

內容摘要

Pod標籤

Pod標籤選擇器


標籤是K8S系統對資源的一種描述,可以有效的分類資源。在現在的應用中,一個應用往往可以包含多個服務,有的服務功能基本一致,那麼如何區分這些服務呢?使用標籤就可以做到。比如系統中如果有兩個tomcat服務,我們可以使用不同標籤區分它們。本章主要講解標籤以及常用操作,最後還會講解如何使用標籤實現Pod調度到相關節點。


創建帶標籤的Pod

首先構建容器鏡像,步驟如下:

1、創建Dockerfile

FROM node:7ADD app.js /app.jsENTRYPOINT ["node", "app.js"]

2、創建app.js

const http = require('http');const os = require('os');​console.log("server starting...");​var handler = function(request, response) { console.log("server Received request from " + request.connection.remoteAddress); response.writeHead(200); response.end("server You've hit " + os.hostname() + "\n");};​var www = http.createServer(handler);www.listen(8080);

3、構建鏡像

構建鏡像,名稱為app1,並推送到倉庫,方法可以參考上一節的內容。

4、創建Pod

配置如下:

apiVersion: v1kind: Podmetadata: name: apppod1 labels: app: myapp1 rel: v1.0spec: containers: - image: huqianakls/app1:latest name: appcon1 ports: - containerPort: 8080 protocol: TCP

在metadata下使用labels指定該Pod的標籤,app標籤表示名稱,rel是版本信息。

Pod創建成功後,查詢該Pod詳細信息,內容如下:

可以看到我們創建Pod時,設置的標籤。

在查詢時,可以使用 --show-labels 參數顯示標籤,截圖如下:

也可以使用 -L 參數,將標籤顯示為列,截圖如下:


常用操作

增加標籤

命令為:

kubectl label pod Pod名稱 標籤鍵值對

注意:如果該Pod已經存在該標籤時,增加失敗。

操作截圖如下:

上面操作中,第1次試圖增加app標籤,由於該標籤失敗,所以操作失敗。


修改標籤

命令為:

kubectl label pod Pod名稱 標籤鍵值對 --overwrite

比如,將上面的標籤app改為app1,操作截圖如下:


根據標籤查詢Pod

為了測試,創建1個新Pod,配置內容為:

apiVersion: v1kind: Podmetadata: name: apppod2 labels: app: myapp2 rel: v2.0spec: containers: - image: huqianakls/app1:latest name: appcon2 ports: - containerPort: 8080 protocol: TCP

下面我來測試下查詢Pod:

1、查詢標籤app值為myapp2的Pod

命令為:

kubectl get pod -l app=myapp2

2、查詢帶有rel標籤的Pod

命令為:

kubectl get pod -l rel

3、查詢沒有帶rel標籤的Pod

為了測試創建下面Pod,配置如下:

apiVersion: v1kind: Podmetadata: name: apppod3 labels: app: myapp3spec: containers: - image: huqianakls/app1:latest name: appcon3 ports: - containerPort: 8080 protocol: TCP

該Pod沒有rel標籤,只有app標籤。

下面我們查詢沒有帶rel標籤的Pod,命令為:

kubectl get pod -l '!rel'

只有apppod3,其他兩個Pod沒有查詢到,因為它們沒有rel標籤。

注意上面的查詢參數是一個表達式,!表示否定,表達式要使用單引號包圍。

4、查詢標籤app為app1的Pod

命令為:

kubectl get pod -l 'app=app1'

5、查詢標籤app值為app1或myapp3的Pod

命令為:

kubectl get pod -l 'app in (app1, myapp3)'

6、查詢標籤app值不為為app1或myapp3的Pod

命令為:

kubectl get pod -l 'app notin (app1, myapp3)'

7、查詢不帶desc以及rel標籤的Pod

命令為:

kubectl get pod -l '!desc,!rel'

注意這裡使用逗號將多個表達式連起來,逗號表示邏輯「與」的關係。


刪除標籤

命令為:

kubectl label pod apppod3 app-

注意:在標籤後面使用短橫,即可刪除標籤。


標籤選擇器

標籤不僅可以用來分類Pod等K8S資源,也可以用來做調度業務,關於調度這裡不深究,下面我們做個實驗將Pod調度到K8S集群中的某個特定節點。

為了測試,我們需要增加一個節點做測試,請參考前面章節的K8S安裝指南,創建2節點K8S集群。

在控制節點上查詢工作節點添加命令,結果為:

kubeadm token create --print-join-command --ttl 0

在工作節點執行上述命令,運行結果如下圖:

在控制節點查詢集群節點信息,結果如下:

前面我們給Pod資源打了標籤,下面我們給節點資源也打上標籤,我們選擇worker1,命令如下:

kubectl label node worker1 ssd=true

給節點worker1增加標籤ssd=true,這表示該節點使用ssd硬碟。這裡可以看出標籤的用法,對於工作節點,我們可以使用標籤來標記該節點的特性,比如硬碟,CPU,內存,是否帶有GPU等。

查詢節點信息,以及標籤,結果如下:

可以看到,在LABELS列下,不僅有自己設置的標籤,也有系統自帶的。

下面我們創建Pod,使該Pod調度到worker1節點,Pod配置如下:

apiVersion: v1kind: Podmetadata: name: apppod4 labels: app: myapp4spec: nodeSelector: ssd: "true" containers: - image: huqianakls/app1:latest name: appcon4 ports: - containerPort: 8080 protocol: TCP

注意:我們使用了nodeSelector屬性,下面使用了ssd=true標籤,該標籤將會使該Pod被調度到含有該標籤的節點上。

創建該Pod,查詢結果如下:

可以看到NODE列,該列顯示Pod的節點信息。剛才創建的Pod沒有在master上,而是調度到worker1節點上。

問題:如果系統中沒有節點帶有ssd=true標籤,那麼Pod會創建成功嗎?

下面我們測試下,首先刪除worker1節點的標籤,命令如下:

kubectl label node worker1 ssd-

刪除apppod4,重新創建Pod,結果如下:

該Pod一致處於Pending狀態,查詢詳情,可以看到事件信息,結果如下:

從最後的Events可以看出,沒有節點能夠匹配nodeSelector屬性,Pod的狀態一致處於Pending。


實驗

1、創建帶有標籤的Pod;

2、測試標籤的常用操作;

3、使用nodeSelector屬性調度Pod到指定節點;

相關焦點

  • K8S動手教程2.1:第1個Pod
    構建完成後,將鏡像push到自己在hub.docker.com中的容器倉庫,步驟如下:1、給新構建的鏡像打tagdocker tag first_pod huqianakls/first_pod:latest注意:huqianakls 是dockers上的帳號或者id號,使用/隔開,/後面就是鏡像名和tag;2、登錄自己的帳號
  • K8S動手教程2.5:Pod健康檢查
    觀察步驟如下:1、運行起來以後,等待容器狀態變為Runing;2、等待一段時間後,使用kubectl describe 和 kubectl get pod命令查看Pod;查詢詳情,結果如下:[root@K8S001 test]success=1 success=1 kubectl describe pod health2Name: health2Namespace: defaultNode: k8s002/172.18.152.17Start Time: Wed, 25 Sep 2019 18:44:41 +0800Labels:
  • 認識和理解k8s中的pod
    序言在大部分的k8s教程中,都是先講k8s的基本理論,對於剛剛接觸k8s的同學來說,可能一臉懵逼,望而生畏,所以我帶領大家一步步動手部署,在部署的過程中一步步教大家理解其中的概念,讓更多的技術人員邁入k8s的大門。
  • K8S動手教程3.1:ReplicationController
    replicas為3,表示要啟動3個Pod,replicas參數指定副本數量;3、第1個spec下的selector是標籤選擇器,用於匹配rc控制的Pod,凡是具有該標籤的Pod受到rc的控制;4、template是Pod的模板,下面的metadata是元數據,labels就是Pod的標籤,該標籤和selector下的標籤一致。
  • K8S動手教程2.4:Pod註解和命名空間
    內容摘要Pod註解命名空間註解和標籤比較類似,都是鍵值對,但是註解不是為了對應用進行分組,保存信息而存在的。註解主要用於工具,比如當K8S引入新特性時,會使用註解;還可以使用註解為每個K8S資源添加說明。
  • 乾貨|帶您了解k8s
    ,換一個新的就行了;3)可以自動實現水平擴展,一個容器不夠,再啟動一個就是了;4)可以自動實現服務發現和負載均衡,也就是說可以自動發現每個微服務之間的關係,同時也可以自動對容器內多個服務做負載均衡;5) 可以實現自動發布和回滾;6) 可以實現密鑰和配置管理,也就是說每個容器不是加載容器內的配置文件,而是加載遠程伺服器上(配置中心)的配置文件;
  • 容器編排系統k8s之Service資源
    Service資源在k8s上主要用來解決pod訪問問題;我們知道在k8s上pod由於各種原因重建,對於重建後的podip地址和名稱都是變化的,這樣一來使得我們訪問pod就變得有些不便;為了解決pod訪問能有一個固定的端點,在k8s上就是用service來解決的;簡單來講,service對象就是工作在節點上的一組iptables或ipvs規則,用於將到達service對象ip
  • 每天5分鐘|輕鬆掌握開發工作中必會的k8s-pod介紹和安裝nginx
    (2)學校做統計的時候會很方便,比如這次的疫情下統計健康情況,班級1 和班級2都很健康,班級3不正常。數據很容易觀察。(3)同一個班級裡面的學生共享一份教材即可,節省了資源。01—pod的介紹k8s最重要的功能之一就是資源的管理和調度,對於pod的理解和我們上面提到的班級的例子類似。
  • K8S動手教程2.2:Pod多容器,訪問,日誌
    8081:8080kubectl port-forward multicontainerpod 8082:80由於有兩個埠,因此需要配置兩個埠轉發。使用docker exec -it 命令分別進入con1和con2兩個容器,執行hostname命令,查看容器主機名,運行過程如下:
  • K8S中的Service的存在理由
    注意:service只是在k8s集群內部起作用,集群外部訪問是無效的實現原理Service通過關註定義出多個POD對象組合而成的邏輯集合,以及訪問這組POD的策略,Service關聯POD需要標籤選擇器完成,其基於標籤選擇器將一組POD定義成一個邏輯集合,並通過自己的IP位址和埠調度代理請求至後端POD之上。
  • 32 標籤選擇器和id選擇器
    CSS3之前的版本是CSS2.1,在CSS2.1中,有幾個特別經典的選擇器,分別是標籤選擇器、id選擇器、class選擇器、複合選擇器、以及偽類。而在CSS3中,這些經典的選擇器也被沿用了下來。這時,我們採用標籤選擇器,就可以很高效方便的把頁面上所有的無序列表標籤和a標籤的默認樣式進行重新設置,把它們全部都設置成沒有小圓點和沒有下劃線。也就是說,我們一開始就讓頁面上所有的無序列表標籤和a標籤都設置成沒有小圓點和沒有下劃線,當後面哪一個標籤需要小圓點或者需要下劃線時,再給它單獨設置就行。
  • k8s三部曲第二章第1節 pod核心原理
    1.pod核心原理概念:k8s的作用k8s是用來管理容器,但不直接操作容器,最小操作單元是pod(間接管理容器)特點:1).一個master有一群node節點2).master節點不存儲容器,只是負責調度、網關、控制器、資源對象存儲
  • K8s使用metric-server讓pod自動擴縮容
    監控指標用途:kubectl top 查看 node 和 pod 的 cpu+ 內存使用情況kubernetes-dashbaord 控制臺查看節點和 pod 資源監控Horizontal Pod Autoscaler 水平橫向動態擴展Scheduler 調度器調度選擇條件
  • kubernetes(k8s)基本概念
    上一篇介紹了用kubeadm安裝k8s集群,能把k8s安裝起來是開始學習和實踐的第一步。集群安裝好了,今天我們來簡單介紹下k8s的基礎實踐,並在實踐中介紹基本概念。Kubernetes 對象包含哪些?Replication ControllerReplicationController 確保在任何時候都有特定數量的 pod 副本處於運行狀態。 換句話說,ReplicationController 確保一個 pod 或一組同類的 pod 總是可用的。現在推薦使用配置 ReplicaSet 的 Deployment 來建立副本管理機制。
  • k8s之Service資源
    Service為四層調度器service通過標籤選擇器關聯至擁有相關標籤的而kube-proxy為DaemonSet 控制器將會在集群中每個節點運行一個Pod或者守護進程 如果需要轉換ipvs規則,則需要手動加載ipvs模塊進入內核iptables代理模式,對於每個Service對象,kube-proxy會創建iptables規則直接捕獲到達cluster ip和Port流量,並將其重定向至當前Service對象的後端Pod資源,對於每個Endpoint
  • K8S中的Service的存在理由
    需要標籤選擇器完成,其基於標籤選擇器將一組POD定義成一個邏輯集合,並通過自己的IP位址和埠調度代理請求至後端POD之上。label為【app:pod-label】的pod,這時候另一個服務B可以訪問跟a-service服務綁定的service,service信息是固定的提前告訴B就行了,service通過Label Selector跟a服務的pod綁定,無論a的pod如何變化對b來說都是透明的。
  • 每天5分鐘|輕鬆掌握開發工作必會的k8s-service的介紹和基本操作
    問題2:如果nginx的服務部署了10個pod,直接連接單個pod的ip的話,那剩下的9個pod不就沒用了嗎?怎麼才能如何保證請求均勻打到這個10個pod上呢?要解決這個問題,k8s內部需要有一個對象來做如下兩件事情:1、能夠管理一組pod,這組pod有固定的對外訪問的ip2、能夠管理一組pod,並且對組內的pod進行服務發現和負載均衡在k8s中,這個對象就是service,簡稱svc。
  • K8S動手教程3.3:DaemonSet
    內容摘要DaemonSet前面兩節講的rc和rs都是運行特定數量的Pod。但是,在實際應用中,可能有這樣的需求:在K8S集群每個節點上運行一個Pod,用於監控節點性能,收集日誌等。當集群新增節點該Pod能夠自動運行。對於這種應用,K8S也提供了解決方案,就是本節將要學習的DaemonSet,下面簡稱為ds。
  • k8s重器之Service
    >通過如下命令創建Servicekubectl create -f service-name.yaml創建之後查看:可看到Service被分配的ip,對應的port以及選擇的標籤信息(2)負載均衡目前k8s提供了兩種負載均衡策略:RoundRobin和SessionAffinity1、RoundRobin:輪詢模式
  • 每天5分鐘|輕鬆掌握開發工作必會的k8s-eplicationController介紹
    前面我們介紹了pod的基本概念和常用命令,並且手動安裝了一個nginx應用pod。然而,線上的流量會越來越大,一個nginx應用提供服務顯然不夠,那就需要多個nginx應用來做均衡,共同提供服務。多個應用容器,就意味著多個pod。開啟了多個pod,雖然保證了對外服務的正常,但也同樣帶來了pod管理和維護的問題。