為什麼 kubernetes 會叫 k8s?

因為 ubernete 剛好有 8 個字母

所以就把中間的字母用 8 代替了

什麼是 k8s?

k8s 是一套用來自動部署、擴展和管理容器化應用程式的開源系統。

分享會大綱

  1. 前置作業
  2. Pod
  3. Label
  4. Service
  5. Ingress
  6. Volumes
  7. Secret
  8. ConfigMap
  9. Namespace

安裝 minikube

minikube 是由 Google 發布的一個輕量級工具。讓開發者可以在本機上輕易架設一個 Kubernetes 叢集(Cluster)

安裝 hyperkit

hyperkit 是一套 for macOS 的虛擬機器監視器(hypervisor),透過這個 driver 來啟動 minikube。

minikube start --vm-driver=hyperkit

安裝kubectl

ctl 全名其實就是 control 的意思,所以 kubectl 意思就是 control kubernetes 的工具啦!

什麼是 Pod?

在官網上是這樣說明的

Pods are the smallest deployable units of computing that can be created and managed in Kubernetes.

簡單來說 Pod 就是 k8s 中可以執行的最小單位

由於 Pod 只是一個可以被執行的最小單位,可想而知在一個 Pod 內一定有能被執行的內容

這些可以被執行內容的我們稱之為 container

簡單來說 Pod 的架構圖會長這樣:

再來講一下 container 吧!

在這些 Pod 中的 container 其實是用 docker 跑起來的

在 k8s 中預設的 docker image 是從 dockerHub 上面抓下來

當然也可以自己寫 Dockerfile 來建立 image

不過就要加上一些設定讓 k8s 在建立 Pod 的時候優先以本地端的 image 為主

imagePullPolicy: IfNotPresent

什麼是 Label?

替 Pod 上標籤,讓這些 Pod 可以方便地被分類分群

而 Label 就是一對具有辨識度的 key-value pair,所以可能會這樣寫

              
                labels:
                  tier: frontend
                  env: dev
              
            

什麼是 Annotation?

Labels 的一種,一樣提供識別用,只不過這個識別用是給開發人員看的,k8s 並不會採用此標籤

              
                annotations:
                  version: latest
                  contact: andychen@koodata.com.tw
              
            

什麼是 service?

在官網上是這樣說明的:

An abstract way to expose an application running on a set of Pods as a network service.

service 的存在就是建立一個網路連線通道讓應用程式可以正確地連結到正在運行的 Pods

  • ClusterIP: 讓在同一個 cluster 中的其他服務可以透過這個 IP 訪問到 Pod
  • NodePort: 讓在不同的 cluster 中的服務可以透過 NodePort 訪問到 Pod

加上 service 之後,目前 k8s 的流程圖會長這樣:

什麼是 Ingress?

在官網上是這樣說明的

An API object that manages external access to the services in a cluster, typically HTTP.

Ingress 可以幫助我們統一一個對外的 port number,並且根據 hostname 或是 pathname 決定封包要轉發到哪個 Service 上

  • 將不同路徑的請求對應到不同的 Service 物件
  • 將不同 domain name 的請求對應到不同的 Service 物件
  • 支援 SSL Termination

再加上 Ingress 之後,目前 k8s 的流程圖會長這樣:

什麼是 Volumes?

Volumes 為 k8s cluster 用來儲存資料的地方,不但能將 container 的資料存下來,同時也能利用掛載(mounting) 的方式提供給其他 Pod 使用

Volumes 類型

  • emptyDir
  • hostPath
  • Cloud Storage
  • Network FileSystem(NFS)

emptyDir

當新增一個新的 Pod 的時候,k8s 就會在這個 Pod 新增一個 emptyDir ,讓這個 Pod 內所有的 container 都可以存取這個 emptyDir ,當 Pod 被移除時,該 emptyDir 也會跟著被移除。

hostPath

在 Pod 物件上,掛載 Node 的資料夾或檔案,簡單來說就是直接把機器上的檔案掛載到 Pod 中

Cloud Storage

使用雲端硬碟的 Volumes ,常見的有 AWS EBS、Google Disk、Microsoft Azure Disk

Network FileSystem

利用 NFS 的原理存取同一個網域下的機器中的資料

什麼是 Secret?

用來儲存 k8s 上的機密資料

例如使用者帳密、ssl等等

Secret 的使用方式

  • 將 Secret 當作環境變數
  • 將建立好的 Secret file 掛載在某個 Pod 的路徑上
  • Secret 會將內部資料進行 base64 加密

如何建立 Secret?

首先準備一份比較機密的資料,這邊用 tls 憑證做範例

kubectl create secret generic secretName --from-file=file1Path --from-file=file2Path

kubectl get secret

什麼是 ConfigMap?

相較於 Secret,ConfigMap 通常是用來存放比較不機密但偏向部署面的資料

例如 nginx 設定、 DB IP 等等

ConfigMap 特性

  • 一個 ConfigMap 物件可以存入整個 configuration file
  • 無需修改程式碼,可以替換不同環境的 Config
  • 統一存放所有的 configuration

如何建立 ConfigMap?

首先準備一份部署面的設定檔,這邊以 nginx 設定檔為範例

kubectl create configmap configName --from-file=filePath

kubectl get configmap

什麼是 Namespace?

Namespace 就是抽象的 cluster

讓我們能根據專案不同,將原本擁有實體資源的單一 k8s cluster

劃分成幾個不同的 virtual cluster

預設所有建立的 Pod 都會擺放在 default 這個 Namespace

Namespace 特性

  • 在同一個 cluster 中,每個 Namespace 的命名需要有獨特性
  • 當一個 Namespace 被刪除時,內部的物件也會跟著被刪除

下次分享會的主題會是 k8s 進階觀念

謝謝大家!