--------------------------1.優勢---------------------------------
--------------------------2.四組基本概念---------------------
--------------------------3.核心組件---------------------------
--------------------------4.其他概念----------------------------
--------------------------5.基本命令----------------------------
--------------------------6.kubeadm操作及命令------------
最近在學k8s,整理了一些理論知識,剛入門學習理論比較難,理論比較枯燥,但建議都要記起來,真的很重要,
1.優勢
1.自動裝箱,水平擴展,自我修復,
2.服務發現和負載均衡
3.自動發布(默認滾動發布模式)和回滾
4.集中化配置管理和秘鑰管理
5.存盤編排
6.任務批處理運行
,,,
2.四組基本概念
●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
3.核心組件
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)
4.其他概念
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,它就會去把容器再拉起來
5.基本命令
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里邊只跑一個容器
6.kubeadm涉及一些操作及命令
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/171883.html
標籤:其他
上一篇:Hadoop搭建完全分布式集群
