Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CNTUG Kubernetes Workshop

Kyle Bai
March 17, 2018

CNTUG Kubernetes Workshop

Learning how to use Kubernetes.

Kyle Bai

March 17, 2018
Tweet

More Decks by Kyle Bai

Other Decks in Technology

Transcript

  1. About Me 白凱仁(Kyle Bai) • Interested in emerging technologies. •

    COSCUP, Kubernetes Day and OpenStack Day Speaker. • OpenStack and Kubernetes Projects Contributor(100+ PR). • Certified Kubernetes Administrator. @kairen([email protected]) https://kairen.github.io/
  2. Agenda Today I would like to talk about 利用 Minikube

    部署叢集 不要懷疑就是用 Minikube Kubernetes 基礎概念 邊操作邊了解 Kubernetes 了解 Core primitives 了解與操作 K8s 抽象資源 利用工具與 Addons 加強 K8s 學習如何善用開源工具來管理 K8s
  3. Minikube Kubernetes 社區官方維護的開源工具︐非常適合入門開發者使用︐Minikube 會透過 建立單節點虛擬機來部署 Kubernetes︐以提供開發者方便測試。 • 簡單部署與刪除節點(採用 kubeadm 作為

    bootstrapper) • 支援多種 VM Driver︐如 Virtual Box、Hyper-V 與 KVM 等等 • 支援多種 Kubernetes Addons ︐如 Dashboard、NVIDIA GPU 等等 • 支援 Mounting Host 目錄 https://github.com/kubernetes/minikube
  4. Kubeadm Kubeadm 同樣是由 Kubernetes 社區維護的工具︐與 Minkube 不同的是其原始碼被 包含在 Kubernetes 核心專案中。Kubeadm

    主要是幫助建立最佳實踐的最小叢集。 • 適合部署多節點叢集︐也能支援 HA 與 Self-hosting 部署方式 • 支援以 Config 方式來描述部署的叢集 • 預設會支援 Kubernetes 新版本一些重點特性 • 許多部署工具背後也採用 kubeadm https://github.com/kubernetes/kubernetes/tree/master/cmd/kubeadm
  5. Other Kubespray RKE Kops https://github.com/ramitsurana/awesome-kubernetes#installers Kube-aws Typhoon Kubicorn Docker LinuxKit

    Matchbox KubeNow https://caylent.com/50-useful-kubernetes-tools Bootkube kubeadm-dind-cluster
  6. 我們將透過 Minikube 來管理 Virtual Box 的虛擬機︐並協助自動 建立 Master 節點。 下載

    MiniKube 與 Virtual Box 1 2 Kubectl 將用來在本機操作 Kubernetes 叢集使用。 下載 Kubectl 我們將建立一個 Kubernetes Master 與兩個 Node 節點來提 供測試用。 部署節點架構
  7. www.companyname.com © 2016 Jetfabrik Multipurpose Theme. All Rights Reserved. 11

    3 4 下載完成後︐即可透過以下指令來建立︓ rm -rf $HOME/.minikube minikube --profile k8s-m1 start minikube profile k8s-m1 啟動 Minikube 來建立 Master 節點 當 Master 建立完成後︐透過 kubectl 來與 API Server 溝通 操作 Kubernetes 叢集︓ kubectl get node kubectl -n <namespace> <verb> <resources> kubectl -n kube-system get pod kubectl api-resources 檢查 Kubernetes Master 節點
  8. www.companyname.com © 2016 Jetfabrik Multipurpose Theme. All Rights Reserved. 12

    5 6 當完成 Master 節點後︐開啟新 console 再透過 Minikube 建立 Node 節點︓ minikube --profile k8s-n1 start --node minikube --profile k8s-n1 ssh 透 Minikube 來建立 Node 節點 建立完成 Node 後︐就可以將該節點加入叢集︐首先取得 TLS bootstrapping token︓ minikube --profile k8s-m1 ssh "sudo kubeadm token list" 進入 Node 節點︐然後透過 kubeadm 來加入︓ kubeadm join --token ${TOKEN} 192.168.99.100:8443 \ --discovery-token-unsafe-skip-ca-verification \ --ignore-preflight-errors=Swap \ --ignore-preflight-errors=DirAvailable--etc- kubernetes-manifests 完成後︐透過 kubectl 確認 Node 節點︓ kubectl get no kubectl get csr 加入 Node 節點已註冊至指定 Master Node 的 Kubelet 對 API Server 發起 CSR API 請求︐一但請求被接 受並認證成功︐將由 API Server 自動配發簽署的憑證給 kubelet 以獲得權限存取更多 API 資源。 TLS bootstrapping
  9. www.companyname.com © 2016 Jetfabrik Multipurpose Theme. All Rights Reserved. 13

    7 8 由於 kube-go add-on 預設會部署一個 Pod 至 default namespace 中︐因此透過以下指令來查看︓ kubectl get po -l component=kube-go 接著透過 exec 進人 Pod︓ kubectl exec -ti kube-go -- /bin/zsh 檢查 kube-go add-on 狀況 當叢集建立好了後︐之後啟用 Go development 的 add-on 來幫 助後續開發使用︓ minikube --profile k8s-m1 addons enable kube-go 啟用 Go development add-on
  10. www.companyname.com © 2016 Jetfabrik Multipurpose Theme. All Rights Reserved. 14

    9 10 接著透過 Minikube 啟用 Dashboard 來方便我們透過 Web-based UI 來管理 Kubernetes 叢集資源︓ minikube addons enable dashboard 啟用 Kubernetes Dashboard 當啟用 Dashboard 後︐就可以透過 kubectl 來查看 kube- system namespace 中的 pod︓ kubectl -n kube-system get po -l app=kubernetes- dashboard 透過瀏覽器開啟 Dashboard︓ minikube addons open dashboard 檢查 Dashboard add-on 狀況
  11. www.companyname.com © 2016 Jetfabrik Multipurpose Theme. All Rights Reserved. 11

    到這步驟後︐一個簡單的 Kubernetes 叢集就完成了︐透過簡單 指令部署 Kubernetes Hello World 吧︓ kubectl run nginx --image nginx --port 80 kubectl expose deploy nginx --port 80 --type NodePort 部署一個簡單 NGINX 服務
  12. Kubernetes API 首先透過 kubectl 執行一下指令︓ $ kubectl create clusterrolebinding anonymous-become-admin

    \ --clusterrole=cluster-admin --user=system:anonymous 接著透過瀏覽器開啟 https://master_ip:8443 來查看 APIs。 /apis/apps/v1/namespaces/default/deployments/nginx Group Verb Resource https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/ batch police storage create update delete pod service nodes
  13. Kubernetes API Levels 在 Kubernetes 中︐不同版本的 API 意味著不同層級穩定度與支援度︓ • Alpha

    level:在預設下是大多情況禁止使用狀態︐這些功能有可能隨時在下一版本 被遺棄︐因此只適用於測試用。ex: v1alpha1。 • Beta level: 在這級別一般預設會啟用︐這表示該功能已經過很好的測試項目︐但 是物件內容可能會在後續版本或穩定版本發生變化。ex: v1beta2。 • Stable level:在這級別表示該功能已經穩定︐會很長的時間一直存在。ex: v1。 Pod
  14. Kubernetes API Resource Objects 首先透過 kubectl 執行一下指令︓ $ kubectl get

    --raw "/api/v1/namespaces/default/pods/kube-go" | jq . $ kubectl get po kube-go -o json { "kind": "Pod", "apiVersion": "v1", "metadata": {} "spec": {} "status": {} } Resource ObjectMeta ︓有關資源的詮釋資料︐例如名稱、標籤等。 Resource Spec︓由使用者定義並描敘所需內容︐如 Container 資訊等。 Resource Status︓由 Kubernetes 處理的當前物件狀態。
  15. Kubernetes Objects Node Pod Deployment DaemonSet Service ConfigMap Secrets StatefulSet

    Job Labels Selector Volumes Replica Set Replication Controller Network Policy
  16. 首先透過 kubectl 執行一下指令︓ $ kubectl delete clusterrolebinding anonymous-become-admin 接著透過瀏覽器開啟 https://master_ip:8443

    來查看 API。 Kubernetes API 認證與授權 ResourceQuota NamespaceLifecycle RBAC Webhook X509 Client Certs Bootstrap Tokens
  17. Kubernetes Controller Manager 首先透過 kubectl 查看 Controller Manager Pod︐然後執行以下指令︓ $

    kubectl -n kube-system logs -f <controller-pod> $ kubectl run nginx-rc --generator=run/v1 \ --image nginx:1.14 $ kubectl get rc -o wide $ kubectl scale rc nginx-rc --replicas=2 Drive current state → desired state
  18. Kubernetes Scheduler 首先透過 kubectl 執行以下指令︓ $ kubectl run nginx --restart=Never

    --image=nginx \ --overrides='{"apiVersion": "v1", "spec": {"nodeSelector": { "run": "here" }}}' $ kubectl describe po nginx $ kubectl label nodes k8s-n2 run=here $ kubectl get po nginx -o jsonpath='{.spec.nodeName}'
  19. Scheduler 選取節點流程 Host 1 Host 2 Host 3 Host 4

    Host 5 Host 6 Host 1 Host 2 Host 3 Host 4 Host 5 Host 6 Predicate MatchNodeSelector PodSelectorMatches NoDiskConflict …
  20. Scheduler 選取節點流程 Host 1 Host 2 Host 3 Host 4

    Host 5 Host 6 Host 1 Host 2 Host 3 Host 4 Host 5 Host 6 Predicate Host 2 Host 3 Host 4 Host 5 Priority Node Affinity Priority Selector Spread Priority Image Locality Priority …
  21. Scheduler 選取節點流程 Host 1 Host 2 Host 3 Host 4

    Host 5 Host 6 Host 1 Host 2 Host 3 Host 4 Host 5 Host 6 Predicate Host 2 Host 3 Host 4 Host 5 Priority Host 3 Select
  22. Pods • Kubernetes 最小執行單位 • Container 與 Volume 的小群組 •

    群組內緊密耦合︐如 Container 放置、原子複製 • 每個 Pod 只有一個 IP(當然不是硬性) • 共享 localhost、volumes 與 network 等 • 支援 Init container “Pod is a single instance of an application in Kubernetes”
  23. Volumes • 儲存會在 Pod 啟動時自動附加(如果有定義的話) • 依據需求建立本地臨時目錄 • 支援使用 Host

    檔案、目錄與裝置 • 支援多種儲存系統 • NFS、GlusterFS • iSCSI、Cinder、RBD • Git repo • Secret、Configmap(Kubernetes object)
  24. Namespace • 一組 Kubernetes 資源與物件的抽象集合 • 不同 Namespace 之間 Kubernetes

    資源 與物件是隔離的 • 將資源物件與 Host 解藕 • 不同 Namespace 能做簡單的使用者隔 離(不同使用者用不同 Namespace) • 能與 Adminssion、Authorization、 Authentication 相結合
  25. Secrets • 與 ConfigMap 功能 87% 一樣 • 以 Base64

    做 encode (有跟沒有一樣) • 適合用於敏感資料與檔案 Node Pod Secret API
  26. Labels • 使用者提供的 Key/Value 屬性 • 可以附加到任何 API object 上

    • 通常用在一組應用的 API Object 識別與分組 • 可以由 Selector 來查詢︐當作 SQL 的 `select ... where ..`
  27. Selector • 用來查詢 Lables︐當作 SQL 的`select ... where ..` •

    許多 API Object 透過 Selector 來選取關聯的 Object(如 Service select Pod) • Equality-based selectors (=, ==, !=) • Set-based selectors (in, notin, exists) track = stable app: my-app track: stable tier: FE app: my-app track: canary tier: FE
  28. app: my-app track: stable tier: FE app: my-app track: canary

    tier: FE app: my-app track: stable tier: BE app: my-app track: canary tier: BE
  29. app = my-app app: my-app track: stable tier: FE app:

    my-app track: canary tier: FE app: my-app track: stable tier: BE app: my-app track: canary tier: BE
  30. app = my-app, tier = FE app: my-app track: stable

    tier: FE app: my-app track: canary tier: FE app: my-app track: stable tier: BE app: my-app track: canary tier: BE
  31. app = my-app, track = stable app: my-app track: stable

    tier: FE app: my-app track: canary tier: FE app: my-app track: stable tier: BE app: my-app track: canary tier: BE
  32. Services • Kubernetes 存取 Pod 的抽象資源(以 Selector 選定 Pod) •

    支援 DNS 查詢來導向對應 Pod IP( Pod 掛掉會改變) • DNS SRV records for ports • 提供不同 Access Policy: • ClusterIP • NodePort • LoadBalancer • Headless Virtual IP Client
  33. Replication Controllers • 確保 Pod 在叢集上有 N 份副本 • 當缺少就新建︐當多一個就刪除

    • 透過 Selector 來選取管理 Pod • select pod num == replicas value • 能夠動態縮放 • 僅支援 equality-based selector ReplicationController - selector = {"app": "my-app"} - template = { ... } - replicas = 4 API Server How many? 3 Start 1 more OK How many? 4 “Controller manages replicated pods for an application pattern”
  34. Replica Sets • 與 Replication Controllers 87% 功能一樣 • 是新一代

    Replication Controllers • 支援 Set-based selector • 為 Deployment 的基底 Repica Sets - selector: { "matchLabels": {"key": value}, "matchExpressions": [{k, o, v}] } - replicas = 4 API Server How many? 3 Start 1 more OK How many? 4
  35. Deployments • Rollouts as a service • 支援 Rolling update

    與 Recreate 方式更新 Pod Template • 聲明式更新 • 管理 RS 與 Pod Deployment - strategy: {type: RollingUpdate} - replicas: 3 - selector: - app: my-app ...
  36. Rolling Updates Deployment - replicas: 3 - selector: - app:

    my-app - version: v1 Service - app: my-app Live-update an application $ kubectl set image deployment \ my-app my-app= :v2 —record
  37. Deployment - replicas: 3 - selector: - app: my-app -

    version: v1 Deployment - replicas: 0 - selector: - app: my-app - version: v2 Service - app: my-app
  38. Deployment - replicas: 3 - selector: - app: my-app -

    version: v1 Deployment - replicas: 1 - selector: - app: my-app - version: v2 Service - app: my-app
  39. Deployment - replicas: 2 - selector: - app: my-app -

    version: v1 Deployment - replicas: 1 - selector: - app: my-app - version: v2 Service - app: my-app
  40. Deployment - replicas: 2 - selector: - app: my-app -

    version: v1 Deployment - replicas: 2 - selector: - app: my-app - version: v2 Service - app: my-app
  41. Deployment - replicas: 1 - selector: - app: my-app -

    version: v1 Deployment - replicas: 2 - selector: - app: my-app - version: v2 Service - app: my-app
  42. Deployment - replicas: 1 - selector: - app: my-app -

    version: v1 Deployment - replicas: 3 - selector: - app: my-app - version: v2 Service - app: my-app
  43. Deployment - replicas: 0 - selector: - app: my-app -

    version: v1 Deployment - replicas: 3 - selector: - app: my-app - version: v2 Service - app: my-app
  44. Rollback Kubernetes 支援查看正在 Rolling Update 的 Deployment︓ $ kubectl rollout

    history deploy my-app # 查看狀態 $ kubectl rollout status deployment my-app # 暫停與繼續滾動升級 $kubectl rollout pause/resume deployment my-app # 回滾到上一個版本 $ kubectl rollout undo deployment my-app $ kubectl rollout undo deployment my-app --to-revision=1
  45. DaemonSets • 每個節點啟動一個 Pod 作為 Daemon • 不支援副本概念 • Pod

    生命週期綁定於節點 • 適合用於 logging 或 agents • 支援滾動升級
  46. Jobs • 管理 Pod 需要被完成幾次 • 可支援一次執行一個或多個 Pod • 當

    Pod 發生錯誤時︐會重新開啟一個新的 直到完成 Job - parallelism: 3 - completions: 6 - selector: - job: my-work
  47. StatefulSets • 依序啟動與刪除管理的 Pod (LIFO) • 自動為 Pod 帶入編號 •

    當使用 Volume template 時︐會自動建立 對應編號 • 為 Pod 提供身份辨識︐如 hostname、 DNS 名稱 • 支援滾動升級 volume-db-0 volume-db-1 volume-db-2 db-0 db-2 db-2
  48. Ingress(L7) • 以 Virtual Host 概念來 Proxy 到 K8s 內部服務

    • 支援 SSL termination、Name-based 等等 • 支援 TCP、UDP proxy • 能以 URL Paths 來 Proxy 不同內部服務 • 目前有許多實現專案 • ingress-nginx • Traefik • F5 BIG-IP Controller • Kong
  49. NGINX Ingress Controller 實現 Ingress 功能就是透過 Ingress Controller 來達成︐它會負責監聽 Kubernetes

    API 中的 Ingress 與 Service 等資源物件︐並在發生資源變化時︐依據資源預期的結果來 設定 HTTP Server 來 Proxy 到 Kubernetes 內部 Service。
  50. External DNS External DNS 是 Kubernetes 社區的孵化專案︐被用於定期同步 Kubernetes Service 與

    Ingress 資源︐並依據資源內容來自動設定公有雲 DNS 服務的資源紀錄(Record resources)。而由於部署不是公有雲環境︐因此需要透過 CoreDNS 提供一個內部 DNS 伺服器︐再由 ExternalDNS 與這個 CoreDNS 做串接。
  51. Metrics Server Metrics Server 是實現了資源 Metrics API 的元件︐其目標是取代 Heapster 作為

    Pod 與 Node 提供資源的 Usage metrics︐該元件會從每個 Kubernetes 節點上的 Kubelet 所公開的 Summary API 中收集 Metrics。 首先透過 kubectl 執行︓ $ kubectl top node $ kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq .
  52. Helm Helm 是 Kubernetes Chart 的管理工具︐Kubernetes Chart 是一套預先組態的 Kubernetes 資源。其中Tiller

    Server主要負責接收來至 Client 的指令︐並透過 kube- apiserver 與 Kubernetes 叢集做溝通︐根據 Chart 定義的內容︐來產生與管理各種對 應 API 物件的 Kubernetes 部署檔案(又稱為 Release)。
  53. 透過 Helm 管理 Kubernetes 應用 $ helm init $ kubectl

    -n kube-system get po -l app=helm $ helm search jenkins $ helm install --name demo --set Persistence.Enabled=false stable/jenkins $ kubectl get po,svc -l app=demo-jenkins $ printf $(kubectl get secret demo-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 -- decode);echo