kubernetes基礎概念入門

Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.

k8s是一個開源的雲操作系統,能夠用來自動化部署,擴縮容和管理我們的容器應用,簡單來說,就是提供了容器編排和管理功能的系統

架構圖

u_325710987,885711381_fm_26_gp_0.jpg

Master:

  • ApiServer:提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;
  • Scheduler:負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;
  • Controller-Manager:負責維護集羣的狀態,比如故障檢測、自動擴展、滾動更新等;
  • ETCD:保存了整個集羣的所有信息;

node:

  • Kubelet :負責維護容器的生命週期,同時也負責Volume(CVI)和網絡(CNI)的管理;
  • docker:負責鏡像管理以及Pod和容器的真正運行(CRI);
  • kubeproxy:負責爲Service提供cluster內部的服務發現和負載均衡;

核心附件:

  • CoreDNS:負責爲整個集羣提供DNS服務
  • Dashboard:提供一個簡單的GUI界面來查看集羣信息和操作集羣
  • Ingress:爲服務提供外網入口,提供域名訪問服務功能
  • Flannel:爲集羣之間提供網絡連接服務,分配pod和serviceIP功能

基本概念

  1. 容器:一種輕量級、可移植、自包含的軟件打包技術

  2. Master:爲用戶可和服暴露API,以最優方式調度工作負載,編排其他組件

  3. Pod: k8s最小調度單位,封裝了一個或者多個容器的資源對象,Pod內所有容器共享命名空間和存儲資源,類比豌豆莢

  4. 資源標籤:一個鍵值型(key/value)數據,辨別pod的屬性,或者幫助Scheduler來進行調度

  5. 標籤選擇器: Lable Selector,根據標籤過濾符合條件的資源對象

  6. namespace:資源對象的隔離,Service、Deployment、Pod

  7. Volume:存儲卷,獨立於容器文件系統的存儲空間,爲容器提供持久存儲能力

  8. Pod控制器:用戶不會直接部署管理pod,藉助另一個抽象的工具【控制器(control) 】進行管理,保證副本數量達到預期

以下是Control的類型和功能列表

類型 功能 備註
ReplicationController 保證Pod的副本數達到預期 幾乎廢棄
ReplicaSet 新一代RC,支持基於集合的標籤選擇器 新一代控制器
Deployment 是最常用的管理無狀態的pod,構建於RS之上 支持基於集合( set-based )的標籤選擇器,以及它的滾動更新( Rolling-Update )機制,區別於RS的地方
StatefulSet 有狀態的持久化應用,如database,爲每個Pod創建獨特標識,確保Pod間順序性
DaemonSet 用於確保每個節點都運行某Pod的一個副本,新增節點也會被添加此類Pod,用於運行集羣存儲守護進程,如ceph和glusterd,日誌收集進程fluentd、logstash以及監控進程,prometheus的Node Exporter等
Job 運行完成後可終止的應用,如批處理作業任務
  1. 命名空間

作用:資源配額的隔離:CPU、Memory

kubectl get namespace
NAME              STATUS   AGE
default           Active   28d
kube-public       Active   28d
kube-system       Active   28d

創建一個命名空間

$ cat namesapce-dev.yaml 
apiVersion: v1 
kind: Namespace 
metadata:  
  name: dev 

$ kubectl create -f namesapce-dev.yaml

簡單命令創建

kubectl create ns dev

kubectl get all -n kube-system    #查看一個命名空間下所有的內容

注意:不同命名空間下SvcIP、PodIP是可以訪問的,是對名字的隔離

k8s服務、網絡、存儲概念

Service概念

​ Service 是建立在一組Pod 對象之上的資源抽象,它通過標籤選擇器選定一組Pod 對象,併爲這組Pod 對象定義一個統一的固定訪問入口(通常是一個IP 地址),若K8s 集羣存在DNS 附件,它就會在Service 創建時爲其自動配置一個DNS 名稱以便客戶端進行服務發現。到達Service IP 的請求將被負載均衡至其後的端點一一各個Pod 對象之上,Service從本質上來講是一個四層代理服務。另外,Service 還可以將集羣外部流量引入到集羣中來。

Service類型

  • 第一種是僅用於集羣內部通信的ClusterIP類型;

  • 第二種是接入集羣外部請求的NodePort 類型它工作於每個節點的主機IP 之上;

  • 第三種是LoadBalancer 類型,可以把外部請求負載均衡至多個Node 的主機IP 的NodePort 之上

    此三種類型中,每一種都以其前一種爲基礎才能實現,而且第三種類型中的LoadBalancer 需要協同集羣外部的組件才能實現,此外部組件並不接受Kubemetes的管理。

  • 第四種是ExternalName,通過將Service映射由ExternalName字段的內容指定的主機名來暴露服務

Service IP 是一種虛擬IP ,也稱爲Cluster IP ,它專用於集羣內通信,通常使用專用的地址段,如“ 10.96.0.0/12 ”網絡 PodIP常用: 10.244.0.0/16

Ingress:Pod和service都只能在集羣內部通信,Ingress可以實現HTTPS(七層)負載均衡,實現和集羣外部通信,本身是一組路由規則的集合,其控制器主要使用Nginx,或者haproxy

HostPort和NodePort的區別:NodetPort是通過所有節點暴露容器服務,而HostPort由Pod對象所在的節點IP地址來暴露

k8s集羣的網絡

目的:

所有Pod之間不需要經過NAT直接通信,都在一個扁平的網絡空間內

所有集羣內節點可不經過NAT機制直接和所有容器進行通信

分類:

  1. 各主機自身的網絡,地址配置於主機網絡接口,配置於k8s集羣構建之前,不能由k8s管理

  2. k8s集羣專用於pod資源對象的虛擬網絡,配置在Pod的容器接口上,爲Pod設定IP和網絡,藉助於CNI插件實現,可部署k8s集羣之外或者託管在集羣上,需要在構建集羣有管理員定義

  3. 專用於service資源對象的虛擬網絡,不配置在任何主機或者容器的網絡接口,通過node的kube-proxy配置爲iptables或者ipvs規則,網絡在集羣創建時指定

Kubernetes 資源對象

類型 說明
工作負載( Workload ) 通常稱爲pod 控制器,主要分爲有狀態、無狀態
發現和負載均衡( Discovery & LB ) Ingress(七層負載均衡)
配置和存儲( Config & Storage ) 掛載外部存儲卷
集羣( Cluster )資源 Node、Role、ClusterRole、RoleBinding、 ClusterRoleBinding
元數據( Metadata ) 具有kind 、apiVersion 、metadata 、spec 和status 五個一級宇段

資源類型( resource type )是指在URL 中使用的名稱,如Pod 、Namespace 和Service等,其URL 格式爲“ GROUPNERSION度ESOURCE ”,如apps/v1/deployment 。

  • apiVersion 版本號,例如 v1

  • kind 代表着資源對象所屬的類 Pod/Deployment/Service/Namespace

  • metadata 字段爲資源提供元數據信息,如名稱、隸屬的名稱空間和標籤等;

  • spec 則用於定義用戶期望的狀態,不同的資源類型,其狀態的意義也各有不同

  • status 則記錄着活動對象的當前狀態信息,它由Kubemetes 系統自行維護,對用戶來說爲只讀字段

如果是YAML 格式的清單文件,多個資源彼此之間要使用—

單獨的一行進行資源分割,這樣,多個資源就將以清單文件中定義的次序被create 、apply等子命令調用

kubectl api-versions 查看現有api的版本

kubectl常用命令

kubectl 的命令分類:

類型 命令
陳述式命令( imperative command ) run , expose 、delete 和get 等命令
陳述式對象配置( imperative object configuration ) create 、delete 、get 、describe和replace
聲明式對象配置( declarative object config uration ) apply

kubectl命令1.png

kubectl命令2.png

kubectl命令3.png

1、創建一個nginx的deployment
$ kubectl run nginx-deploy --image=nginx:1.12 --port=80 --replicas=2

2、對nginx-deploy進行擴縮容
$ kubectl scale deploy/nginx-deploy --replicas=3

3、對nginx-deploy進行服務端口暴露,通過Service的8080端口轉發至容器的80端口上
$ kubectl expose deployment nginx-deploy --port=8080 --target-port=80

4、將nginx-deploy暴露爲NortPort
$ kubectl expose deployment nginx-deploy --type="NodePort" --port=80 --name=my_nginx_web

5、打印容器日誌
$ kubectl logs coredns-7b47bbb54c-q6dkr -n kube-system -f
.:53
[INFO] plugin/reload: Running configuration MD5 = 1588bb3af386f386c40674040e2b3399
   ______                ____  _   _______
  / ____/___  ________  / __ \/ | / / ___/      ~ CoreDNS-1.6.3
 / /   / __ \/ ___/ _ \/ / / /  |/ /\__ \       ~ linux/amd64, go1.12.9, 37b9550
/ /___/ /_/ / /  /  __/ /_/ / /|  /___/ /
\____/\____/_/   \___/_____/_/ |_//____/

-f 用於持續監控指定容器中的日誌輸出,類似於tail -f

6、進入容器執行命令
格式: kubectl exec -it <Pod-name> /bin/bash  
#進入容器,如果一個pod裏面有多個容器加 -c <container name> 指定容器
$ kubectl exec -it nginx-deploy-64c7978669-2x5xz -n kube-system /bin/bash

7、刪除某個命名空間所有pod
$ kubectl delete pods --all -n kube-public

8、查看版本
$ kubectl version --short       #查看版本,也可以使用kubectl get node查看

Client Version: v1.15.0 
Server Version: v1.15.0

9、運行一個測試容器
$ kubectl run client --image=busybox --restart=Never -it -- /bin/sh

10、命令的測試運行,選項--dry-run
$ kubectl run nginx-deploy --image=nginx:1.12 --port=80 --replicas=2 --dry-run

11、給指定節點打標籤
$ kubectl label nodes master disktype=ssd
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章