k8s | 搞不明白為什么大家都在學(xué)習(xí) k8s
前言
都9102年了,你還不知道kubernetes就真的真的真的out啦。(販賣焦慮體)
什么是k8s,k8s這個(gè)詞來自于希臘語,有主管,舵手,船長的意思,我們從圖標(biāo)中能看出來。
在k8s的網(wǎng)站上,描述是這樣的
生產(chǎn)級別的容器編排系統(tǒng)
從定義中可以提煉出三個(gè)關(guān)鍵字,分別是
生產(chǎn)級別 容器 編排系統(tǒng)
1. 生產(chǎn)級別
說k8s是生產(chǎn)級別的有如下的幾個(gè)原因:
k8s 是谷歌的開源系統(tǒng),基于谷歌的系統(tǒng)設(shè)計(jì),并且已經(jīng)在谷歌系統(tǒng)上平穩(wěn)運(yùn)行的很久。 k8s 是CNCF的首個(gè)畢業(yè)項(xiàng)目。
2. 容器
容器有以下幾個(gè)特點(diǎn)
可移植性,容器可以被任何類型的操作系統(tǒng)安裝使用。 包容性:支持多種類型的軟件,這些軟件都可以打包在容器內(nèi)。 標(biāo)準(zhǔn)格式。 共存,多個(gè)容器可以運(yùn)行在同一個(gè)物理機(jī)上。 隔離,不同的容器的軟件彼此隔離。

最重要的一句話:沒有容器就沒有微服務(wù)。
容器和微服務(wù)化后,帶來了一些好處,比如:
模塊間更加獨(dú)立,可以獨(dú)立的部署和發(fā)布,加快了發(fā)布和更新的速度 隔離的運(yùn)行環(huán)境,可以為不同模塊定制不同的運(yùn)行環(huán)境
3. 編排系統(tǒng)
容器的編排系統(tǒng)可以有效的管理在宿主機(jī)上的容器。
管理網(wǎng)絡(luò)和訪問 跟蹤容器的狀態(tài) 增大或縮小服務(wù)的規(guī)模 實(shí)現(xiàn)負(fù)載平衡 宿主機(jī)無響應(yīng)后實(shí)現(xiàn)容器的重新分配 服務(wù)發(fā)現(xiàn) 管理容器的存儲 等等…
主要功能
數(shù)據(jù)卷
pod中容器之間共享數(shù)據(jù),可以使用數(shù)據(jù)卷。
應(yīng)用程序健康檢查
容器內(nèi)服務(wù)可能進(jìn)程阻塞無法處理請求,可以設(shè)置監(jiān)控檢查的策略,
復(fù)制應(yīng)用程序?qū)嵗?/span>
控制器維護(hù)者pod副本數(shù)量,保證一個(gè)pod或一組同類prod數(shù)量始終可用
彈性伸縮
根據(jù)設(shè)定的指標(biāo),自動(dòng)縮放pod副本數(shù)
服務(wù)發(fā)現(xiàn)
使用環(huán)境變量或DNS插件保證容器中程序發(fā)現(xiàn)pod入口訪問地址。
負(fù)載均衡
一組pod副本分配一個(gè)私有的集群ip地址,負(fù)載均衡轉(zhuǎn)發(fā)請求到后端容器,在集群類其他pod可以通過clusterIP訪問應(yīng)用。
滾動(dòng)更新
更新服務(wù)不中斷,一次更新一個(gè)pod,而不是同時(shí)刪除整個(gè)服務(wù)。
服務(wù)編排
通過文件描述部署服務(wù),使得應(yīng)用程序部署變得高效。
資源監(jiān)控
Node節(jié)點(diǎn)組件集成cAdvisor資源收集工具,通過Heapster匯總,并保存到influxDB時(shí)序數(shù)據(jù)庫,最后由Grafana展示。
提供認(rèn)證授權(quán)
支持RBAC認(rèn)證授權(quán)機(jī)制。
設(shè)計(jì)架構(gòu)


功能組件
k8s 集群中有管理節(jié)點(diǎn),Master與工作節(jié)點(diǎn),Node兩種類型。
管理節(jié)點(diǎn)Master主要負(fù)責(zé)k8s集群管理,集群中各個(gè)節(jié)點(diǎn)之間信息交互,任務(wù)調(diào)度,還負(fù)責(zé)容器,pod, namespaces , pv 等生命周期的管理。 工作節(jié)點(diǎn)node主要為容器和pod提供計(jì)算資源,pod及其容器全部運(yùn)行在工作節(jié)點(diǎn)上,工作節(jié)點(diǎn)通過kubelet服務(wù)與管理節(jié)點(diǎn)通信以管理容器的生命周期,并與集群其他節(jié)點(diǎn)進(jìn)行通信。
master組件
kube-apiserver
kubernetes api 資源操作的唯一入口,各種組件的協(xié)調(diào)者,以HTTP API 提供接口服務(wù),并提供相關(guān)的認(rèn)證,授權(quán)等機(jī)制,
kube-controller-manager
處理集群中常規(guī)的后臺任務(wù),一個(gè)資源對應(yīng)一個(gè)控制器,而ControllerManager負(fù)責(zé)管理這些控制器,并維護(hù)集群的狀態(tài)。
kube-scheduler
負(fù)責(zé)資源的調(diào)度,按照預(yù)定的策略把pod調(diào)度到對應(yīng)的Node節(jié)點(diǎn)上。
Node組件
kubelet
kubelet是Master在Node節(jié)點(diǎn)上的agent,管理本機(jī)運(yùn)行容器的生命周期,同時(shí)也負(fù)責(zé)Volume和網(wǎng)絡(luò)的管理。例如創(chuàng)建容器,掛載數(shù)據(jù)卷,下載secret,獲取容器和節(jié)點(diǎn)的狀態(tài)等工作。
kube-proxy
在Node節(jié)點(diǎn)上實(shí)現(xiàn)Pod/serviced網(wǎng)絡(luò)代理,提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和四層負(fù)載均衡。
docker
真正運(yùn)行容器的地方
etcd集群
分布式鍵值對儲存系統(tǒng),用于保存集群狀態(tài),比如pod,service等對象信息。
分層架構(gòu)
核心層:最核心的功能,對外提供api
應(yīng)用層,部署無狀態(tài)應(yīng)用,等,和路由。管理層:系統(tǒng)度量,自動(dòng)化,以及RBAC等
接口層:kubectl命令行工具,以及客戶端sdk
生態(tài)系統(tǒng):分為外部的日志,監(jiān)控等,內(nèi)部的鏡像倉庫等。
安裝
創(chuàng)建集群
首先,查看所使用的 minikube 版本:
$ minikube version
minikube version: v0.25.0
啟動(dòng) minikube:
$ minikube start
Starting local Kubernetes v1.9.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.
minikube 啟動(dòng)之后,會(huì)創(chuàng)建一個(gè)單節(jié)點(diǎn) Kubernetes 集群。
查看集群版本:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"", Minor:"", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2018-01-26T19:04:38Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}
這里有兩個(gè)版本,client version 指的是 kubectl 命令行工具的版本,而 server version 才是 Kubernetes 的版本。
查看更詳細(xì)的版本信息:
$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.77:8443
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
集群所在主機(jī)的 ip 為 172.17.0.77。
注意:這里的 master 指的是 Kubernetes 集群的 master 節(jié)點(diǎn)(在 Kubernetes 集群中,節(jié)點(diǎn)分為兩類,一類是 master 節(jié)點(diǎn),一類是 node 節(jié)點(diǎn))。那怎么看到 node 節(jié)點(diǎn)呢?
$ kubectl get node
NAME STATUS ROLES AGE VERSION
host01 Ready 20m v1.9.0
host01 就是 node 節(jié)點(diǎn),在當(dāng)前環(huán)境中,實(shí)際上只有一臺主機(jī)。這臺主機(jī)既作為 master 節(jié)點(diǎn),也作為 node 節(jié)點(diǎn)。
部署應(yīng)用
下面以部署一個(gè) nginx 為例來演示部署應(yīng)用的過程:
$ kubectl run first-app --image=nginx --port=80
deployment "first-app" created
通過 run 命令創(chuàng)建一個(gè)名為 first-app 的 deployment,使用的是 docker hub 上最新的 nginx 鏡像,并指定了應(yīng)用端口為 80。deployment 是干嘛的呢?別急,往下看:
查看當(dāng)前的 deployment:
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
first-app 1 1 1 1 1m
查看當(dāng)前的 pod:
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
first-app-6db44b474-dbbtp 1/1 Running 0 4m
查看更詳細(xì)的 pod 內(nèi)容:
$ kubectl describe pod first-app-6db44b474-dbbtp
Name: first-app-6db44b474-dbbtp
Namespace: default
Node: host01/172.17.0.77
Start Time: Fri, 02 Mar 2018 06:48:02 +0000
Labels: pod-template-hash=286006030
run=first-app
Annotations:
Status: Running
IP: 172.18.0.4
Controlled By: ReplicaSet/first-app-6db44b474
Containers:
first-app:
Container ID: docker://54eacc7ff536d7181fa366883f7ed4cf632492ad6ed391207fea436d22d219a9
Image: nginx
Image ID: docker-pullable://nginx@sha256:4771d09578c7c6a65299e110b3ee1c0a2592f5ea2618d23e4ffe7a4cab1ce5de
Port: 80/TCP
State: Running
Started: Fri, 02 Mar 2018 06:48:14 +0000
Ready: True
Restart Count: 0
Environment:
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-zkqw6 (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
default-token-zkqw6:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-zkqw6
Optional: false
QoS Class: BestEffort
Node-Selectors:
Tolerations:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 7m default-scheduler Successfully assigned first-app-6db44b474-dbbtp to host01
Normal SuccessfulMountVolume 7m kubelet, host01 MountVolume.SetUp succeeded for volume "default-token-zkqw6"
Normal Pulling 7m kubelet, host01 pulling image "nginx"
Normal Pulled 7m kubelet, host01 Successfully pulled image "nginx"
Normal Created 7m kubelet, host01 Created container
Normal Started 7m kubelet, host01 Started container
對外發(fā)布服務(wù)
已經(jīng)部署好了一個(gè) nginx 應(yīng)用,那么要怎么去訪問呢?這時(shí)候就需要用到 service。創(chuàng)建一個(gè) service:
$ kubectl expose deployment/first-app --type="NodePort" --port=80
service "first-app" exposed
查看創(chuàng)建好的名為 first-app 的 service :
$ kubectl get svc first-app
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
first-app NodePort 10.102.0.12 80:30491/TCP 1m
在 PORT(S) 一欄中,除了 80 端口,后面還有一個(gè) 30491 端口。這是使用了“NodePort”類型創(chuàng)建 service 分配的端口,通過主機(jī) ip 和這個(gè)端口,就可以訪問到這個(gè) service 了??梢允褂?curl 工具進(jìn)行訪問:
$ curl 172.17.0.77:30491
Welcome to nginx!
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
擴(kuò)縮應(yīng)用
剛剛已經(jīng)成功訪問到 nginx 應(yīng)用,但有些時(shí)候,可能需要多個(gè) nginx 來橫向擴(kuò)展,那么在 Kubernetes 中怎么實(shí)現(xiàn)呢?
$ kubectl scale deployment/first-app --replicas=3
deployment "first-app" scaled
再查看當(dāng)前的 pod,可以看到當(dāng)前已經(jīng)有了 3 個(gè) first-app 了。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
first-app-6db44b474-6vlrj 1/1 Running 0 39s
first-app-6db44b474-dbbtp 1/1 Running 0 19m
first-app-6db44b474-gjzgg 1/1 Running 0 39s
如果覺得 3 個(gè)太浪費(fèi)資源了,想減少 pod 的數(shù)量,那么可以使用同樣的命令,把 replicas 參數(shù)的值改為需要的值就可以了。
更新應(yīng)用
最常用的就是更新鏡像。之前使用的是 docker hub 上最新的 nginx,現(xiàn)在用 1.10.3 這個(gè)比較老的版本來替代最新版本。先查看當(dāng)前使用的 nginx 版本。這里有一個(gè)很簡單的方法,訪問一個(gè)不存在的頁面,如下:
$ curl 172.17.0.77:30491/abc
404 Not Found
404 Not Found
nginx/1.13.9
當(dāng)前使用的 nginx 版本是 1.13.9,接下來進(jìn)行更新操作:
$ kubectl set image deployment/first-app first-app=nginx:1.10
deployment "first-app" image updated
再查看當(dāng)前 nginx 的版本:
$ curl 172.17.0.77:30491/abc
404 Not Found
404 Not Found
nginx/1.10.3
nginx 版本已經(jīng)成功更新為 1.10.3。
刪除應(yīng)用
最后來講講刪除應(yīng)用,之前是通過 deployment 來創(chuàng)建應(yīng)用,所以只需要?jiǎng)h除 deployment 就可以刪除對應(yīng)的應(yīng)用了。
$ kubectl delete deployment/first-app
deployment "first-app" deleted
再查看一下當(dāng)前的 pod:
$ kubectl get pod
No resources found.
所有的 pod 都已經(jīng)刪除了。
4.中間件等
更多信息請關(guān)注公眾號:「軟件老王」,關(guān)注不迷路,軟件老王和他的IT朋友們,分享一些他們的技術(shù)見解和生活故事。
