kubernetes
kubernetes是一個(gè)開源的容器管理平臺(tái),幫助我們更方便進(jìn)行容器應(yīng)用的部署和維護(hù)。
1、創(chuàng)建一個(gè)集群cluster

集群包含兩種資源:
Master:負(fù)責(zé)管理集群,只有一個(gè)
Nodes:節(jié)點(diǎn)是運(yùn)行容器服務(wù)的機(jī)器,可以有多個(gè),可以是虛擬機(jī)或者物理機(jī)
節(jié)點(diǎn)與master之間通過k8s API進(jìn)行通信。
2、部署應(yīng)用deploy

- Deployment
負(fù)責(zé)創(chuàng)建和更新容器應(yīng)用實(shí)例,創(chuàng)建時(shí)需要聲明用哪個(gè)鏡像、副本數(shù)量
- Deployment Controller
負(fù)責(zé)監(jiān)控實(shí)例狀態(tài),提供了一種自我恢復(fù)機(jī)制,如果有節(jié)點(diǎn)down或者被刪除了,會(huì)自動(dòng)啟另一個(gè)節(jié)點(diǎn)來替代。
- kubectl
kubectl是k8s集群的命令行工具,通過API與集群通信。
常用命令:
#查看版本
kubectl version
#查看nodes
kubectl get nodes
# 創(chuàng)建deployment
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
#查看deployments
kubectl get deployments
3、探索應(yīng)用
Pod

pod是容器實(shí)例運(yùn)行的地方,一個(gè)pod可以承載單個(gè)或多個(gè)容器實(shí)例,它們將共享存儲(chǔ)(數(shù)據(jù)卷)、網(wǎng)絡(luò)(集群內(nèi)部IP)等資源。
一個(gè)pod中的多個(gè)容器通常是需要協(xié)同工作的,它們將共用一個(gè)IP。
pod是k8s集群的最小單元
pod運(yùn)行在node上,一個(gè)node可運(yùn)行一個(gè)或多個(gè)pod
Nodes

一個(gè)node可以是虛擬機(jī)或物理機(jī),每個(gè)node正常運(yùn)行都需要2個(gè)部分:
kubelet:一個(gè)進(jìn)程,負(fù)責(zé)node和master通信,并負(fù)責(zé)管理該node上的pods與containers
a container runtime:負(fù)責(zé)拉取鏡像、解包容器、運(yùn)行容器實(shí)例,e.g.docker
kubectl get - list resources
kubectl describe - show detailed information about a resource
kubectl logs - print the logs from a container in a pod
kubectl exec - execute a command on a container in a pod
`kubectl get pods`
`kubectl describe pods`
`kubectl logs $pod_name`
4、對(duì)外服務(wù)service
Service
pod是有生命周期的,node不在的話,上面的pods跟著消亡。雖然ReplicaSet會(huì)驅(qū)使集群動(dòng)態(tài)的創(chuàng)建新的pods以滿足預(yù)期的狀態(tài),但新pods的IP是會(huì)改變的(即使在同一個(gè)node上),這無法保證服務(wù)的持續(xù)可用性。為了解決這一問題,出現(xiàn)了service的概念。

service使用yaml/json格式定義一組邏輯上的pods集合,并向外部暴露服務(wù),這些pods通常被?LabelSelector?指定。
type
service有幾種類型,需要在ServiceSpec指定?type?:
ClusterIP(default):暴露集群內(nèi)部IP,這樣的service只在集群內(nèi)部可訪問
NodePort:暴露node節(jié)點(diǎn)本身的IP和端口,集群外部可通過?<NodeIP>:<NodePort>?訪問service
NodeBalancer:對(duì)外部負(fù)載均衡,該service擁有固定的外部IP端口
ExternalName:通過任意外部名稱(spec中?externalName?定義)暴露服務(wù),要求v1.7及以上版本的?kube-dns?
labels
標(biāo)簽是為了方便標(biāo)識(shí)、識(shí)別對(duì)象,它們是關(guān)聯(lián)到對(duì)象的鍵值對(duì)組合,可以在對(duì)象創(chuàng)建時(shí)就指定,也可以后面隨時(shí)添加、更改。

kubectl get pods
kubectl get services
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl describe services/kubernetes-bootcamp
# using labels
kubectl describe deployment
kubectl get pods -l run=kubernetes-bootcamp
kubectl get services -l run=kubernetes-bootcamp
kubectl label pod $POD_NAME app=v1
kubectl get pods -l app=v1
kubectl delete service -l run=kubernetes-bootcamp
5、擴(kuò)容scale
擴(kuò)容通過改變Deployment中的replicas副本數(shù)實(shí)現(xiàn)。

$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1/1 1 1 36s
$ kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment.extensions/kubernetes-bootcamp scaled
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4/4 4 4 70s
6、更新應(yīng)用update
Rolling update:通過增量的以新pods實(shí)例替換老pods的方式,實(shí)現(xiàn)“零停機(jī)”發(fā)布。
k8s中的發(fā)布都是有版本控制的,Deployment可以回退到之前的穩(wěn)定版本。

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
kubectl rollout status deployments/kubernetes-bootcamp