01 引子
鴿了好久了,終於又一次克服了拖延症,決心寫點啥,起因也是因為最近剛好重做了系統,把win10從home版升級到了專業版,可以愉快的安裝docker destop 而不需要藉助 docker toolbox了。 這個使用體驗的提升真的是很不錯。無論是配置,還是執行容器的視覺化,還是一些輔助工具,真的友好了很多,降低了使用門檻。
02 Kubernetes
k8s 這個名字,起源於古希臘,是舵手的意思,所以它的 logo 即像一張漁網又像一個羅盤,谷歌選擇這個名字還有一個深意:既然docker把自己比作一隻鯨魚,馱著集裝箱,在大海上遨遊,google 就要用Kubernetes去掌握大航海時代的話語權,去捕獲和指引著這條鯨魚按照主人設定的路線去巡遊。
K8s將叢集中的機器劃分為一個Master節點和一群工作節點Node。Master節點上執行著叢集管理相關的一組程序kube-apiserver、kube-controller-manager和kube-scheduler。這些程序自動化實現了整個叢集的資源管理、Pod排程、彈性伸縮、安全控制、系統監控和糾錯等管理功能。
上圖可以看到如下元件,使用特別的圖標表示Service和Label:
Kubernetes Master(Kubernetes主節點)Node(節點)PodContainer(容器)Label(label)(標籤)Replication Controller(複製控制器)Service(enter image description here)(服務)Kubernetes Master
Master指的是叢集控制節點。每個K8s叢集裡需要有一個Ms節點負責整個叢集的管理和控制。Kubernetes Master提供叢集的獨特視角,並且擁有一系列元件。
Kubernetes API Server(kube-apiserver),侍衛大統領!提供HTTP Rest介面的關鍵服務程序,是K8s裡所有資源的增刪改查等操作的唯一入口,也是叢集控制的入口程序。API Server提供可以用來和叢集互動的Rest端點。Kubernetes Controller Master(kube-controller-manager)掌印大太監,大總管!K8s裡所有資源物件的自動化控制中心。Kubernetes Scheduler(kube-scheduler),御馬間的排程室!負責資源排程(Pod排程)的程序。建立和複製Pod的Replication ControllerNode
節點(上圖橘色方框)是物理或者虛擬機器器,作為Kubernetes worker,通常稱為Minion。每個節點都執行如下Kubernetes關鍵元件。
(1) Kubelet:與Master節點協作,是主節點的代理,負責Pod對應容器的建立,啟動,停止等任務。預設情況下Kubelet會向Master註冊自己。Kubelet定期向主機點彙報加入叢集的Node的各類資訊。
(2) Kube-proxy:Kubernetes Service使用其將連結路由到Pod,作為外部負載均衡器使用,在一定數量的Pod之間均衡流量。比如,對於負載均衡Web流量很有用。
(3) Docker或Rocket:Kubernetes使用的容器技術來建立容器。
Pod
Pod是K8s最重要也是最基礎的概念!每個Pod都有一個特殊的被稱為“根容器”的Pause容器,此容器與引入業務無關並且不易死亡。且以它的狀態代表整個容器組的狀態!Pause容器對應的映象屬於K8s平臺的一部分,除了Pause容器,每個Pod還包含一個或多個使用者業務容器。Pod其實有兩種型別:普通的Pod及靜態Pod(static Pod),static Pod並不存放在Kubemetes的eted儲存裡,而是存放在某個具體的Node上的一個具體檔案中,並且只在此Node上啟動執行。而普通的Pod一旦被建立,就會被放入到etcd中儲存,確後會被KubernetesMaster排程到某個具體的Node上並進行繫結(Binding),隨後該Pod被對應的Node上的kubelet程序例項化成一組相關的Docker容器並啟動起來。在預設情況下,當Pod裡的某個容器停止時,Kubemetes會自動檢測到這個問題並且重新啟動這個Pod(重啟Podel)的所有容器),如果Pod所在的Node完機,則會將這個Node上的所有Pod重新排程到其他節點上。Pod(上圖綠色方框)安排在節點上,包含一組容器和卷。同一個Pod裡的容器共享同一個網路名稱空間,可以使用localhost互相通訊。
Endpoint(Pod IP + ContainerPort) pod ip:一個Pod裡多個容器共享Pod IP地址。K8s要求底層網路支援叢集內任意兩個Pod之間的TCP/IP直接通訊,使用虛擬二層網路技術(Flannel(沒有接觸過 ),OpenvSwitch)實現。在Vmware中類似的二層交換技術是VSwitch,當然了,現在整個資料中心網路二層逐步從vSwitch—>OpenvSwitch
Lable
Lable類似Docker中的tag,一個是對“特殊”映象、容器、卷組等各種資源做標記,一個是attach到各種諸如Node、Pod、Server、RC資源物件上。不同的是Lable是一對鍵值對!Lable類似Tag,可使用K8s專有的標籤選擇器(Label Selector)進行組合查詢。
Replication Controller
Replication Controller,簡稱RC,她用來幹啥呢?就是通過她來實現Pod副本數量的自動控制!RC確保任意時間都有指定數量的Pod“副本”在執行。
如果為某個Pod建立了RC並且指定3個副本,它會建立3個Pod,並且持續監控它們。如果某個Pod不響應,那麼Replication Controller會替換它,保持總數為3。如果之前不響應的Pod恢復了,現在就有4個Pod了,那麼Replication Controller會將其中一個終止保持總數為3。如果在執行中將副本總數改為5,Replication Controller會立刻啟動2個新Pod,保證總數為5。還可以按照這樣的方式縮小Pod,這個特性在執行滾動升級時很有用。
注意:刪除RC,不會影響該RC已經建立好的Pod。在邏輯上Pod副本和RC是解耦和的!建立RC時,需要指定Pod模板(用來建立Pod副本的模板)和Label(RC需要監控的Pod標籤)。
Horizontal Pod Autoscaler,簡稱HPA,Pod橫向自動擴容智慧控制元件。與RC,Deployment一樣,也屬於K8s的一種資源物件。她的實現原理是通過追蹤分析RC控制的所有目標Pod的負載變化情況,來確定是否針對性地調整目標Pod的副本數。
Service
微服務架構中的一個“微服務”,她是正真的新娘,而之前的Pod,RC等資源物件其實都是嫁衣。
每個Pod都會被分配一個單獨的IP地址,而且每個Pod都提供了一個獨立的Endpoint(Pod lP + ContainerPort)以被客戶端訪問,現在多個Pod副本組成了一個叢集來提供服務,客戶端要想訪問叢集,一般的做法是部署一個負載均衡器(軟體或硬體),為這組Pod開啟一個對外的服務埠如8000埠,並且將這些Pod的Endpoint列表加入8000埠的轉發列表中,客戶端就可以通過負載均衡器的對外IP地址 + 服務埠來訪問此服務,而客戶端的請求最後會被轉發到哪個Pod,則由負載均衡器的演算法所決定。
K8s的server定義了一個服務的訪問入口地址,前端(Pod)通過入口地址訪問其背後的一組由Pod副本組成的叢集例項,service與其後端Pod副本叢集之間通過Label Selector 實現“無縫對接”。
03 Minikube
minikube相當於一個執行在本地的Kubernetes單節點,我們可以在裡面建立Pods來建立對應的服務。
Minikube is a tool that makes it easy to run Kubernetes locally. Minikube runs a single-node Kubernetes cluster inside a VM on your laptop for users looking to try out Kubernetes or develop with it day-to-day
04 安裝
說的安裝,還得奉勸大家提前沐浴更衣,調整好心態。倒不是因為步驟有多難,多複雜,而是因為某些網站因為技術不成熟,你始終訪問不到,而焦躁。關於minikube,一些網上人說使用阿里的包,可能福報廠確實拉了分支,改了拉取映象的地址,但是他們並沒有提供編譯好的版本,所以使用官方的版本就好。https://github.com/kubernetes/minikube 。
另外,一定要注意使用release版本(我用1.9.2版),別下測試版,為什麼這麼提醒?反正我沒有因為版本問題,卡了2天,demo都沒跑出來。
kubectl 也從官方下載 https://kubernetes.io/docs/tasks/tools/install-kubectl/ 即可。
將兩個檔案放到一個資料夾下,然後在環境變數裡path一下
安裝docker 不是主要矛盾,大家自行搜一下,只要確認好環境,再次強調最好升級一下win10,這樣操作起來更方便一些,docker toolbox用起來真的不行。
在正式安裝之前,還需要設定一個虛擬交換機
接下來,就是安裝k8s環境了,記得使用管理員Prowshell
minikube start --image-mirror-country=cn --registry-mirror=https://registry.docker-cn.com --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --hyperv-virtual-switch="minikubaSwitch"
引數說明:
天朝專用引數
--image-mirror-country=cn
國內docker registry
--registry-mirror=https://registry.docker-cn.com
國內映象源
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
外部交換機
--hyperv-virtual-switch="minikubaSwitch"
接下來就是漫長的等待,安裝成功後,會多出一個minikube的虛擬機器
重點來了啊,如果之前下載失敗了,到自己的使用者下面把這個.minikube資料夾刪除了,重新來一邊,如果還是不行,繼續刪了重來,不要問為什麼,問就是上網需要科學。
接下來就需要部署 deployment
PS E:\\devlop\\envs\\k8s\\test1> kubectl create -f 1.yml
deployment.apps/datalookerserver created
使用下面的 yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: datalookerserver
spec:
selector:
matchLabels:
app: datalookerserver
replicas: 2
template:
metadata:
labels:
app: datalookerserver
spec:
containers:
- name: datalookerserver
image: nginx
# nginx
#datalooker-server:1.0-SNAPSHOT
imagePullPolicy: Always
ports:
- containerPort: 80
這裡注意image屬性,還是使用公網的image,這樣比較容易通過,使用本地registry可能因為鏈路訪問問題,導致失敗,具體情況,可以非同步到參考連結【2】,裡面對這個問題有一個比較清楚的闡釋。
接下來,可以使用 kubectl get Pods -o wide 檢視pod狀態
使用, kubectl describe pod datalookerserver-56dbc49bc8-6sdms可以檢視具體pod的具體資訊
接下來使用相同的指令,建立service
PS E:\\devlop\\envs\\k8s\\test1> kubectl create -f 2.yml
service/datalookerserver created
yml如下:
apiVersion: v1
kind: Service
metadata:
name: datalookerserver
spec:
ports:
- port: 9999 # 服務埠
protocol: TCP
targetPort: 80 # 容器埠
selector:
app: datalookerserver # 標籤選擇器,這裡的app=web正是我們剛才建立app
使用 minikube dashboard 命令,可以開啟網頁來對單機叢集進行監控
現在,一個整體的簡單應用構建起來了,那麼我們如何訪問呢?
還需要將埠映射出來,我們才能訪問
kubectl port-forward svc/datalookerserver 9999:9999
測試一下OK了
參考連結:
[1] https://www.jianshu.com/p/f4c2104ba90a
[2] https://hasura.io/blog/sharing-a-local-registry-for-minikube-37c7240d0615/
[3] https://www.javaroad.cn/questions/304667
[4] https://www.jianshu.com/p/7cc5f727c225
[5] https://zhuanlan.zhihu.com/p/88236691