iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 27
0

今天要介紹好用的分類用法NamespaceLabel,試著想像一個情境,當你有100個服務且有三個不同環境(DEVQAPROD),為了節省成本你將 QADEV 的服務放在相同的 K8S Cluster,那麼你至少就會有 200 個服務在K8S Cluster上,這麼多的服務該怎麼管理,今天第一個介紹的管理方式 Namespace

什麼是 Namespace ?

Namespace 可以用於分類以及管理服務,常用分類方式有 「ENV 環境」、「專案名稱」,例如以下方式:

  • 依據「ENV 環境」分類:
    • dev-frontend
    • dev-backend
    • qa-frontend
    • qa-backend
  • 依據「專案名稱」分類:
    • web01
    • web02
    • web03
  • 結合「ENV 環境」、「專案名稱」分類:
    • dev-web01
    • qa-web01
    • dev-web01
    • qa-web02

注意: Kubernetes 在起後服務後會有初始的三個 Namespace: 分別是:

  • default: 當服務不指定 Namespace 都會被分派到該 Namespace
  • kube-system: 該 Namespace 用於存放與系統相關的服務。
  • kube-public: 該 Namespace 保留給 K8S 群集使用,並提供所有人都可以看(包含未經過身分驗證人員),所以應避免將服務放置該 Namespace

示範將服務歸類在特定 Namespace

# 建立 namespace
apiVersion: v1
kind: Namespace
metadata:
  name:  apple

---

apiVersion: extensions/v1beta1 ## API 版本
kind: Deployment               ## 元件種類
metadata:                      ## 用來描述目前物件的資料
  name: nginx                  ## Deployment 名稱
  namespace: apple             ## Deployment 屬於哪個 namespace 擁有
  labels:
    service: http-server       ## 賦予該元件特定標籤
spec:
  replicas: 3                  ## 運行 3 個 Pod
  selector:                    ## 指定 Deployment 管理的 Pod 規則
    matchLabels:               ## Pod 必須具備 service: http-server 的標籤
      service: http-server
  template:
    metadata:                  ## 賦予 Pod具備 service: http-server 的標籤
      labels:
        service: http-server
    spec:
      containers:              ## 描述容器的資料
      - name: nginx-deploy     ## 容器名稱
        image: nginx           ## 容器映像檔
        ports:                 ## 指定容器 Port 號
        - containerPort: 80

---

apiVersion: v1                 ## k8s api 版本號
kind: Service                  ## 指定為 Service 物件
metadata:                      ## 用來描述 Service 物件的資料
  name: nginx-service          ## Service 的名稱
  namespace: apple             ## Deployment 屬於哪個 namespace 擁有
spec:
  type: NodePort               ## 指定Service的型別
  selector:
    service: http-server       ## 對應那一個 Deployment 的標籤
  ports:
  - port: 80                   ## 容器外 Port
    targetPort: 80             ## 容器內 Port

什麼是 Label?

Label 是以 「Key/Value」的形式附加到任何的元件上,像是:PodDeploymentServiceNode,那麼定義 Label 功用呢? 請看以下範例:

範例一:

有兩台 Node,一台硬碟為 ssd,一台為「一般硬碟」,所以我們可以為這兩台 Node 加上 Label:

  • disk: ssd
  • disk: sas

若今天有服務需要使用到 ssd,就可以透過 yaml 檔案指定服務必須包含 「disk: ssd」的標籤才可以建立服務。

範例二:

於新建的 Pod 上面新增 Labelservice: nginx」,接著當我們建立 Deploymant 並告至該元件必須管理含有service: nginx 標籤的 Pod,如以下 yaml 示範:

apiVersion: extensions/v1beta1 ## API 版本
kind: Deployment               ## 元件種類
metadata:                      ## 用來描述目前物件的資料
  name: nginx                  ## Deployment 名稱
  namespace: apple             ## Deployment 屬於哪個 namespace 擁有
  labels:
    service: nginx-deployment  ## 賦予該元件特定標籤
spec:
  replicas: 3                  ## 運行 3 個 Pod
  selector:                    ## 指定 Deployment 管理的 Pod 規則
    matchLabels:               ## Pod 必須具備 service: nginx 的標籤
      service: nginx
  template:
    metadata:                  ## 賦予 Pod具備 service: nginx 的標籤
      labels:
        service: nginx
    spec:
      containers:              ## 描述容器的資料
      - name: nginx-deploy     ## 容器名稱
        image: nginx           ## 容器映像檔
        ports:                 ## 指定容器 Port 號
        - containerPort: 80

以上就是今天要介紹的內容,那麼今天內容就寫到這邊,明天會介紹有效管理 K8S 的工具。


上一篇
Day26 了解 K8S 的 Volumes & StorageClass
下一篇
Day28 了解管理 K8S 工具 Helm
系列文
就是「懶」才更需要重視DevOps30

尚未有邦友留言

立即登入留言