--------------------------1.優勢---------------------------------
--------------------------2.四組基本概念---------------------
--------------------------3.核心元件---------------------------
--------------------------4.其他概念----------------------------
--------------------------5.基本命令----------------------------
--------------------------6.kubeadm操作及命令------------
最近在學k8s,整理了一些理論知識,剛入門學習理論比較難,理論比較枯燥,但建議都要記起來。真的很重要。
1.自動裝箱,水平擴充套件,自我修復。
2.服務發現和負載均衡
3.自動釋出(預設捲動釋出模式)和回滾
4.集中化設定管理和祕鑰管理
5.儲存編排
6.任務批次處理執行
。。。
●Pod/Pod控制器
●Name/Namespace
●Label/Label選擇器
●Service/Ingress
Pod
Pod是K8S裡能夠被執行的最小的邏輯單元(原子單元)
1個Pod裡面可以執行多個容器,它們共用UTS+NET+IPC名稱空間
可以把Pod理解成豌豆莢,而同一Pod內的每個容器是一顆顆豌豆
一個Pod裡執行多個容器,又叫:邊車(SideCar)模式
Pod控制器
●Pod控制器是Pod啟動的一種模式,用來保證在K8S裡啟動的Pod應始終按照人們的預期執行(副本數,生命週期,健康狀態檢查…)
●K8S內提供了眾多的Pod控制器,常用的有以下幾種:
Deployment
DaemonSet
ReplicaSet
StatefulSet
Job
Cronjob
Name
●由於K8S內部,使用「資源」來定義每一 種邏輯概念(功能)故每種」資源」,都應該有自己的 」名稱」。
●資源」有api版本( apiVersion )類別( kind )、後設資料( metadata )、定義清單( spec)、狀態( status )等設定資訊。
●"名稱」通常定義在「資源」的"後設資料」資訊裡。
Namespace
●隨著專案增多、人員增加、叢集規模的擴大,需要一種能夠隔離K8S內各種「資源」的方法,這就是名稱空間
●名稱空間可以理解為K8S內部的虛擬叢集組
●不同名稱空間內的「資源」 ,名稱可以相同,相同名稱空間內的同種"資源」,"名稱」 不能相同
●合理的使用K8S的名稱空間,使得叢集管理員能夠更好的對交付到K8S裡的服務進行分類管理和瀏覽
●K8S裡預設存在的名稱空間有: default、 kube-system、 kube-public
●查詢K8S裡特定「資源」要帶上相應的名稱空間
Label
●標籤是k8s特色的管理方式 ,便於分類管理資源物件。
●一個標籤可以對應多個資源,一個資源也可以有多個標籤,它們是多對多的關係。
●一個資源擁有多個標籤,可以實現不同維度的管理。
●標籤的組成: key=value與標籤類似的,還有一種"註解」( annotations )
Label選擇器
●給資源打上標籤後,可以使用標籤選擇器過濾指定的標籤
●標籤選擇器目前有兩個:基於等值關係(等於、不等於)和基於集合關係(屬於、不屬於、存在)
●許多資源支援內嵌標籤選擇器欄位
matchLabels
matchExpressions
Service
●在K8S的世界裡,雖然每個Pod都會被分配一個單獨的IP地址 ,但這個IP地址會隨著Pod的銷燬而消失
●Service (服務)就是用來解決這個問題的核心概念
●一個Service可以看作一 組提供相同服務的Pod的對外存取介面
●Service作用於哪些Pod是通過標籤選擇器來定義的
Service實現型別:
ClusterIP:提供一個叢集內部的虛擬IP地址以供Pod存取(預設模式)
NodePort:在Node上開啟一個埠以供外部存取
LoadBalancer:通過外部的負載均衡器來存取
ClusterIP是預設模式,LoadBalancer需要額外的模組來提供負載均衡
Ingress
●Ingress是K8S叢集裡 工作在OSI網路參考模型下,第7層的應用 ,對外暴露的介面
●Service只能進行L 4流量排程,表現形式是ip+port
●Ingress則可以排程不同業務域、不同URL存取路徑的業務流量
注(存取順序):Ingress --> service–>pod–>docker
1.設定儲存中心–>etcd服務
2.主控(master)節點
●kube-apiserver服務
●kube-controller-manager服務
●kube-scheduler服務
3.運算( node )節點
●kube-kubelet服務
●Kube-proxy服務
4.CLI使用者端
CLI使用者端
●kubectl
5.核心附件
●CNI網路外掛→flannel/calico
●服務發現用外掛→coredns
●服務暴露用外掛> traefik
●GUI管理外掛> Dashboard
Apiserver(k8s叢集的大腦)
●提供了叢集管理的RESTAPI介面(包括鑑權、資料校驗及叢集狀態變更)
●負責其他模組之間的資料互動,承擔通訊樞紐功能
●是資源配額控制的入口
●提供完備的叢集安全機制
controller-manager(控制器管理器)
由一系列控制器組成,通過apiserver監控整個叢集的狀態,並確保叢集處於預期的工作狀態
●Node Controller
●Deployment Controller
●Service Controller
●Volume Controller
●Endpoint Controller
●Garbage Controller
●Namespace Controller
●Job Controller
●Resource quta Controller
…
Scheduler(排程程式)(監控node資源的狀況)
●主要功能是接收排程pod到適合的運算節點上
●預算策略( predict )
●優選策略( priorities )
Kubelet(容器的搭起,銷燬等動作)(負責pod的生命週期,執行node上)(容器的守護行程)
●簡單地說, kubelet的主要功能就是定時從某個地方獲取節點上pod的期望狀態(執行什麼容器、執行的副本數量網路或者儲存如何設定等等) ,並呼叫對應的容器平臺介面達到這個狀態
●定時彙報當前節點的狀態給apiserver,以供排程的時候使用
●映象和容器的清理工作保證節點上映象不會佔滿磁碟空間,退出的容器不會佔用太多資源
kube-proxy(發現機制,執行在node上,最先用iptables做隔離,現在流行用ipvs,簡單的網路代理,和負載均衡器,更方便)
●是K8S在每個節點上執行網路代理, service資源的載體
●建立了pod網路和叢集網路的關係( clusterip- >podip )
●常用三種流量排程模式
●Userspace (廢棄)
●Iptables (廢棄)
●Ipvs(推薦)
●負責建立和刪除包括更新排程規則、通知apiserver自己的更新,或者從apiserver哪裡獲取其他kube-proxy的排程規則變化來更新自己的
Endpoint Controller 負責維護Service和Pod的對應關係
Kube-proxy負責service的實現,即實現了K8s內部從pod到Service和外部從node port到service的存取
注:Pod網路是kube-kubelet提供,不是直接由Kube-proxy提供
各元件的工作流程:
User(採用命令kubectl)—> API server(響應,排程不同的Schedule)—> Schedule(排程)—> Controller Manager(建立不同的資源)—> etcd(寫入狀態)—> 查詢叢集
(node哪個有資源,通過Schedule,到對應的node上建立pod)
RC(ReplicationController)
Kubelet需要管理大量的pod,而顯而易見的是通常情況下一個應用不會以單獨一個pod完成,比較常見的是使用大量的Pod組成一個簡單應用,管理這些大量的pod的一個方案RC
RC可以指定pod的副本數量,並且在其中有Pod故障時可以自動拉起新的pod,大大簡化了維護難度
目前建議採用ReplicaSet和Deployment代替RC
ReplicaSet副本控制器
確保pod的一定數量的分數(replica)在執行,如果超過這個數量,制器會殺死一些,如果少了,控制器會啟動一些。
用來解決pod的擴容和縮容問題。
新一代的RS,主要功能和RC一樣,維持pod的數量穩定,指定pod的執行位置,使用方法也相似,主要區別是更新了api,支援更多功能
RS不建議直接使用,而是用更上層的概念Deployment呼叫ReplicaSet
通常用於無狀態應用,與Deployments設定使用。
Deployments
提供官方的用於更新Pod和ReplicaSet的方法,Deployments用來定義您預期的應用狀態。
Deployments整合了上線部署,捲動升級,建立副本,暫停上線任務,恢復上線任務,回滾到以前某一版本(成功/穩定)的Deployments等功能
目前最常用的控制器就是Deployment,建立Deployment時也會建立ReplicaSet
Deployment可以管理一個或多個RS,並且通過RS來管理pod
注意:一個完整的應用一般都是多個Deployment構成
StatefulSets有狀態應用用於解決各個pod範例獨立生命週期管理,提供各個範例的啟動順序和唯一性
穩定,唯一的網路識別符號
穩定,持久儲存
有序的,優雅的部署和擴充套件
有序,優雅的刪除和終止
有序的自動捲動更新
DaemonSet能夠讓所有的node節點執行同一個Pod。(一般用來部署代理,如果收集紀錄檔的代理,可以通過DaemonSet快速的在node上部署同一個pod)
副本數的控制是通過RS去控制的,
Service
(相當於鎖定器,不會因為pod被銷燬而找不到後端資源,pod銷燬,Ip等資訊會改變) 定義了pods的邏輯集合和存取這個集合的策略,pods集合是通過定義service時提供的label選擇器完成的
Node管理機制
Container Runtime(容器) 歸Kubelet程序管理
Kubelet發現機制,如果發現容器掛了,Kubelet會通過API server 監控容器狀態,如果本身狀態為1,變成了0,它就會去把容器再拉起來
Format:Kubectl command -type name flags
常用Command:
create:(建立資源)
apply:(應用資源的設定變更,也可以代替create建立新的資源)
get:(檢視資源)
describe:(檢視資源的詳細描述)
delete:(刪除資源)
常用的flags包含-n=namespace,-o=wide(能看到宿主機)
預設namespace(default,kube-system)
檢視存在有哪些namespace
Kubectl get namespace
Kubectl get ns
檢視名稱空間中的存在的pod
Kubectl get pod –namespace=kube-system
Kubuctl get pod –n kube-system
執行一個Deployment
建立一個簡單的deployment
Kubectl create deployment mydep –image-nginx (mydep建立名稱,基於nginx映象)
檢視deployment的建立情況
Kubectl get deployment
回顯:
NAME READY UP-TO-DATE AVAILABLE AGE
mydep 1/1 1 1 2m3s
檢視pod跑在哪個節點上
Kubectl get pod –ndefault
從yaml檔案建立deployment
Kubectl create –f name.yaml
檢視建立結果
Kubectl get deployment
回顯:
NAME READY UP-TO-DATE AVAILABLE AGE
name 3/3 3 3 114s
create –f 指從某個檔案建立對應資源
可以apply代替create
主流用法,一個Pod裡邊只跑一個容器
kubeadm安裝kubenetes1.18.2
1.基礎環境:
設定本地DNS祕鑰登入(免密登入)
ssh-keygen ssh-copy-id root@192.168.0.99
設定node節點通過master能存取外網
參考我另一篇檔案「華為雲內網伺服器通過公網伺服器存取外網」
設定docker-ce yum倉庫
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2.解除安裝自帶老版本依賴
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
3.安裝docker-ce
yum install docker-ce docker-ce-cli containerd.io
啟動docker
systemctl start docker
systemctl enable docker
設定docker加速器
vim /etc/docker/daemon.json
{
"registry-mirrors" : ["https://registry.docker-cn.com"]
}
4.k8s倉庫取得阿里雲映象
cat /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enable=1
yum install kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2
設定docker的service檔案,新增環境變數,讓它幫我們代理存取k8s來拉取映象
vim /usr/lib/systemd/system/docker.service
...
[Service]
Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
Environment="NO_PROXY=127.0.0.0/8,192.168.0.0/24"
...
改了service檔案,需要重新載入一下
systemctl daemon-reload
systemctl restart docker
docker info
檢視iptables內生的橋接相關功能,預設開啟。
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
1
[root@master ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables
1
修改組態檔
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
KUBE_PROXY=MODE=ipvs ##指明kube_proxy使用ipvs模式
systemctl enable kubelet.service
kubeadm init --kubernetes-version=v1.18.2 --pod-network-cidr=10.10.10.0/24 --service-cidr=172.7.0.0/24 --ignore-preflight-errors=Swap
(這可能跟「科學上網」有關,由於kubeadm
預設從官網k8s.grc.io下載所需映象,而國內無法存取。因此需要把上面在docker的service檔案中設定的代理註釋或刪除掉,同時需要通過–image-repository指定阿里雲鏡>像倉庫地址)
下面這個指定了阿里雲映象倉庫地址:
kubeadm init --kubernetes-version=v1.18.2 --pod-network-cidr=10.10.10.0/24 --service-cidr=172.7.0.0/24 --ignore-preflight-errors=Swap --image-repository registry.aliyuncs.com/google_containers
–pod-network-cidr string
指明 pod 網路可以使用的 IP 地址段。如果設定了這個引數,控制平面將會為每一個節點自動分配 CIDRs。
–service-cidr string
預設值:「10.96.0.0/12」 為服務的虛擬 IP 地址另外指定 IP 地址段
kubeadm join 192.168.0.102:6443 --token 4orxq1.exesrgh7hkgce60o \
--discovery-token-ca-cert-hash sha256:20fb6b286380ccd8ec6c82fd03f790b9c4df7fb3dbfabb7bc2f83f4755e543e7
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
驗證
docker image ls ## 檢視映象
ss -ntl | grep 6443 ## kube-apiserver的埠
kubectl get cs ##查詢元件狀態
kubectl get nodes ##查詢叢集節點 (因為還沒有部署好flannel,所以節點顯示為NotReady)
kubectl get ns ##檢視名稱空間
部署網路外掛
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
docker image ls |grep flannel ##會看到下載好的flannel的映象
kubectl get nodes ##master 節點已經Ready
kubectl get pods -n kube-system |grep flannel ##kube-system名稱空間下flannel外掛
節點部署
kubeadm join 192.168.0.102:6443 --token 4orxq1.exesrgh7hkgce60o \
--discovery-token-ca-cert-hash sha256:20fb6b286380ccd8ec6c82fd03f790b9c4df7fb3dbfabb7bc2f83f4755e543e7
###node節點會自動拉取kube-proxy、flannel、pause映象
kubectl get node
kubectl get image ls