簡介:在k8s中,通常使用yaml格式的文件來建立符合咱們預期指望的pod,這樣的yaml文件咱們通常稱爲資源清單python
① 工做負載型資源(workload):Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、CronJob(ReplicationController在v1.11版本被廢棄nginx
② 服務發現及負載均衡型資源(ServiceDiscoveryLoadBalance):Service、Ingress、...docker
③ 配置與存儲型資源:Volume(存儲卷)、CSI(容器存儲接口,能夠擴展各類各樣的第三方存儲卷)編程
④ 特殊類型的存儲卷:ConfigMap(當配置中心來使用的資源類型)、Secret(保存敏感數據)、DownwardAPI(把外部環境中的信息輸出給容器)json
Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBindingvim
HPA、PodTemplate(pod模板)、LimitRange(資源限制)api
apiVersion <string> #表示字符串類型 metadata <Object> #表示須要嵌套多層字段 labels <map[string]string> #表示由k:v組成的映射 finalizers <[]string> #表示字串列表 ownerReferences <[]Object> #表示對象列表 hostPID <boolean> #布爾類型 priority <integer> #整型 name <string> -required- #若是類型後面接 -required-,表示爲必填字段 kubectl get pod xx.xx.xx -o yaml <!--使用 -o 參數加 yaml,能夠將資源的配置以 yaml的格式輸出出來,也可使用json,輸出爲json格式-->
apiVersion: group/apiversion # 若是沒有給定 group 名稱,那麼默認爲 core,可使用 kubectl api-versions # 獲取當前 k8s 版本上全部的 apiVersion 版本信息( 每一個版本可能不一樣 ) kind: #資源類別 metadata: #資源元數據 name namespace lables annotations # 主要目的是方便用戶閱讀查找 spec: # 指望的狀態(disired state) status: # 當前狀態,本字段有 Kubernetes 自身維護,用戶不能去定義
vim pod.yaml 例子: apiVersion: v1 kind: Pod metadata: name: nginx-pod labels: app: myapp version: v1 spec: containers: - name: app image: hub.lqz.com/library/nginx:latest
u 自主式Pod:Pod退出了,此類型的pod不會被建立(可理解爲此pod沒有管理者,他的死亡不會被拉起)安全
u 控制器管理的Pod:在控制器的生命週期裏,始終要維持Pod的副本數目(通常爲此類型)服務器
① ReplicationController & ReplicaSet & Deployment網絡
>HPA(HorizontalPodAutoScale)
② StatefullSet
③ DaemonSet
④ Job,Cronjob
Horizontal Pod Autoscaling 僅適用於Deployment 和ReplicaSet ,在V1 版本中僅支持根據Pod 的CPU 利用率擴所容,在v1alpha 版本中,支持根據內存和用戶自定義的metric 擴縮容
StatefulSet是爲了解決有狀態服務的問題(對應Deployments 和ReplicaSets是爲無狀態服務而設計),其應用場景包括:
DaemonSet 確保所有(或者一些)Node 上運行一個Pod 的副本。當有Node 加入集羣時,也會爲他們新增一個Pod 。當有Node 從集羣移除時,這些Pod 也會被回收。刪除DaemonSet 將會刪除它建立的全部Pod使用DaemonSet 的一些典型用法:
Job 負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod 成功結束Cron Job管理基於時間的Job,即:
Kubernetes 的網絡模型假定了全部Pod 都在一個能夠直接連通的扁平的網絡空間中,這在GCE(Google Compute Engine)裏面是現成的網絡模型,Kubernetes 假定這個網絡已經存在。而在私有云裏搭建Kubernetes 集羣,就不能假定這個網絡已經存在了。咱們須要本身實現這個網絡假設,將不一樣節點上的Docker 容器之間的互相訪問先打通,而後運行Kubernetes
Flannel 是CoreOS 團隊針對Kubernetes 設計的一個網絡規劃服務,簡單來講,它的功能是讓集羣中的不一樣節點主機建立的Docker 容器都具備全集羣惟一的虛擬IP地址。並且它還能在這些IP 地址之間創建一個覆蓋網絡(Overlay Network),經過這個覆蓋網絡,將數據包原封不動地傳遞到目標容器內
ETCD 之 Flannel 提供說明:
> 存儲管理Flannel 可分配的IP 地址段資源
> 監控ETCD 中每一個 Pod 的實際地址,並在內存中創建維護 Pod 節點路由表
同一個Pod 內部通信:同一個Pod 共享同一個網絡命名空間,共享同一個Linux 協議棧
Pod1 至Pod2
> Pod1 與Pod2 不在同一臺主機,Pod的地址是與docker0在同一個網段的,但docker0網段與宿主機網卡是兩個徹底不一樣的IP網段,而且不一樣Node之間的通訊只能經過宿主機的物理網卡進行。將Pod的IP和所在Node的IP關聯起來,經過這個關聯讓Pod能夠互相訪問
> Pod1 與Pod2 在同一臺機器,由Docker0 網橋直接轉發請求至Pod2,不須要通過Flannel
Pod 至 Service的網絡:目前基於性能考慮,所有爲iptables 維護和轉發
Pod 到外網:Pod 向外網發送請求,查找路由表, 轉發數據包到宿主機的網卡,宿主網卡完成路由選擇後,iptables執行Masquerade,把源IP 更改成宿主網卡的IP,而後向外網服務器發送請求
外網訪問Pod:Service
命令式編程:它側重於如何實現程序,就像咱們剛接觸編程的時候那樣,咱們須要把程序的實現過程按照邏輯結果一步步寫下來(ReplicaSet:creat)
聲明式編程:它側重於定義想要什麼,而後告訴計算機/引擎,讓他幫你去實現(Deployment:apply)
Deployment經過ReplicaSet來管理Pod
kubectl explain pod:看pod模板有那些 kubectl explain pod.apiVersion:查看具體某一個模板 建立pod:kubectl apply -f pod.yaml kubectl create -f pod.yaml 查看pod:kubectl get pod kubectl get pod -o wide 詳細信息 刪除pod:kubectl delete pod myapp-pod
訪問:curl 10.244.2.8
Kubectl describe pod myapp-pod //查看描述信息
kubectl log myapp-pod -c text //查看日誌
Pod可以具備多個容器,應用運行在容器裏面,可是它也可能有一個或多個先於應用容器啓動的Init容器
Init容器與普通的容器很是像,除了以下兩點:
若是Pod的Init容器失敗,Kubernetes會不斷地重啓該Pod,直到Init容器成功爲止。然而,若是Pod對應的restartPolicy爲Never,它不會從新啓動
由於Init容器具備與應用程序容器分離的單獨鏡像,因此它們的啓動相關代碼具備以下優點:
① 它們能夠包含並運行實用工具,可是出於安全考慮,是不建議在應用程序容器鏡像中包含這些實用工具的
② 它們能夠包含使用工具和定製化代碼來安裝,可是不能出如今應用程序鏡像中。例如,建立鏡像不必FROM另外一個鏡像,只須要在安裝過程當中使用相似sed、awk、python或dig這樣的工具。
③ 應用程序鏡像能夠分離出建立和部署的角色,而沒有必要聯合它們構建一個單獨的鏡像。
④ Init容器使用LinuxNamespace,因此相對應用程序容器來講具備不一樣的文件系統視圖。所以,它們可以具備訪問Secret的權限,而應用程序容器則不能。
⑤ 它們必須在應用程序容器啓動以前運行完成,而應用程序容器是並行運行的,因此Init容器可以提供了一種簡單的阻塞或延遲應用容器的啓動的方法,直到知足了一組先決條件。
① 在Pod啓動過程當中,Init容器會按順序在網絡和數據卷初始化以後啓動。每一個容器必須在下一個容器啓動以前成功退出(網絡和數據卷初始化是在pause)
② 若是因爲運行時或失敗退出,將致使容器啓動失敗,它會根據Pod的restartPolicy指定的策略進行重試。然而,若是Pod的restartPolicy設置爲Always,Init容器失敗時會使用RestartPolicy策略
③ 在全部的Init容器沒有成功以前,Pod將不會變成Ready狀態。Init容器的端口將不會在Service中進行彙集。正在初始化中的Pod處於Pending狀態,但應該會將Initializing狀態設置爲true
④ 若是Pod重啓,全部Init容器必須從新執行
⑤ #對Init容器spec的修改被限制在容器image字段,修改其餘字段都不會生效。更改Init容器的image字段,等價於重啓該Pod
⑥ Init容器具備應用容器的全部字段。除了readinessProbe(就緒檢測),由於Init容器沒法定義不一樣於完成(completion)的就緒(readiness)以外的其餘狀態。這會在驗證過程當中強制執行
⑦ 在Pod中的每一個app和Init容器的名稱必須惟一;與任何其它容器共享同一個名稱,會在驗證時拋出錯誤
探針是由kubelet對容器執行的按期診斷。要執行診斷,kubelet調用由容器實現的Handler。有三種類型的處理程序:
每次探測都將得到如下三種結果之一:
① livenessProbe:指示容器是否正在運行。若是存活探測失敗,則kubelet會殺死容器,而且容器將受到其重啓策略的影響。若是容器不提供存活探針,則默認狀態爲Success(會隨着容器的生命週期一直存在)
② readinessProbe:指示容器是否準備好服務請求。若是就緒探測失敗,端點控制器將從與Pod匹配的全部Service的端點中刪除該Pod的IP地址。初始延遲以前的就緒狀態默認爲Failure。若是容器不提供就緒探針,則默認狀態爲Success
Podhook(鉤子)是由Kubernetes管理的kubelet發起的,當容器中的進程啓動前或者容器中的進程終止以前運行,這是包含在容器的生命週期之中。能夠同時爲Pod中的全部容器都配置hook
Hook的類型包括兩種:
PodSpec中有一個restartPolicy字段,可能的值爲Always、OnFailure和Never。默認爲Always。restartPolicy適用於Pod中的全部容器。restartPolicy僅指經過同一節點上的kubelet從新啓動容器。失敗的容器由kubelet以五分鐘爲上限的指數退避延遲(10秒,20秒,40秒...)從新啓動,並在成功執行十分鐘後重置。如Pod文檔中所述,一旦綁定到一個節點,Pod將永遠不會從新綁定到另外一個節點。
① 掛起(Pending):Pod已被Kubernetes系統接受,但有一個或者多個容器鏡像還沒有建立。等待時間包括調度Pod的時間和經過網絡下載鏡像的時間,這可能須要花點時間
② 運行中(Running):該Pod已經綁定到了一個節點上,Pod中全部的容器都已被建立。至少有一個容器正在運行,或者正處於啓動或重啓狀態
③ 成功(Succeeded):Pod中的全部容器都被成功終止,而且不會再重啓
④ 失敗(Failed):Pod中的全部容器都已終止了,而且至少有一個容器是由於失敗終止。也就是說,容器以非0狀態退出或者被系統終止
⑤ 未知(Unknown):由於某些緣由沒法取得Pod的狀態,一般是由於與Pod所在主機通訊失敗
1、docker pull busybox 二、vim init-pod.yaml apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp spec: containers: - name: myapp-container image: busybox command: ['sh','-c','echo The app is running! && sleep 3600'] initContainers: - name: init-myservice image: busybox command: ['sh','-c','until nslookup myservice; do echo waiting for myservice; sleep 2;done;'] - name: init-mydb image: busybox command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;'] 3、service能夠簡稱svc 建立service kind: Service apiVersion: v1 metadata: name: myservice spec: ports: - protocol: TCP port: 80 targetPort: 9376 kind: Service apiVersion: v1 metadata: name: mydb spec: ports: - protocol: TCP port: 80 targetPort: 9377
查看pod
kubectl delete deployment --all 刪除全部deployment
kubectl delete pod --all 刪除全部pod
版本最好不用latest;由於如今和之後的最新版本不同
查看具體pod信息