Contents

跟著黑哥學 Kubernetes

0-1 應用部署方式演變

0-2 kubernetes 介紹

本質是一組服務器集群,每個服務器都稱為一個節點,可以在每個節點中的容器安裝程序

0-3 kubernetes 組件

一個 k8s 集群分為控制節點master_node,工作節點worker_node構成,每個節點上都安裝不同的組件

Master: 集群的控制平面,負責集群的決策(管理)
  1. API Server:資源操作的唯一入口,接收用戶輸入的命令,提供認證、授權、API註冊和發現等機制 K8S 的整個訪問入口
  2. Scheduler:負責集群資源調度,按照預訂的調度策略將Pod調度到相應的node節點上 根據算法決定安裝nginx的請球要分配給哪一個node節點(負責算)
  3. ControllerManager:負責維護集群的狀態,比如程序部署安排、故障檢測、自動擴展、滾動更新等 如何將 nginx 安裝請求交給 node1節點(負責安排幹活)
  4. Etcd:負責存儲集群中各種資源對象的信息 用來紀錄請求信息儲存在資料庫中(也可以改用mysql)
Node: 集群的數據平面,負責為容器提供運行環境 [worker_node]
  1. Kubelet:負責維護容器的生命週期,即通過控制docker,來創建、更新、銷毀容器 接收控制節點發來的訊息,並傳送命令給 worker node 裡面其他的組件_docker

  2. KubeProxy:負責提供集群內部的服務發現和負載均衡

    訪問程序的入口

  3. Docker:負責節點上容器的各種操作

以部署一個 nginx 服務來說明 kubernetes 系統各個組件調用關係
  1. 首先要明確,一旦 kubernetes 環境啟動之後,master 和 node 都會將自身的信息存儲到 etcd 數據庫中
  2. 一個 nginx 服務的安裝請求會首先被發送到 master 節點的 apiServer 組件
  3. apiServer 組件會調用 scheduler 組件來決定到底應該把這個服務安裝到哪一個 node 節點上 此時,它會從 etcd 中讀取各個 node 節點的信息,然後按照一定的算法進行選擇,並將結果告知 apiServer
  4. apiServer 調用 controller_manager 去調度 Node 節點安裝 nginx 服務
  5. Kubelet 接收到指定之後,會通知 docker,然後由 docker 來啟動一個 nginx 的 pod pod 是 kubernetes 的最小操作單元,容器必須跑在 pod 中至此
  6. 一個 nginx 服務就運行了,如果需要訪問 nginx,就需要通過 kube-proxy 來對 pod 產生訪問的代理 這樣,外界用戶就可以訪問集群中的 nginx 服務了

0-4 kubernetes 概念

Master:集群控制節點,每個集群需要至少一個 master 節點負責集群的管控 安排工作的

Node:工作負載節點,由 master 分配容器到這些 node 工作節點上,然後 node 節點上的 docker 負責容器的運行 幹活的

Pod:kubernetes 的最小控制單元,容易都是運行在 pod 中的,一個 pod 中可以有 1個或著多個容器 程序跑在容器裡面,容器運行在 pod 裡面;一個 pod 裡面可以有多個容器

Controller:控制器,通過它來實現對 pod 的管理,比如啟動 pod、停止 pod、伸縮 pod 的數量等等 管理 pod 的工具。不僅僅是一種控制器,每種控制器都有適合的應用場景

Service:pod 對外服務的統一入口,下面可以維護者同一類的多的 pod

​ 配置 ipvs 功能 — 在 kubernetes 中,service 有兩種代理類型,一種是基於 iptables 的,一種是基於 ipvs 的,兩者比較的話,ipvs 的性能明顯要高一些,但是如果要使用它,需要手動載入 ipvs 模塊

Label:標籤,用於對 pod 進行分類,同一類 pod 的運行環境 e.g. app:tomcat -可以用來當選擇器的條件

標籤與選擇器的機制:標籤定義一批屬性,選擇器透過這些屬性把這些東西化成一類

NameSpace:命名空間,用來隔離 pod 的運行環境 在一個 k8s環境中,所有 pod 是可以相互訪問的,要限制可訪問性可以透過 nameSpace區分來達成


0-5 環境搭建_環境規劃

如何搭建 k8s 的集群環境

0-5-1 環境規劃

0-5-1-1 集群類型

Kubernetes 集群大體上分為兩類:一主多從和多主多從

  • 一主多從:一台Master節點和多台Node節點,搭建簡單,但是有單機故障風險,適合用於測試環境

    graph LR;
        Master1 --- Node1;
        Master1 --- Node2;
        Master1 --- Node3;
    
  • 多主多從:多台Master節點和多台Node節點,搭建麻煩,安全性高,適合用於生產環境

    [Master1]---┬---[Node1]
                |
    [Master2]---┼---[Node2]
                |
    [Master3]---┴---[Node3]
    
0-5-1-2 安裝方式

kubernetes 有多種部署方式,目前主流有 kubeadm、minikube、二進制包

  • minikube:一個用於快速搭建單節點kubenetes的工具
  • kubeadm:一個用於快速搭建kubenetes集群的工具
  • 二進制包:從官網下載每個組件的二進制包,依次去安裝,此方式對於理解kubenetes組件更加有效
0-5-1-3 主機規劃
作用 IP地址 操作系統 配置
Master 192.168.109.100 Centos7.5 基礎設施服務器 2顆CPU 2G內存 50G硬盤
Node1 192.168.109.101 Centos7.5 基礎設施服務器 2顆CPU 2G內存 50G硬盤
Node2 192.168.109.102 Centos7.5 基礎設施服務器 2顆CPU 2G內存 50G硬盤

0-6 環境搭建_主機安裝

需要安裝三台 Centos 服務器(一主二從),然後在每台服務器中分別安裝 docker (18.06.3),kubeadm (1.17.4), kubelet (1.17.4), kubectl (1.17.4) 程序

0-6-1 主機安裝

pass practice

0-7 環境搭建_環境初始化

Vmware 起三個 VM, master *1, worker *2

0-8 環境搭建_集群所需組建安裝

0-9 環境搭建_集群安裝

0-10 環境搭建_網路插件安裝

0-11 環境搭建_環境測試

0-12 資源管理介紹

0-13 yaml 語言介紹

YAML是一個類似XML、JSON的標記性語言,他強調以數據為中心,並不是以標記語言為重點,因而YAML本身的定義比較簡單,號稱一種人性化的數據格式語言

Xml太麻煩了,要以對象的嵌套表示

````xml
<heißenburg>
    <age>23</age>
    <address>Tainan</address>
</heißenburg>
````
1
2
3
heißenburg:
  age: 15
  address: Tainan
Note
  1. 書寫yaml切記: 後面要加一個空格

  2. 如果需要將多段yaml配置放在一個文件中,中間要使用 --- 分隔

  3. 下面是一個 yaml 轉 json 的網站,可以通過它驗證 yaml 是否書寫正確

    https://www.json2yaml.com/convert-yaml-to-json

YAML 的語法比較簡單,主要有下面幾個:

  • 大小寫敏感
  • 使用縮進 (縮排, indentation) 表示層級關係
  • 縮排 (indentation) 不允許使用 tab,只允許空格 只對低版本的 yaml 有限制,高版本也可以用 tab 鍵
  • 縮排的空格數不重要,只要相同層級的元素左對齊即可
  • #表示註解

YAML 支持以下幾種數據類型:

  • 純量:單個的、不可再分的值

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    # 純量:一個簡單的值、字符串、布林值、整數、浮點數、null、時間、日期
    # 1 布林類型
    c1: true 
    c11: True
    # 2 整數型
    c2: 234
    # 3 浮點數型
    c3: 3.14
    # 4 null類型
    c4: ~    # 使用~表示null
    # 5 日期類型
    c5: 2017-02-16    # 日期使用ISO 8601格式,即yyyy-MM-dd
    # 6 時間類型
    c6: 2017-02-16T19:02:23+03:00    
        # 時間使用ISO 8601格式,時間和日期之間使用T連接,最後使用+代表時區
    # 7 字符串類型
    c7: heißenburg  # 簡單寫法,直接寫值,如果字符串中間有特殊字符,必須使用雙引號或者單引號包裹
    c71: 'heißenburg honey'
    c8: hima
        laya
        yosemite    # 字符串過多的情況可以拆成多行,
    
  • 對象:鍵值對的組合,又稱為映射 (mapping) / 哈希 (hash) / 字典 (dictionary)

    1
    2
    3
    4
    5
    6
    
    {
      "jingle": {
        "age": 23,
        "account": "yoroshiku"
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    
    # 對象
    # 形式一 (推薦)
    jingle:
      age: 23
      account: yoroshiku
    # 形式二 (了解)
    ingrid: {age: 26,account: sesamestreet}
    
  • 數組:一組按次序排列的值,又稱為序列 (sequence) / 列表 (list)

    1
    2
    3
    4
    5
    6
    
    {
      "morality": [
        "禮義",
        "廉恥"
      ]
    }
    
    1
    2
    3
    4
    5
    6
    7
    
    # 數組
    # 形式一(推薦)
    morality:
      - 禮義
      - 廉恥
    # 形式二(了解)
    morality: [禮義,廉恥]
    

0-14 資源管理方式_介紹

  • 命令式對象管理:直接使用命令去操作 kubernetes 資源 單純查詢,不做修改的時候,通常會使用命令式對象管理

    kubectl run nginx-pod --image=nginx:1.17.1 --port=80

  • 命令式對象配置:通過命令配置和配置文件去操作 kubernetes 資源

    kubectl create/patch -f nginx-pod.yaml

  • 聲明式對象配置:通過 apply 命令和配置文件去操作 kubernetes 資源 可以把10個yaml檔案存在一個目錄,再對目錄執行更新操作

    kubectl apply -f nginx-pod.yaml apply - 用於創建和更新資源(有就更新,沒有就創建)

類型 操作對象 適用環境 優點 缺點
命令式對象管理 對象 測試 簡單 只能操作活動對象,無法審計、跟蹤
命令式對象配置 文件 開發 可以審計、跟蹤 項目大時,配置文件多,操作麻煩
聲明式對象配置 目錄 開發 支持目錄操作 意外情況下難以調試

0-15 資源管理方式_1

kubectl 命令

​ kubectl是Kubenetes集群的命令行工具,通過它能夠對集群本身進行管理,並能夠在集群上進行容器化應用的安裝部署,kubectl命令的語法如下:

kubectl [command] [type] [name] [flags]
  • command 指定要對資源執行的操作,例如 create、get、delete [必填]
  • type 指定資源類型,比如 deployment、pod、service [必填]
  • name 指定資源的名稱,名稱大小寫敏感 [可選]
  • flags 指定額外的可選擇參數 [可選]
# 查看所有 pod
kubectl get pod

# 查看某個 pod
kubectl get pod pod_name

# 查看某個 pod,以 yaml 格式展示結果
kubectl get pod pod_name -o yaml
kubectl get pod nginx-pod-697786dc74-bsdbr -o json  # 以json格式展示成果
常用的 command 們
命令分類 命令 命令作用
基本命令 create 創建 一個資源
- edit 編輯 一個資源 [修改]
- get 獲取 一個資源
- patch 更新 一個資源 [打補丁更新]
- delete 刪除 一個資源
- explain 解釋 . 展示資源文檔
運行和調試 run 運行 . 在集群中運行一個指定的鏡像
- expose 暴露 資源為 Service
- describe 描述 . 顯示資源內部信息例如IP為何、容器的鏡像、ID、啟動中經過的歷程
- logs 輸出容器在 pod 中的日誌
- attach 進入運行中的容器
- exec 執行 . 執行容器中的一個指令
- cp 複製 . 在Pod內外複製文件
- rollout 首次展示 . 管理資源的發布
- scale 規模化 . 擴 (縮) 容Pod的數量
- autoscale 自動調整 Pod的數量
高級命令 apply 通過文件對資源進行配置
- label 標籤 . 更新資源上的標籤
其他命令 cluster-info 集群信息 . 顯示集群信息
- version 版本 . 顯示當前 Service 和 Client 的版本
常用的資源類型

Kubenetes 中所有的內容都抽象為資源,可以通過命令進行查看

1
kubectl api-resources
資源分類 資源名稱 縮寫 資源作用
集群級別資源 nodes no 集群組成部分
— namespaces ns 隔離pod
pod 資源 pods po 裝載容器
Pod 資源控制器 replicationcontrollers rc 控制pod資源
— replicasets rs 控制pod資源
— deployments deploy 控制pod資源
— daemonsets ds 控制pod資源
— jobs 控制pod資源
— cronjobs cj 控制pod資源
— horizontalpodautoscalers hpa 控制pod資源
服務器發現資源 services svc 統一pod對外接口
— ingress ing 統一pod對外接口
存儲資源 volumeattachments 存儲
— persistentvolumes pv 存儲
— persistentvolumeclaims pvc 存儲
配置資源 configmaps cm 配置
— secrets 配置
命令式對象管理 操作案例 (Demo)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 創建一個namespace
[root@master ~] kubectl create namespace dev
namespace/dev created

# 獲取namespace
[root@master ~] kubectl get ns
NAME							STATUS	AGE
default						Active	21h
dev								Active	21s
kube-node-lease		Active	21h
kube-public				Active	21h
kube-system				Active	21h

# 在此namespace下創建並運行一個nginx的pod
[root@master ~] kubectl run pod --image=nginx -n dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/pod created

# 查看新創建的pod
 [root@master ~] kubectl get pod -n dev
delete pod pod_name -n dev 
# 刪了之後 k8s 會自動 deploy 新的 pod, 要刪整個 namespace dev 才行(...略)

0-16 資源管理方式_2

命令式對象配置
  1. 建立一個 nginxpod.yaml

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    apiVersion: v1
    kind: Namespace
    metadata:
      name: dev
    
    ---
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginxpod
      namespace: dev
    spec:
      containers:
      - name: nginx-containers
        image: nginx:1.17.1
    
  2. 執行 create command,創建資源

    1
    2
    3
    
    [root@master ~] kubectl create -f nginxpod.yaml
    namespace/dev created
    pod/nginxpod created
    

0-17 資源管理方式_3

0-18 資源管理方式_結語

1-1 實戰入門_Namespace

1-2 實戰入門_Pod

1-3 實戰入門_Label

1-4 實戰入門_Deployment

1-5 實戰入門_Service

1-6 Pod解析_結構和定義

1-7 Pod解析_基本配置

1-8 Pod解析_鏡像拉取策略

1-9 Pod解析_啟動命令

1-10 Pod解析_環境變量

1-11 Pod解析_端口設置

1-12 Pod解析_資源配額

2-1 Pod解析_生命週期 _概述

2-2 Pod解析_生命週期 _創建和終止

2-3 Pod解析_生命週期 _初始化容器

2-4 Pod解析_生命週期 _鉤子函數

2-5 Pod解析_生命週期 _容器探測

2-6 Pod解析_生命週期 _容器探測補充

2-7 Pod解析_生命週期 _重啟策略

2-8 Pod解析_調度 _概述

2-9 Pod解析_定向調度

2-10 Pod解析_親和性調度 _概述

2-11 Pod解析_親和性調度 _nodeAffinity

2-12 Pod解析_親和性調度 _podAffinity

2-13 Pod解析_親和性調度 _podAntiAffinity

2-14 Pod解析_調度 _污點

2-15 Pod解析_調度 _容忍

3-1 Pod 控制器_概述

3-2 Pod 控制器_ReplicaSet

3-3 Pod 控制器_Deployment _基礎

3-4 Pod 控制器_Deployment _擴容器

3-5 Pod 控制器_Deployment _升級策略

3-6 Pod 控制器_Deployment _版本回退

3-7 Pod 控制器_Deployment _金絲雀發布

3-8 Pod 控制器_HPA (上)

3-9 Pod 控制器_HPA (下)

3-10 Pod 控制器_DaemonSet

3-11 Pod 控制器_Job

3-12 Pod 控制器_CronJob

3-13 Service_概述

3-14 Service_資源清單文件介紹

3-15 Service_實驗 _環境準備

3-16 Service_實驗 _ClusterIP 類型

3-17 Service_實驗 _HeadLines 類型

3-18 Service_實驗 _NodePort 類型

3-19 Service_實驗 LoadBalancer 類型

3-20 Service_實驗 ExternalName 類型

4-1 Ingress 介紹

4-2 Ingress案例_環境準備

4-3 Ingress案例_http代理

4-4 Ingress案例_http代理

4-5 數據存儲介紹

4-6 基本存儲_EmptyDir

4-7 基本存儲_HostPath

4-8 基本存儲_NFS

4-9 高級存儲_pv和pvc的介紹

4-10 高級存儲_pv

4-11 高級存儲_pvc

4-12 高級存儲_pv和pvc的生命週期

4-13 配置存儲_configmap

4-14 配置存儲_secret

4-15 安全認證_概述

4-16 安全認證_認證方式

4-17 安全認證_授權管理

4-18 安全認證_進入控制

4-19 DashBoard_部署

4-20 DashBoard_使用演示

comments powered by Disqus