Kubernetes——YAML文件


kubernetes——yaml文件的編寫
yaml文件的結尾后綴名.yaml或者.yml都能夠識別。
yaml文件就像腳本一樣,可以放在任意的位置。
編寫yaml文件需要用到的幫助手冊的查看:
 kubectl explain deploy    #使用explain進行查看
 kubectl explain deploy.spec.template   #可以一級一級查下去中間用.連接即可。
 
需要提前知道的:
 imagePullPolicy有三種模式
    Nerver:不拉取鏡像,如果本地沒有鏡像,那么容器起不來。
    Always:默認選項,再使用yaml文件部署pod的時候,無論本地是否有鏡像,都嘗試拉取dockerhub上的鏡像。
    IfNotPresent:如果本地沒有再去dockerhub上拉取。

yaml文件編寫:
 #vim nginx.yaml
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
  name: nginx1
 spec:
  replicas: 2
  template:
   metadata:
    labels:
     run: nginx
   spec:
    containers:
    - name: nginx
      image: nginx
      imagePullPolicy: IfNotPresent
 
 kubectl apply -f nginx.yaml
 kubectl delete -f nginx.yaml
 #也可以通過kubectl delete deploy nginx1
 #yaml文件一定要嚴格按照格式編寫,該對齊的一定要嚴格對齊。
 # vim nginx-pod.yml
 apiVersion: v1
 kind: Pod
 metadata:
  name: nginx
 spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
   
 kubectl apply -f nginx-pod.yml
 #單獨的pod沒有deploy來管控它,這種不受管控的pod可以直接通過 kubectl delete pod nginx 來刪除。
 kubectl delete -f nginx-pod.yml
 kubectl get po
 kubectl api-resources   #查看各資源的縮寫
 
標簽Labels
labels是service(svc)找到pod的途徑
相當於是對pod打標簽
kubectl get po --show-labels    #可以查看到pod的標簽
給資源打標簽:
kubectl label no node3 disktype=ssd    #node3打上disktype=ssd的標簽
kubectl get no --show-labels
給node打上標簽之后,使用yaml文件來進行標簽選擇:
kubectl explain deploy.spec.template.spec  |  grep -C 5 -i selector 可以查看選擇器nodeSelector
 
#vim select.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: nginx2
spec:
 replicas: 5
 template:
  labels:
   run: nginx
 spec:
  nodeSelector:
   disktype: ssd
  container:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
kubectl apply -f select.yaml 
kubectl get po -o wide -w    #會發現5個都運行在了標簽為disktype=ssd的node3上。
kubectl get no --show-labels
 
k8s——集群健壯性測試
如果你在一個yaml文件中定義一個deploy運行5個pod,這5個pod在集群的node中均有分布。
如果其中的一個node節點因為某種原因宕機了,那么還會有5個pod在運行嗎?
答案是會的,因為你的deploy的預期是5個,如果你的節點down掉了,他會在其他的節點上去啟動相應的pod來滿足5個pod的要求。
使用kubectl get po -o wide 查看,會發現running狀態的pod還是5個,他會在好的節點上去啟動副本來滿足預期。
kubectl get deploy
kubectl get no -w   #可以監控node的狀態-w watch
當你的節點通過你的維護又跑起來了之后,通過kubectl get pod -o wide 查看發現:這個pod並不會再回到ken3,
因為pod一旦分布到node上部署,直到生命周期完結都不會離開相應的node
 
k8s控制器
deploy  job(相當於at,一次性) cj —— 相當於crond job
deploy daemon —— 持久運行
控制器job
編寫job的yaml文件:
kubectl explain job
#vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
 name: my_job
spec:
 template:
  spec:
   restartPolicy: Nerver   #Always是默認選項,總是重啟,Job不能使用Always
   containers:
   - name: busybox
     image: busybox
     imagePullPolicy: IfNotPresent
     args:
     - /bin/sh
     - -c
     - echo "test";sleep 3
kubectl apply -f job.yaml
kubectl get job
kubectl get po     #狀態是complete,完成job后退出了
kubectl logs my_job-s2grt   #返回了test,說明echo "test"已經執行成功了。
restartPolicy:
  Never:不重啟
  Always:總是重啟,默認選項
  OnFailure:只有pod異常退出時,返回碼非0就會重啟
kubectl delete -f  job.yaml
然后將執行的echo “test” 命令改錯,然后再啟動
kubectl apply -f job.yaml
kubectl get job
kubectl get po -w  #狀態complete之后
kubectl logs my_job-s2grt  #返回的是/bin/sh找不到這條命令
如果將echo改錯,然后取消sleep 3
kubectl get po -w   #會發現一直在生成pod,但是狀態是Error
kubectl logs my_job-swe2sd   #返回的是/bin/sh找不到這條命令
kubectl get po    #一直在出現創建pod的情況
在job失敗的時候會出現大量的pod,為什么會發生這樣的情況呢?
因為job的期望完成值是1,但是由於job的內部錯誤,導致永遠無法完成該job任務,且由於重啟的策略是Never,所以job會不斷生成新的pod
去努力試圖完成這個job任務。
要刪除直接使用kubectl delete -f job.yaml
當你的重啟策略為OnFailure的時候,這個時候job會不斷重啟一個pod來滿足自己的期望完成值。
如果你再查看的pod的狀態:kubectl get po ,它的restarts會一直不斷增加。
job不能使用Always,如果將重啟策略設為always,kubectl apply -f job.yaml 會報出不支持的錯誤。
parallelism:運行pod的時候,最大的期望pod運行數,只有再剩下的pod數小於最大期望運行數量的時候才會運行少於最大值,其他均以最大值去運行。
vim job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
 name:my-job
spec:
 parallelism: 2
 template:
  spec:
   restartPolicy: Nerver
   containers:
   - name: busybox
     image: busybox
     imagePullPolicy: IfNotPresent
     args:
     - /bin/sh
     - -c
     - echo "test"
kubectl apply -f job1.yaml
kubectl get po
還可以指定pod的運行數量:
apiVersion:batch/v1
kind: Job
metadata:
 name: my-job
spec:
 completions: 6
 parallelism: 2
 template:
  spec:
   restartPolicy: Nerver
   containers:
   - name: busybox
     image: busybox
     imagePullPolicy: IfNotPresent
     args:
     - /bin/sh
     - -c
     - echo "test"
   
kubectl apply -f job.yaml
kubectl get po    #發現同一時間是運行2個pod,一共完成6個。
 
yaml文件的自動生成
生成job的yaml文件:
kubectl create job job1 --image=busybox --dry-run -o yaml
kubectl create job job1 --image=busybox --dry-run -o yaml > job1.yaml
然后編輯這個文件做一些簡單的修改即可。這是編寫yaml文件的簡單方法。
生成deploy的yaml文件:
kubectl create deploy deploy1 --image=busybox --dry-run -o yaml > deploy1.yaml
然后修改即可
kubectl get po -o yaml     #生成極為詳細的yaml文件,在github上很多長的yaml文件就是這樣生成修改的。
yaml文件的組成: apiVersion kind metadata spec
kubectl api-resources   #查看api的縮寫

控制器daemonset
kubectl explain ds
vim ds.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
 name: myds
spec:
 template:
  metadata:
   labels:
    run: nginx
  spec:
   container:
   - name: nginx
     image: nginx
     imagePullPolicy: IfNotPresent
kubectl apply -f ds.yaml
kubectl get po -o wide     #daemonset 每個節點都運行了一個

控制器CJ
kubectl explain cj
vim cj.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
 name: mycj
spec:
 schedule: '* * * * *'
 jobTemplate:
  spec:
   template:
    spec:
     restartPolicy: OnFailure
     containers:
     - name: busybox
       image: busybox
       iamgePullPolicy: IfNotPresent
       args:
       - /bin/sh
       - -c
       - echo "test"
kubectl apply -f cj.yaml
kubectl get cj
kubectl get po -o wide  #相應的pod每分鍾啟動一次
kubectl logs mycj-215123546-wert12    #返回test
 
svc外網訪問pod
外網訪問pod實際上是通過service,外網通過service的ip,service通過標簽選擇器來找到其對用的pod,報文的轉發是通過kube-proxy
要運行svc首先要運行deploy
vim svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
 name: deploy1
spec:
 replicas: 2
 selector:
  matchLabels:
   name: ken
 template:
  metadata:
   labels:
    name:ken
  spec:
   containers:
   - image: nginx
     name: nginx
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 80   #加上這條信息相當於Expose
    
kubectl get po -o wide   #這個時候能夠看到pod的ip,但是只能集群內部訪問
kubectl get ns     #查看namespace
kubectl explain svc
 
apiVersion: apps/v1
kind: Deployment
metadata:
 name: deploy1
spec:
 replicas: 2
 selector:
  matchLabels:
   name: ken
 template:
  metadata:
   labels:
    name:ken
  spec:
   containers:
   - image: nginx
     name: nginx
     imagePullPolicy: IfNotPresent
     ports:
     - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
 name: mysvc
spec:
 selector:
  name: ken
 ports:
 - port: 80    #svc的端口
   targetPort: 80  #pod的端口
  
kubectl apply -f svc.yaml
kubectl get po -o wide
kubectl get svc    #可以查看到svc的ip以及映射到的host主機的端口在30000以上
kubectl describe svc mysvc   #可以查看到svc自己的ip,以及pod的endpoints(ip+port)
現在訪問host的ip+映射的端口即可訪問pod
也可以自己定義映射的端口,但是要在30000以上:
---
apiVersion: v1
kind: Service
metadata:
 name: mysvc
spec:
 type: NodePort
 selector:
  name: ken
 ports:
 - port: 80
   targetPort: 80
   nodePort: 30002
  
kubectl apply -f svc.yaml
kubectl get svc    #發現host的端口映射已經被更改為30002
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM