k8s職責
- 自動化容器部署和復制
- 隨時擴展或收縮容器
- 容器分組group,并且提供容器間的負載均衡
- 實時監(jiān)控,即時故障發(fā)現(xiàn),自動替換
k8s概念及架構(gòu)
pod
pod是容器的容器,可以包含多個container
pod是k8s最小可部署單元,容器的本質(zhì)是一個隔離的進程,而Pod則是一組相互聯(lián)系的進程(進程組)。Pod 內(nèi)的多個容器共享網(wǎng)絡和文件系統(tǒng),可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。
pod內(nèi)部容器網(wǎng)絡互通,每個pod都有獨立虛擬IP。
pod都是部署完整的應用或模塊(項目中通常:一個pod部署一個應用,或部署一個應用的一部分)。
#獲取節(jié)點
kubectl get pods
#通過kubectl 運行一節(jié)點
kubectl run nginx-pod --image=nginx
#查看詳細信息
kubectl describe pod nginx-pod
#查看拓展信息 可以看到IP等信息
kubectl get pods -o wide
提醒:官方不退年使用kubectl 命令來創(chuàng)建pod,推薦使用yml的方式來創(chuàng)建pod
YAML 方式創(chuàng)建POD
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
labels:
app: demonginx
type: nginxservice
spec:
containers:
- name: nginx
image: nginx
#創(chuàng)建并啟動pod 下面兩個命令是一樣的效果
kubectl create -f pod-ngix.yml
kubectl apply -f pod-ngix.yml
#停止pod
kubectl delete -f pod-ngix.yml
字段說明
apiVersion:API版本號。根據(jù)創(chuàng)建的內(nèi)容,必須使用正確的API版本,不同版本號支持的功能可能不太一樣。V1, app/V1beta,extensions/V1beta,等等
kind:資源類型,類型指的是創(chuàng)建的對象的類型,其他可能的值 Pod, Service, ReplicaSet, Deployment.
metadata:用來描述這個pod的元信息,比如名稱和標簽。有了這個元信息,我們區(qū)分這個pod,方便眾多pod進行篩選。比如我們可以pod標識為前端應用,后端應用,數(shù)據(jù)庫,中間件等。
spec: 其中container是一個數(shù)組,因為pod中可以有多個容器,名字前面的破折號表示這是列表中的第一個項目。列表中的每一個元素又是一個字典,所以要添加一個名稱和image屬性。image的值是nginx,這是docker倉庫中的docker鏡像。
ReplicationController
Pod 可以通過控制器來管理。它可以監(jiān)測Kubernetes對象并及時反應,有下面這兩個應用場景:
1 保證高可用,比如一個節(jié)點掛掉了,控制器會監(jiān)測到會立即開啟一個新的節(jié)點繼續(xù)提供服務。
2 負載均衡,比如我們需要一個服務維持在3個節(jié)點以負載均衡。那么比如我們一個節(jié)點所在的宿主機的資源耗盡了,這個時候控制器可以調(diào)度在集群的其它機器上再創(chuàng)建一個節(jié)點,始終保持這個服務有三個節(jié)點來提供服務。
apiVersion: v1
kind: ReplicationController
metadata:
name: demo-rc
labels:
app: demonginx
type: nginxservice
spec:
template:
metadata:
name: ningx-pod
labels:
app: nginxapp
spec:
containers:
- name: nginx
image: nginx
replicas: 3
可以看到和前面的yml非常的類似,只是這次我們在spec定義了一個模板,這個模板就是比如我們一個節(jié)點掛掉了,這個時候控制器可以用這個模板來創(chuàng)建副本。同時replicas制定了節(jié)點數(shù)量為三個。
提醒:這里有個現(xiàn)象,比如你之前用命令行創(chuàng)建了一個pod,然后pod的標簽和使用rc的一樣,你會發(fā)現(xiàn)rc在啟動的時候會直接把這個節(jié)點拿過來直接使用,也就是實際上只創(chuàng)建了兩個節(jié)點
ReplicaSet
ReplicaSet與ReplicationController非常相似。ReplicaSet則相當于ReplicationController的升級版,它的作用也是控制pod的數(shù)量始終維持在預設的個數(shù)。
apiVersion: apps/v1 #注意需要使用這個版本
kind: ReplicaSet
metadata:
name: demo-rc
labels:
app: demonginx
type: nginxservice
spec:
template:
metadata:
name: ningx-pod
labels:
app: nginxapp
type: nginxservice #注意下面 selector 指定的matchLabels 要和這里的labels來對應
spec:
containers:
- name: nginx
image: nginx
replicas: 3
selector:
matchLabels:
#這個是指定使用那個標簽的服務 比如之前有一個服務標簽叫這個 會直接拿過來用 和ReplicationController 一樣 只是 ReplicationController不顯示的定義,默認與pod定義文件中提供的標簽相同
type: nginxservice
#查看replicaset
kubectl get replicaset
#查看詳細信息
kubectl describe replicaset demo-rs
擴容
使用下面命令:
kubectl scale replicaset myapp-rs --replicas=6
#修改命令 直接修改配置yml文件 修改以后k8會響應變化 demo-rc為replicaset名稱
kubectl edit rs demo-rc
Deployment
官方推薦不要直接使用ReplicaSet,用Deployments。Deployment可以通過selector來匹配labels字段,過濾出它所關(guān)心的被控制對象。
Deployment不直接管理Pod對象,而是由Deployment管理ReplicaSet,再由ReplicaSet負責管理Pod對象。
Deployment為我們提供了使用滾動更新無縫升級底層實例的能力,e.g.撤銷變化,暫停,并根據(jù)需要恢復變化。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
type: myservice
spec:
selector:
matchLabels:
type: myservice
replicas: 3
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: myservice
spec:
containers:
- name: nginx
image: nginx
#查看
kubectl get deployments
#查看所有資源
kubectl get all
kubectl describe deploy demo-deploy
滾動更新與回滾
kubectl create -f myapp-deploy.yml --record #通過--record 執(zhí)行以后就可以看到history里面多了一條 記錄
#我們可以看到滾動更新的日志
kubectl edit deployment myapp-deployment --record && kubectl rollout status deployment/myapp-deployment
#在執(zhí)行一次鏡像修改
kubectl set image deployment myapp-deployment nginx=nginx:perl --record && kubectl rollout status deployment/myapp-deployment
kubectl describe pod myapp-deployment-f5b5cdd5-22278
我們可以看到鏡像已經(jīng)變成了perl
接著我們做一次回滾
kubectl rollout undo deployment/myapp-deployment
可以看到就是把1拿過來重新執(zhí)行一遍:deployment 可以簡寫為deploy ,我們可以通過kubectl api-resources 這個命令來查看
這里有那些命令可以簡寫,簡寫成什么,對應的版本是什么文章來源:http://www.zghlxwxcb.cn/news/detail-819000.html
多容器Pod
微服務架構(gòu)允許我們根據(jù)需要使用需要擴展?縮減以及修改每個服務, 而不是修改整個應用程序?
有時可能需要兩個服務一起工作,例如Web服務器和日志記錄服務?每個Web服務器實例都需要一個日志收集代理一組?但是二者具有獨立的代碼庫,單獨開發(fā)和部署?文章來源地址http://www.zghlxwxcb.cn/news/detail-819000.html
- 共享同一Pod生命周期, 一起創(chuàng)建和銷毀?
- 共享相同的網(wǎng)絡空間,可以通過localhost相互訪問,
- 共享存儲卷?
pod yaml文件中spec部分下的container部分是一個數(shù)組,允許一個pod中有多個container
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
type: myservice
spec:
containers: #這里指定了多個容器
- name: nginx
image: nginx
- name: log-agent
image: log-agent
到了這里,關(guān)于k8s-基礎知識(Pod,Deployment,ReplicaSet)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!