Kubernetes 101
(2020 版)
Python Taiwan (Telegram 讀書會)
王銘德
9/25/2020
今天會學到什麼
- 我為何需要使用 K8s
- 我需要自己架構 K8s Clusters 嗎?
- 我只想用 docker-compose 可以嗎?
- 簡單說明 K8s 的概念
kubernetes
專有名詞說明
* 什麼是 "軟體部署"
資料庫 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

其他人只要會用就好
K8s 線上參考資料
iT 邦幫忙(182篇鐵人賽)
Medium (kubernetes 相關文章)
聽說 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,307