Kubernetes(K8S)中文文檔_Kubernetes中文社區(qū)
Kubernetes基礎(chǔ)
在集群上規(guī)?;?,帶版本,部署和調(diào)試容器化應(yīng)用
實(shí)現(xiàn)熱更新
Kubernetes操作
創(chuàng)建集群
部署,發(fā)布,查看,更新應(yīng)用‘
Minikube 部署 Kubernetes
創(chuàng)建Kubernetes cluster(單機(jī)版)最簡單的方法是minikube:
使用 kubectl 創(chuàng)建Deployment
創(chuàng)建Deployment后,Kubernetes master 會將Deployment創(chuàng)建好的應(yīng)用實(shí)例調(diào)度到集群中的各個節(jié)點(diǎn)。
Kubernetes Deployment Controller會持續(xù)監(jiān)視這些實(shí)例
如果管理實(shí)例的節(jié)點(diǎn)被關(guān)閉或刪除,那么 Deployment Controller將會替換它們,實(shí)現(xiàn)自我修復(fù)能力。
老的部署方式,一般通常安裝腳本來啟動應(yīng)用,但是便不會在機(jī)器故障后“自動”恢復(fù)
集群的方式也是一個master,多個slave.master部署一個應(yīng)用然后再分發(fā)到多個node上
創(chuàng)建Deployment時(shí),需要為應(yīng)用程序指定容器鏡像以及要運(yùn)行的副本數(shù)
kubectl version
kubectl get nodes
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
kubectl get deployments
運(yùn)行一個代理
We will open a second terminal window to run the proxy.
echo -e "\n\n\n\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\n"; kubectl proxy
curl http://localhost:8001/version
API服務(wù)器將根據(jù)POD名稱自動為每個POD創(chuàng)建一個端點(diǎn),這個端點(diǎn)也可以通過代理訪問。首先,我們需要獲得POD名稱,然后將變量POD_NAME存儲在環(huán)境中:
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME
curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
Kubernetes 中查看Pods和Nodes
Kubernetes Pod
Deployment時(shí),Kubernetes會創(chuàng)建了一個Pod來托管應(yīng)用。
pod組成
Volumes 卷
唯一的集群IP地址
每個容器運(yùn)行的信息,例如:容器鏡像版本
Kubernetes Node上至少運(yùn)行著
Kubelet
container runtime
一個service管理一組pod
Service的四種type:
ClusterIP(默認(rèn)) - 在集群中內(nèi)部IP上暴露服務(wù)。此類型使Service只能從群集中訪問。
NodePort - 通過每個 Node 上的 IP 和靜態(tài)端口(NodePort)暴露服務(wù)。NodePort 服務(wù)會路由到 ClusterIP 服務(wù),這個 ClusterIP 服務(wù)會自動創(chuàng)建。通過請求 <NodeIP>:<NodePort>,可以從集群的外部訪問一個 NodePort 服務(wù)。
LoadBalancer - 使用云提供商的負(fù)載均衡器(如果支持),可以向外部暴露服務(wù)。外部的負(fù)載均衡器可以路由到 NodePort 服務(wù)和 ClusterIP 服務(wù)。
ExternalName - 通過返回 CNAME 和它的值,可以將服務(wù)映射到 externalName 字段的內(nèi)容,沒有任何類型代理被創(chuàng)建。這種類型需要v1.7版本或更高版本kube-dnsc才支持。
Service 使用label selectors來匹配一組Pod
Label可以在創(chuàng)建時(shí)或以后附加到對象上,可以隨時(shí)修改。
kubectl get services
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
kubectl get services
kubectl describe services/kubernetes-bootcamp
kubectl describe deployment/kubernetes-bootcamp
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT
curl ip:30092
kubernetes-bootcamp? NodePort? ? 10.108.100.97? <none>? ? ? ? 8080:30092/TCP
伸縮應(yīng)用
如果伸縮需求是0,將會終止Deployment指定的所有Pod
Service集成了負(fù)載均衡器,可以將網(wǎng)絡(luò)流量分配到Deployment暴露的所有Pod中。Service將使用Endpoints持續(xù)監(jiān)控運(yùn)行的Pod,以確保僅將流量分配到可用的Pod。
kubectl scale deployments/kubernetes-bootcamp --replicas=4
kubectl get deployments
kubectl get pods -o wide
有4個不同的服務(wù)在不同的pod
kubectl describe services/kubernetes-bootcamp
Endpoints:? ? ? ? ? ? ? ? 172.18.0.2:8080,172.18.0.5:8080,172.18.0.6:8080 + 1 more...
每一個pod在一個node上有不同的ip 一個node可以有兩個相同的pod但是ip不同
應(yīng)用更新
滾動更新通過Deployments實(shí)現(xiàn)應(yīng)用實(shí)例在不中斷、不停機(jī)情況下更新,新的Pod會逐步調(diào)度到可用的資源Node節(jié)點(diǎn)上。
將應(yīng)用從一個環(huán)境升級到另一個環(huán)境(通過容器鏡像更新)
回滾到之前的版本
持續(xù)集成和持續(xù)交付應(yīng)用的零停機(jī)
更新image
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
回滾
kubectl rollout status deployments/kubernetes-bootcamp
使用Minikube集群
Kubernetes集群
Master節(jié)點(diǎn):協(xié)調(diào)控制整個集群。
Nodes節(jié)點(diǎn):運(yùn)行應(yīng)用的工作節(jié)點(diǎn)。
node process 每個node有一個進(jìn)程
Minikube CLI提供集群管理的基本操作,包括 start、stop、status、 和delete。
minikube version
minikube start
kubectl cluster-info
構(gòu)建應(yīng)用
docker build -t hello-node:v1 .
kubectl run hello-node --image=hello-node:v1 --port=8080
kubectl get deployments
minikube service hello-node
Kubernetes集群設(shè)計(jì)文檔
Kubernetes 架構(gòu)
Kubernetes 具備完善的集群管理能力,包括多層次的安全防護(hù)和準(zhǔn)入機(jī)制、多租戶應(yīng)用支撐能力、透明的服務(wù)注冊和服務(wù)發(fā)現(xiàn)機(jī)制、內(nèi)建負(fù)載均衡器、故障發(fā)現(xiàn)和自我修復(fù)能力、服務(wù)滾動升級和在線擴(kuò)容、可擴(kuò)展的資源自動調(diào)度機(jī)制、多粒度的資源配額管理能力。
Kubernetes 還提供完善的管理工具,涵蓋開發(fā)、部署測試、運(yùn)維監(jiān)控等各個環(huán)節(jié)。
Borg簡介
Borg是谷歌內(nèi)部的大規(guī)模集群管理系統(tǒng)
Kubernetes核心組件:
概念
通過Kubernetes你可以
快速部署應(yīng)用
快速擴(kuò)展應(yīng)用
無縫對接新的應(yīng)用功能
節(jié)省資源,優(yōu)化硬件資源的使用
Google 10多年大規(guī)模容器管理技術(shù)Borg的開源版
組件
Master
kube-apiserver
etcd是Kubernetes提供默認(rèn)的存儲系統(tǒng),保存所有集群數(shù)據(jù),使用時(shí)需要為etcd數(shù)據(jù)提供備份計(jì)劃。
節(jié)點(diǎn)(Node)
kube-proxy
kube-proxy通過在主機(jī)上維護(hù)網(wǎng)絡(luò)規(guī)則并執(zhí)行連接轉(zhuǎn)發(fā)來實(shí)現(xiàn)Kubernetes服務(wù)抽象。
supervisord
supervisord是一個輕量級的監(jiān)控系統(tǒng),用于保障kubelet和docker運(yùn)行。
Kubernetes對象
Object的配置:Object Spec和Object Status
Spec描述了對象所需的狀態(tài)? Status描述了對象的實(shí)際狀態(tài),并由Kubernetes系統(tǒng)提供和更新。
Kubernetes Names
Kubernetes REST API中的所有對象都用Name和UID來明確地標(biāo)識。
/api/v1/pods/some-name
Kubernetes Namespaces
Kubernetes可以使用Namespaces(命名空間)創(chuàng)建多個虛擬集群。
相同Namespace中的對象將具有相同的訪問控制策略。
Kubernetes Volume
默認(rèn)情況下容器中的磁盤文件是非持久化的
容器之間需要共享文件
對于Docker 1.7,每個容器只允許掛載一個Volume,并且不能將參數(shù)傳遞給Volume
Kubernetes Volume具有明確的生命周期 - 與pod相同。
Kubernetes支持許多類型的Volume,Pod可以同時(shí)使用任意類型/數(shù)量的Volume。
一個Volume只是一個目錄,目錄中可能有一些數(shù)據(jù),pod的容器可以訪問這些數(shù)據(jù)。
要使用Volume,pod需要指定Volume的類型和內(nèi)容(spec.volumes字段),和映射到容器的位置(spec.containers.volumeMounts字段)。
Volume 類型
hostPath
hostPath允許掛載Node上的文件系統(tǒng)到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。
還有一些基于不同運(yùn)行環(huán)境的磁盤
secret
secret volume用于將敏感信息(如密碼)傳遞給pod??梢詫ecrets存儲在Kubernetes API中,使用的時(shí)候以文件的形式掛載到pod中
Kubernetes Annotations
綁定用戶信息
Node
conditions字段描述所有Running節(jié)點(diǎn)的狀態(tài)。
OutOfDisk True:如果節(jié)點(diǎn)上沒有足夠的可用空間來添加新的pod;否則為:False
Ready True:如果節(jié)點(diǎn)是健康的并準(zhǔn)備好接收pod;False:如果節(jié)點(diǎn)不健康并且不接受pod;Unknown:如果節(jié)點(diǎn)控制器在過去40秒內(nèi)沒有收到node的狀態(tài)報(bào)告。
MemoryPressure True:如果節(jié)點(diǎn)存儲器上內(nèi)存過低; 否則為:False。
DiskPressure True:如果磁盤容量存在壓力 - 也就是說磁盤容量低;否則為:False。
master和Kubernetes集群之間通信路徑。
其目的是允許用戶自定義安裝,以增強(qiáng)網(wǎng)絡(luò)配置,使集群可以在不受信任(untrusted)的網(wǎng)絡(luò)上運(yùn)行。
第一個是從apiserver到在集群中的每個節(jié)點(diǎn)上運(yùn)行的kubelet進(jìn)程。第二個是通過apiserver的代理功能從apiserver到任何node、pod或service 。
從apiserver到Node、Pod或Service的連接默認(rèn)為HTTP連接,因此不需進(jìn)行認(rèn)證加密。也可以通過HTTPS的安全連接
pods
一個Pod封裝一個應(yīng)用容器(也可以有多個容器),存儲資源、一個獨(dú)立的網(wǎng)絡(luò)IP以及管理控制容器運(yùn)行方式的策略選項(xiàng)。
Kubernetes Replica Sets
ReplicaSet能確保運(yùn)行指定數(shù)量的pod。
這意味著你可能永遠(yuǎn)不需要操作ReplicaSet對象,而是使用Deployment替代管理 。
Kubernetes Deployment
Kubernetes 垃圾收集
級聯(lián)刪除
Kubernetes kubectl 概述
涵蓋了kubectl語法,對命令操作的描述,并列舉的常見例子。
官方文檔
https://www.kubernetes.org.cn/doc-45
kubectl [command] [TYPE] [NAME] [flags]
create,get,describe,set,delete
node pod service