基於Win10單機部署kubernetes應用

基於Win10單機部署kubernetes應用


01 引子

鴿了好久了,終於又一次克服了拖延症,決心寫點啥,起因也是因為最近剛好重做了系統,把win10從home版升級到了專業版,可以愉快的安裝docker destop 而不需要藉助 docker toolbox了。 這個使用體驗的提升真的是很不錯。無論是配置,還是運行容器的可視化,還是一些輔助工具,真的友好了很多,降低了使用門檻。

基於Win10單機部署kubernetes應用


基於Win10單機部署kubernetes應用


02 Kubernetes

k8s 這個名字,起源於古希臘,是舵手的意思,所以它的 logo 即像一張漁網又像一個羅盤,谷歌選擇這個名字還有一個深意:既然docker把自己比作一隻鯨魚,馱著集裝箱,在大海上遨遊,google 就要用Kubernetes去掌握大航海時代的話語權,去捕獲和指引著這條鯨魚按照主人設定的路線去巡遊。

K8s將集群中的機器劃分為一個Master節點和一群工作節點Node。Master節點上運行著集群管理相關的一組進程kube-apiserver、kube-controller-manager和kube-scheduler。這些進程自動化實現了整個集群的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理功能。

基於Win10單機部署kubernetes應用


上圖可以看到如下組件,使用特別的圖標表示Service和Label:

  • Kubernetes Master(Kubernetes主節點)
  • Node(節點)
  • Pod
  • Container(容器)
  • 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 Controller

Node

節點(上圖橘色方框)是物理或者虛擬機器,作為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互相通信。

基於Win10單機部署kubernetes應用


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標籤)。

由Replication Controller衍生出Deployment,與RC相似90%,目的是更好地解決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,則由負載均衡器的算法所決定。

基於Win10單機部署kubernetes應用


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一下

基於Win10單機部署kubernetes應用


安裝docker 不是主要矛盾,大家自行搜一下,只要確認好環境,再次強調最好升級一下win10,這樣操作起來更方便一些,docker toolbox用起來真的不行。

在正式安裝之前,還需要設置一個虛擬交換機

基於Win10單機部署kubernetes應用


接下來,就是安裝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的虛擬機

基於Win10單機部署kubernetes應用


基於Win10單機部署kubernetes應用


重點來了啊,如果之前下載失敗了,到自己的用戶下面把這個.minikube文件夾刪除了,重新來一邊,如果還是不行,繼續刪了重來,不要問為什麼,問就是上網需要科學。

基於Win10單機部署kubernetes應用


接下來就需要部署 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狀態

基於Win10單機部署kubernetes應用


使用, kubectl describe pod datalookerserver-56dbc49bc8-6sdms可以查看具體pod的具體信息

基於Win10單機部署kubernetes應用


接下來使用相同的指令,創建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 命令,可以打開網頁來對單機集群進行監控

基於Win10單機部署kubernetes應用


現在,一個整體的簡單應用構建起來了,那麼我們如何訪問呢?

還需要將端口映射出來,我們才能訪問

kubectl port-forward svc/datalookerserver 9999:9999

基於Win10單機部署kubernetes應用


測試一下OK了

基於Win10單機部署kubernetes應用


參考鏈接:

[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


分享到:


相關文章: