K8S系列學習之Pod實戰
Kubernetes學習路上的那些事兒,很有必要分享出來
什麼是Pod
要弄清楚這個概念,我們還是先上官網瞧瞧,https://kubernetes.io/zh/docs/concepts/workloads/pods/
個人的理解,Pod就是k8s中的一個個籃子,至於裡面是裝韭菜,還是裝雞蛋,得根據具體的業務環境要求來定。在k8s世界中,重點是把這些籃子排程和管理好,所以得首先學Pod,只有理解和掌握了Pod,後面的一些k8s元件學習起來才有意思。
實操過程
實驗準備:
Kubernetes叢集環境一套,可以選擇在本地虛擬機器(VirtualBox)上搭建,也可以選擇在公有云上利用雲主機來搭建,比如移動雲、阿里雲、騰訊雲、華為雲等。
當然,在生產環境中,肯定建議直接使用伺服器進行搭建。以下是我的實驗環境,1臺master節點,2臺node節點。
步驟一:編寫Pod的yaml檔案。因為在k8s中是“宣告式”命令,通過編寫的yaml檔案來實現元件的操作。
在Master節點的當前環境下,先編寫一個名字叫“pod1.yaml”的檔案,具體程式碼如下:
apiVersion: v1
kind: Pod
metadata:
name: pod1
namespace: default
labels:
evn: dev
res: stable
spec:
containers:
- name: testpod-dev
image: nginx
ports:
- containerPort: 80
還是那句老話,先別慌,會奉上詳細的解釋的,如下圖:
步驟二:提交yaml檔案並建立Pod。在這個小實驗裡,只建立了一個Pod,且該Pod中只有一個容器,該容器安裝的是nginx最新版本的映象,也就是部署了一個nginx容器。
kubectl apply -f pod1.yaml
kubectl get pod
由於我做實驗的環境設定的頻寬低,所以拉取映象的過程比較長一些,如果執行正常,獲取的Pod狀態是Running。如果是非Running的狀態,可使用kubectl describe pod pod1命令來檢視pod1的執行資訊,以便找到問題,然後解決問題。
步驟三:驗證結果。可以使用kubectl命令列直接進入Pod內,然後檢視nginx安裝檔案。如果想使用curl命令看nginx歡迎頁面資訊,單獨操作Pod是不行的,需要配合Service元件來使用,後續會單獨分享Service。畢竟k8s是叢集排程,無論是從物理層面的“垂直維度”,還是從編排層面的“水平維度”,都是做了隔離的,這跟單獨操作虛擬機器還是有較大區別的。
kubectl exec -it pod1 -c testpod-dev -- /bin/bash //pod1是本實驗的Pod名稱,testpod-dev是本實驗pod1中的容器名稱,該docker容器部署了nginx
以上紅色方框中的配置檔案,就是我們們熟悉的nginx配置檔案了,/conf.d/default.conf中可以修改監控埠(預設是80),nginx.conf中可以修改worker_processes的數量。
步驟四:一個Pod中部署多個docker容器。這裡就開始體現k8s的好處了,只需要在原來的pod1.yaml檔案上裡的spec語句塊中,繼續增加容器規格引數即可。為了方便對比,增加了程式碼的檔案叫pod-1.yaml,同時名稱定義為pod-1。
然後使用同樣的命令,建立pod-1。
kubectl apply -f pod-1.yaml //增加了my-tomcat容器的yaml檔案
kubectl get pod //檢視pod狀態,直到狀態變成Running
做個對比,pod1中只有一個docker容器,而pod-1中有兩個docker容器。
步驟五:在Pod中限制docker容器的資源使用。操作也很簡單,仍然是通過修改yaml檔案的相應配置區來實現。
為了好做對比,在pod1.yaml基礎上覆制一個pod11.yaml檔案,然後增加資源設定語句塊。
然後讓pod1(沒有設定資源限制)和pod-11(設定了資源限制)都Running起來,然後使用命令檢視當前Node上的執行情況。
kubectl get pod -o wide //檢視pod在哪些Node上
kubectl describe node k8s-node2 //檢視k8s-node2這個Node上的執行資訊
擴充套件內容
1)實驗環境的對比,公有云VS本地虛擬機器
如果使用公有云上的雲主機搭建環境,好處是“一次部署,永久執行”,想做實驗的時候,馬上登陸雲主機即可,不好的地方是要注意安全組的配置,注意埠的放通,如果為了省事兒也可以將所有埠放通,但因為是公有云又容易被攻擊。
如果使用本地虛擬機器環境搭建,好處是不用配置安全組,也不用擔心80,8080這些常用的web埠進行備案,不好的地方就是PC要關機,虛擬機器環境自然要關機,由於無線網路ip地址變化,每次啟動虛擬機器環境後需要搗鼓網路,因為既要能夠上公網(為了能夠從公共映象倉庫拉取映象),也要保證節點註冊不受影響。
2)Pod中可配置項很多,本實驗只是列舉了一部分,主要目的是簡單介紹如何使用Pod。在k8s中直接操作Pod的機會不多,更多的是通過deployment,ReplicationController,ReplicaSet,Service,Job等元件來自動排程和操作Pod。
更多配置項及解釋可參照如下:(轉自網路:https://www.jianshu.com/p/35dde2b1951b )
apiVersion: v1 #指定api版本,此值必須在kubectl apiversion中
kind: Pod #指定建立資源的角色/型別
metadata: #資源的後設資料/屬性
name: web04-pod #資源的名字,在同一個namespace中必須唯一
labels: #設定資源的標籤,詳情請見http://blog.csdn.net/liyingke112/article/details/77482384
k8s-app: apache
version: v1
kubernetes.io/cluster-service: "true"
annotations: #自定義註解列表
- name: String #自定義註解名字
spec:#specification of the resource content 指定該資源的內容
restartPolicy: Always #表明該容器一直執行,預設k8s的策略,在此容器退出後,會立即建立一個相同的容器
nodeSelector: #節點選擇,先給主機打標籤kubectl label nodes kube-node1 zone=node1
zone: node1
containers:
- name: web04-pod #容器的名字
image: web:apache #容器使用的映象地址
imagePullPolicy: Never #三個選擇Always、Never、IfNotPresent,每次啟動時檢查和更新(從registery)images的策略,
# Always,每次都檢查
# Never,每次都不檢查(不管本地是否有)
# IfNotPresent,如果本地有就不檢查,如果沒有就拉取
command: ['sh'] #啟動容器的執行命令,將覆蓋容器中的Entrypoint,對應Dockefile中的ENTRYPOINT
args: ["$(str)"] #啟動容器的命令引數,對應Dockerfile中CMD引數
env: #指定容器中的環境變數
- name: str #變數的名字
value: "/etc/run.sh" #變數的值
resources: #資源管理,請求請見http://blog.csdn.net/liyingke112/article/details/77452630
requests: #容器執行時,最低資源需求,也就是說最少需要多少資源容器才能正常執行
cpu: 0.1 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值為0.001核(1m)
memory: 32Mi #記憶體使用量
limits: #資源限制
cpu: 0.5
memory: 32Mi
ports:
- containerPort: 80 #容器開發對外的埠
name: httpd #名稱
protocol: TCP
livenessProbe: #pod內容器健康檢查的設定,詳情請見http://blog.csdn.net/liyingke112/article/details/77531584
httpGet: #通過httpget檢查健康,返回200-399之間,則認為容器正常
path: / #URI地址
port: 80
#host: 127.0.0.1 #主機地址
scheme: HTTP
initialDelaySeconds: 180 #表明第一次檢測在容器啟動後多長時間後開始
timeoutSeconds: 5 #檢測的超時時間
periodSeconds: 15 #檢查間隔時間
#也可以用這種方法
#exec: 執行命令的方法進行監測,如果其退出碼不為0,則認為容器正常
# command:
# - cat
# - /tmp/health
#也可以用這種方法
#tcpSocket: //通過tcpSocket檢查健康
# port: number
lifecycle: #生命週期管理
postStart: #容器執行之前執行的任務
exec:
command:
- 'sh'
- 'yum upgrade -y'
preStop:#容器關閉之前執行的任務
exec:
command: ['service httpd stop']
volumeMounts: #詳情請見http://blog.csdn.net/liyingke112/article/details/76577520
- name: volume #掛載裝置的名字,與volumes[*].name 需要對應
mountPath: /data #掛載到容器的某個路徑下
readOnly: True
volumes: #定義一組掛載裝置
- name: volume #定義一個掛載裝置的名字
#meptyDir: {}
hostPath:
path: /opt #掛載裝置型別為hostPath,路徑為宿主機下的/opt,這裡裝置型別支援很多種
相關文章
- k8s學習 - 概念 - PodK8S
- k8s實戰 2 ---- pod 基礎K8S
- k8s之pod排程K8S
- k8s之pod講解K8S
- 小丸子學Docker系列之——實戰DockerfileDocker
- Docker與K8S實戰系列教程--靠譜、易學DockerK8S
- k8s入門之pod(四)K8S
- k8s之深入解剖Pod(一)K8S
- k8s之深入解剖Pod(二)K8S
- k8s之深入解剖Pod(三)K8S
- Docker 與 K8S學習筆記(十八)—— Pod的使用DockerK8S筆記
- Elasticsearch學習系列三(搜尋案例實戰)Elasticsearch
- k8s podK8S
- 深度學習之PyTorch實戰(4)——遷移學習深度學習PyTorch遷移學習
- MySQL入門學習之——實戰XtraBackupMySql
- MySQL入門學習之——實戰mysqldumpMySql
- Docker 與 K8S學習筆記(十九)—— Pod的配置管理DockerK8S筆記
- K8S POD控制器:從基礎到高階實戰技巧K8S
- K8S Pod 新安全策略 Pod Security Admission 介紹 | K8S Internals 系列第一期K8S
- Python學習6之簡單實戰Python
- [Docker 系列]docker 學習七,DockerFile 編寫和實戰Docker
- 【Docker 系列】docker 學習七,DockerFile 編寫和實戰Docker
- Android學習系列(42)--Android Studio實戰技巧Android
- webpack 學習筆記:實戰之 babel 編碼Web筆記Babel
- k8s網路之calico學習K8S
- shiro實戰系列(二)之入門實戰續
- 深入掌握K8S PodK8S
- Docker 與 K8S學習筆記(二十)—— 使用Downward API向容器注入Pod資訊DockerK8S筆記API
- docker 學習筆記之實戰 lnmp 環境搭建系列 (2) ------ 手動搭建 lnmp 環境Docker筆記LNMP
- docker 學習筆記之實戰 lnmp 環境搭建系列 (1) —— docker 介紹與安裝Docker筆記LNMP
- gRPC學習之五:gRPC-Gateway實戰RPCGateway
- 一文讀懂k8s之Pod安全策略K8S
- K8S之yaml 檔案詳解pod、deployment、service(轉)K8SYAML
- k8s基本單位PodK8S
- 域滲透之ATT&CK實戰系列——紅隊實戰(一)
- DDD實戰課(實戰篇)--學習筆記筆記
- 強化學習之蒙特卡洛學習,時序差分學習理論與實戰強化學習
- 【Redis 系列】redis 學習十一,redis 的哨兵模式詳解和實戰Redis模式