iT邦幫忙

0

Kubernetes基礎功能教學

#Why Kubernetes?

  • Kubernetes(K8S)是一個可以幫助我們管理微服務(microservices)的系統,他可以自動化地部署及管理多台機器上的多個容器(Container)。簡單來說,他可以做到:

    • 同時部署多個容器到多台機器上(Deployment)
    • 服務的乘載量有變化時,可以對容器做自動擴展(Scaling)
    • 管理多個容器的狀態,自動偵測並重啟故障的容器(Management)
  • 虛擬機佈建方法vs貨櫃佈建方法佈建方法 :

    • 耗費資源多
    • 新增/刪除管理較困難
      https://ithelp.ithome.com.tw/upload/images/20210705/20139199jFwUczFiwh.png

    #Kubernetes Install preparation

  • 安裝好Docker的virtualbox VM

  • 準備Repository

  • 安裝kubeadm(自動佈署工具),kubelet(管理Pods),kubectl(人機介面)

    • apt-get install –y kubelet kubeadm kubectl
    • apt-mark hold kubelet kubeadm kubectl (鎖定版本)
  • 確認版本

    • kubeadm version
    • kubectl version
  • 下載Kubernetes建置相關Image檔案

    • kubeadm config images pull
  • 指定安裝特定版本

    • apt-cache Madison kubeadm (搜尋特定版本)
    • apt-get install –y kubelet=[版本編號]
    • apt-get install –y kubectl=[版本編號]
    • apt-get install –y kubeadm=[版本編號]

#Kubernetes 基本元件

  • Kubernetes基本元件如下
    • Container : 運作單位,使用Docker Container運作基本功能
    • Pod : 服務單位,下面會有多個Container運行同樣的微服務
    • Node : 就是一部電腦,下面會跑各種微服務(Pods),Kubernetes有兩種角色
    • Master : 用來管理其他Nodes管理單位
    • Worker : 用來運行各種微服務的運作單位
    • Cluster : Kubernetes中一堆Nodes合起來的的總稱
      https://ithelp.ithome.com.tw/upload/images/20210705/201391996b5vXLfVTi.png

#Kubernetes Architecture

https://ithelp.ithome.com.tw/upload/images/20210705/20139199ps7x3U16tu.jpg

#Kubernetes Install (Master)

  • 設定Kubernetes使用的VM的網路模式為橋接介面卡
  • 關閉swap功能
    • sudo swapoff –a (建議寫在.bashrc裡面,因為 重新開機的時候你會發現Kubernetes怎麼跑都跑不起來就是這個swap又自動開了)
    • 確認CPU數目>2 (不滿2似乎會報Error,不過可以用—ingnore-preflight-errors=NumCPU關掉)
  • 自動佈署kubernetes (Master)
    • sudo kubeadm init –pod-network-cidr=192.168.244.0/24
  • 設定本機為Kubernetes的使用者
    • mkdir -p $HOME/.kube
    • sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    • sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 確認images都有正常運行
    • Kubectl get node (確認node有正常運行)
    • Kubectl get pods –all-namespaces (確認pods皆有正常運行)
  • 證實會看到 Coredns Ready狀態為0這是因為CNI還沒有安裝 下一頁會繼續講解如何安裝
    https://ithelp.ithome.com.tw/upload/images/20210705/20139199ZA0YS58JNZ.jpg

#Kubernetes Install (Master)

  • 佈署Flannel (Container Network Interface - CNI)
  • 檢查運行狀況
    • Kubectl get pods –all-namespaces
  • 處理CrashLoop問題 (Ubuntu會有的Bug)
    • Kubectl edit cm coredns –n kube-system
    • 刪除文件內loop那行後存檔
    • 使用Kubectl get pods –all-namespaces確認運行正常
  • 假設想用Master Node來建立pod無法運行問題
    • Kubectl taint nodes –all node-role.ku
  • 尋找系統運行問題可以使用
    • Kubectl describe pod [pod name]

https://ithelp.ithome.com.tw/upload/images/20210705/20139199FzqHD7pAgb.jpg

#Kubernetes Install (Worker)

  • 設定Kubernetes使用的VM的網路模式為橋接介面卡
  • 關閉swap功能
    • sudo swapoff –a (建議寫在.bashrc裡面,因為 重新開機的時候你會發現Kubernetes怎麼跑都跑不起來就是這個swap又自動開了)
    • 確認CPU數目>2 (不滿2似乎會報Error,不過可以用—ingnore-preflight-errors=NumCPU關掉)
  • 將Worker Node加入Cluster
    • 找尋加入Cluster的Token Key Kubeclt token create –print-join-command (在Master Node 輸入)
    • 在Worker Node輸入Token Key 加入Cluster Sudo kubeadm join …. (上面查詢到的字串)
  • 檢查是否成功加入Worker Node
    • Kubectl get node (在Master Node 輸入)
      https://ithelp.ithome.com.tw/upload/images/20210705/20139199RHRJ8qOice.jpg

#Kubernetes 基本指令

  • kubectl create –f [yaml檔] : 建立kubenetes的功能元件
  • kubectl delete –f [yaml檔] : 刪除kubenetes的功能元件
  • kubectl get [all/pods/service/ingress] : 查詢kubenetes功能元件運作狀態
  • kubectl describe [all/pods/service/ingress] : 查詢kubenetes功能元件詳細資料
  • Kubectl edit [pod/deployments/service] [element Name] : 修改功能元件的屬性配置

#建立Pods by Deployment

  • Yaml檔案格式
    • 由Key : Value組成
    • 使用空格表示結構空格數目相同代表同個階層
    • 使用(- )減號加一個空格表示list
    • 使用---分隔物件
  • 建立Deployment使用的yaml檔案 :
    • ApiVersion : 元件版本號
    • Kind : 元件屬性
    • metadata-name : pod名稱
    • spec-replicas : 要建立多少個相同的Pod
    • Template : pod使用container的設定
    • Containers-image : 使用的映像檔
    • Containers-ports : Container外接的Port
    • Selector : 指定這份文件要作用在哪,通常就跟template labels一致就可以
  • 佈建Deployment
    • Kubectl create –f [deployment yaml file]
      https://ithelp.ithome.com.tw/upload/images/20210705/20139199dVid8OjR4C.jpg
  • Yaml File的內容
  • Yaml範例
Eample1:
  a : 1
  b :
    b-1 : 2
  c :
    - c-1 : 3
      c-2 : 4
---
Eample2 : 5
  • Demo範例 [Deploy.yaml]
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: demoapp
spec: 
  replicas: 3
  template:  
    metadata:   
      labels:    
        app: demoapp  
    spec:   
      containers:
        - name: qbc  
          image: hcwxd/kubernetes-demo   
          ports:       
            - containerPort: 3000
  selector: 
    matchLabels:  
      app: demoapp

#Kubernetes Service

  • Service功能 : 把Pods的指定Port外接出去,就不用一個一個pod尋找IP
  • Service.yaml檔案 :
    • Selector-app : 會去找pod template的Labels來對應取出pod
    • TargetPort : pod上要映射出去的port (IP 可由kubectl get pods –o wide找到)
    • port : service上將pods映射轉接出來的port (IP可由kubectl get service找到)
    • nodePort : Node上將service轉接出來的port (IP可由ifconfig找到)
  • 佈建Service
    • Kubectl create –f [service yaml file]
  • Kubernetes Service 網路架構
    https://ithelp.ithome.com.tw/upload/images/20210705/20139199tQQLPoamHb.png
    https://ithelp.ithome.com.tw/upload/images/20210705/20139199WmoHeOH8Sz.png
  • Yaml File [Service.yaml]
apiVersion: v1
kind: Service
metadata: 
  name: my-service
spec:
  selector:  
    app: demoapp 
  type: NodePort
   ports:  
     - protocol: TCP    
       targetPort: 3000 
       port: 3001    
       nodePort: 30390

Kunbernetes佈建Nginx-Ingress


#Kunbernetes Nginx-Ingress 網路架構

https://ithelp.ithome.com.tw/upload/images/20210705/20139199RMYNlEVjs0.jpg

Kubernetes Ingress

  • 建立好Deployment.yaml檔案,並運行 :
    • kubectl create –f Deployment.yaml
  • 建立好Service.yaml檔案 ,並運行 :
    • kubectl create –f Service.yaml
  • 建立好Ingress.yaml檔案並運行 :
    • Kubectl create –f Ingress.yaml
  • 檢查是否皆順利運行 :
    • Kubectl get all
    • Kubectl get ingress –o wide
      https://ithelp.ithome.com.tw/upload/images/20210705/20139199bSxLWwMtJE.png
  • Yaml File [Service.yaml]
apiVersion: v1
kind: Service
metadata: 
  name: blue-service
spec: 
  selector: 
    app: blue-nginx 
  type: NodePort 
  ports: 
   - protocol: TCP  
     port: 80   
    targetPort: 3000
---
apiVersion: v1
kind: Service
metadata: 
  name: purple-service
spec: 
  selector: 
    app: purple-nginx 
  type: NodePort 
  ports: 
   - protocol: TCP  
     port: 80   
    targetPort: 3000
  • Yaml File [Deployment.yaml]
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: blue-nginx
spec: 
  replicas: 2
  template:
    metadata:   
      labels:   
        app: blue-nginx 
  spec:   
    containers:    
      - name: nginx     
         image: hcwxd/blue-whale    
         ports:      
          - containerPort: 3000
  selector:
    matchLabels:
      app: blue-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: purple-nginx
spec: 
  replicas: 2
  template:
    metadata:   
      labels:   
        app: purple-nginx 
  spec:   
    containers:    
      - name: nginx     
         image: hcwxd/purple-whale    
         ports:      
          - containerPort: 3000
  selector:
    matchLabels:
      app: blue-nginx
  • Yaml File [Ingress.yaml]

apiVersion: extensions/v1beta1
kind: Ingress
metadata: 
  name: web
spec:
  rules: 
   - host: blue.demo.com   
     http:     
      paths:     
       - backend:      
           serviceName: blue-service
           servicePort: 80  
   - host: purple.demo.com    
     http:   
       paths:     
        - backend:         
            serviceName: purple-service
            servicePort: 80

#Kubernetes Ingress

  • 查詢Ingress external-IP是否正確設置
    • Kubebctl get svc –n ingress-niginx
  • 查詢nginx-ingress-controller裡面是否有把設置傳進去
    • Kubectl get pod –n=ingress-nginx (查詢pod名稱)
    • Kubectl exec –n=ingress-nginx [pod Name] – [command]
  • 於Node設置網址轉譯
  • 於瀏覽器測試
    https://ithelp.ithome.com.tw/upload/images/20210705/20139199xX6PXuBegy.jpg

#Kubernetes Install Helm

  • Helm的功能 :
    • 藉由腳本(Chart)自動部屬kubernetes的pods, service, ingress來完成微服務的建立
  • 下載Helm安裝腳本
  • 將執行權限在開起來並執行
    • chmod 700 get_helm.sh
    • ./get_helm.sh
  • 建立helm的腳本template
    • helm create [專案名稱]
      • 創立的檔案 :
        • Values.yaml : 定義Chart中pod, service, ingress…使用的參數與設定
        • Templates/deployment.yaml : 吃Values.yaml的參數並建立pods
        • Templates/Service.yaml : 吃Values.yaml的參數並建立Services
        • Templates/Ingress.yaml : 吃Values.yaml的參數並建立ingress
  • 修改template的內容 [下一頁]
  • 使用Helm快速布置腳本
    • Helm install [Chart Name] [擺放設定檔的資料夾]

#Kubernetes Helm build

  • 檢查運行成功與否 :
    • Kubectl get all
    • 開啟服務測試
      https://ithelp.ithome.com.tw/upload/images/20210705/20139199X8fNNEqmxE.png
  • yamlFile [Value.yaml]
replicaCount: 2

image: 
  repository: hcwxd/blue-whale

service: 
  type: NodePort
  port: 80

ingress: 
  enabled: true
  hosts:  
   - host: blue.demo.com 
     paths: [/]

serviceAccount: 
  create: false
autoscaling: 
  enabled: false
  • yamlFile [Deployment.yaml]
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "demo.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    metadata:
      labels: 
        app: {{ include "demo.fullname" . }}  
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: '{{ .Values.image.repository }}‘
          ports:       - containerPort: 3000
    selector:
      matchLabels:
        app: {{ include "demo.fullname" . }}
  • yamlFile [Service.yaml]
apiVersion: v1
kind: Service
metadata:
  name: {{ include "demo.fullname" . }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: 3000
      protocol: TCP
  selector:
    app: {{ include "demo.fullname" . }}
  • yamlFile [Ingress.yaml]
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "demo.fullname" . -}}

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web #{{ $fullName }}
spec:
  rules:
   {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
          {{- range .paths }}
           - backend:
             serviceName:
               test-demo #{{ $fullName }}
              servicePort: 80
          {{- end }}
   {{- end }}
{{- end }}

#Reference

https://github.com/HcwXd/kubernetes-tutorial


尚未有邦友留言

立即登入留言