Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.
k8s是一個開源的雲操作系統,能夠用來自動化部署,擴縮容和管理我們的容器應用,簡單來說,就是提供了容器編排和管理功能的系統
架構圖
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功能
基本概念
-
容器:一種輕量級、可移植、自包含的軟件打包技術
-
Master:爲用戶可和服暴露API,以最優方式調度工作負載,編排其他組件
-
Pod: k8s最小調度單位,封裝了一個或者多個容器的資源對象,Pod內所有容器共享命名空間和存儲資源,類比豌豆莢
-
資源標籤:一個鍵值型(key/value)數據,辨別pod的屬性,或者幫助Scheduler來進行調度
-
標籤選擇器: Lable Selector,根據標籤過濾符合條件的資源對象
-
namespace:資源對象的隔離,Service、Deployment、Pod
-
Volume:存儲卷,獨立於容器文件系統的存儲空間,爲容器提供持久存儲能力
-
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 | 運行完成後可終止的應用,如批處理作業任務 |
- 命名空間
作用:資源配額的隔離: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機制直接和所有容器進行通信
分類:
-
各主機自身的網絡,地址配置於主機網絡接口,配置於k8s集羣構建之前,不能由k8s管理
-
k8s集羣專用於pod資源對象的虛擬網絡,配置在Pod的容器接口上,爲Pod設定IP和網絡,藉助於CNI插件實現,可部署k8s集羣之外或者託管在集羣上,需要在構建集羣有管理員定義
-
專用於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 |
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