Kubernetes 101

(2020 版)

 

Python Taiwan (Telegram 讀書會)

王銘德

9/25/2020

今天會學到什麼

  • 我為何需要使用 K8s
  • 我需要自己架構 K8s Clusters 嗎?
  • 我只想用 docker-compose 可以嗎?
  • 簡單說明 K8s 的概念

kubernetes

簡稱 K8s

 

2014 開始, 

Google設計並捐贈給 Cloud Native Computing Foundation(今屬Linux基金會)來使用。(也是 Google 雲的核心, Google 自己的所有服務, 包括 Gamil, 都是在容器裡執行)

 

它旨在提供「跨主機叢集 (cluster) 的自動部署、擴充以及執行應用程式容器的平台」。[4] 它支援一系列容器工具, 包括Docker等。

專有名詞說明

* 什麼是 "軟體部署"

資料庫 MySQL, MongoDB, redis, Oracle 是一種軟體

Web Apps "網頁前端應用程式" 也是一種軟體

提供 API 服務的也是一種軟體

Web Proxy, 像 Apache, Nginx, Traefik 等, 都是軟體

它們都需要被 "部屬" 也就是把 新版的程式, 更新到 servers (硬體) 上. 這類主機, 則稱 "伺服器".

* 有可能一台主機, 裝很多不同軟體, 也有可能同一個軟體, 同一功能的服務 (service), 裝在很多台主機上, 提供同一個服務

回顧一下, Internet 真實世界

(Facebook, Google search, Gmail, iphone, 還有你公司的網站)

這些 servers 的軟體都在哪裡執行?

什麼是主機叢集?

(跨主機叢集, 又是什麼?)

Facebook 公司機房

Google 公司

機房

 貴公司機房

... ...

 "主機叢集"

雲端公司不只一個機房

我為何需要使用 K8s

K8s 使用機會

* 大公司的電算中心 (MIS 人員)

* 新創軟體公司 (DevOps 人員)

* 你的服務, 未來需要快速擴充

* 自學者

K8s 使用情境

*大量軟體快速部署

*因使用量瞬間暴增, 需快速增加主機台數, 執行相同軟體

(scale up)

因使用量瞬間減少, 需減少主機台數, 執行相同軟體

(scale down)

* 很多人, 只會考慮 scale up, 不會想到 scale down 的好處

K8s 優點

*使用 containers 技術, 跟利用 VMs (虛擬主機) 的管理方式, 又快, 又省資源, 又免費

 

*跨主機, 所以可以隨時加入新主機, 或淘汰就主機, 或甚至跨域主機叢集, 服務不停頓

 

*可因使用量, 自動調整 replicas 數量 (複製更多的軟體同時執行), 也會自動挑資源足夠的主機來執行.

*開放原始碼, 免費使用

 

*幾乎所有雲端大小廠都有提供, 而且相容. 也就是需求, 因實際情況需要, 可以快速軟體搬家 (重新部署)

 

* 國外很多人使用, 所以技術資源充裕, 文件完善.

K8s 缺點

*目前最新版本 1.19.x, 因為技術更新很快, 很多舊版的YAML檔格式不相容, 需修改後才能使用.

 

*目前台灣比較少人會, 找不到人問問題.

 

*目前台灣公司用 k8s 的少, 相對不容易找到工作.

(但找到工作, 通常薪水較高!!)

*台灣廠商喜歡自己架 (私有雲) K8s, 無法善用到 scale up and down 的最大好處

 

*學習門檻稍高

 

*架設及維護門檻超高. (幾乎就是自己在架設一個 Clouds 一樣.)

我需要自己架設 K8s 叢集嗎?

(我又是如何部署我的軟體?)

佈署軟體, 我有哪些選擇?

假如你選擇了私有雲 K8s

 Yes, 你需要會架設 K8s

(其他的人, 不需要學安裝. 只要會用 K8s 就好)

如果你是 MIS 人員, Yes

其他人只要會用就好

學一個 kubectl 指令而已,

頂多再學會用 Helm

(但你要有 docker, 及 docker-compose 的基礎)

 K8s 線上參考資料

聽說 docker swarm 很簡單

但很少人用了, 直接用 K8s

什麼時候該用 docker-compose?

anytime, any project, everybody

(現在, 你在台北市, 可能只有 1/10,000 的機會需要用 K8s)

應該講

會 docker-compose 以後要升級到用 K8s 就簡單了

(有需要的時候, 自然會用 K8s)

簡單說明 K8s 概念

(其他靠線上文章學習, 以及問問題)

為何 K8s 可以快速橫向擴充

(scale up)

參考圖來源 https://rtfm.co.ua/wp-content/uploads/2020/06/1_I4j4xaaxsuchdvO66V3lAg.png

連到 Service 的方法至少有三種

(Cluster IP, NodePort, Load Balancer)

參考圖來源 https://rtfm.co.ua/en/kubernetes-clusterip-vs-nodeport-vs-loadbalancer-services-and-ingress-an-overview-with-examples/

也可以用 Ingress 當入口

(同一個 IP 提供多個 Services)

參考圖來源 https://rtfm.co.ua/en/kubernetes-clusterip-vs-nodeport-vs-loadbalancer-services-and-ingress-an-overview-with-examples/

我都用 Traefik

(其他還有 Nginx 等也可以當 Ingress)

參考圖來源 https://doc.traefik.io/traefik/assets/img/traefik-architecture.png

你可以用 Play with K8s 練習

Q&A

(細說 K8s YAML 檔) ->

偷懶的方法, 利用 kompose

(學習中用, 未來直接寫 K8s 的 yaml)

➜   kompose convert -f docker-compose.yml

WARN Volume mount on the host "/Users/mingderwang/2020/PYTHON-TAIWAN/test-docker" isn't supported - ignoring path on the host

INFO Kubernetes file "redis-service.yaml" created
INFO Kubernetes file "web-service.yaml" created
INFO Kubernetes file "redis-deployment.yaml" created
INFO Kubernetes file "web-deployment.yaml" created
INFO Kubernetes file "web-claim0-persistentvolumeclaim.yaml" created

 

或 直接

 
kompose up

docker-compose.yml

web:  -> deployment (pod)

           -> service

redis:  -> deployment (pod)

            -> service

volume: -> persistant volume claim

docker-compose.yml 至少要改寫成 5 個 YAML 檔

docker-compose.yml

version: '3'

services:

  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
    links:
      - redis

  redis:
    image: "redis:alpine"

用 image 才能用 K8s 佈署

volume 要用 PVC

services

改成 image: ming/web

web-claim0-persistentvolumeclaim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: web-claim0
  name: web-claim0
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}

<--- PVC

nginx_clusterip_service.yaml

(舉例而已)

---
apiVersion: v1
kind: Service
metadata:
  name: "nginx-service"
  namespace: "default"
spec:
  ports:
    - port: 80
  type: ClusterIP
  selector:
    app: "nginx"

<---可改用 NodePort, LoadBalancer, ExternalName 等

redis-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    io.kompose.service: redis
  name: redis

spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: redis
    spec:
      containers:
      - image: redis:alpine
        name: redis
        resources: {}
      restartPolicy: Always
status: {}

Kubernetes 101

By Ming-der Wang

Kubernetes 101

  • 1,242