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文件的結尾后綴名.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
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 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
如果你在一個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 —— 持久運行
deploy job(相當於at,一次性) cj —— 相當於crond job
deploy daemon —— 持久運行
控制器job
編寫job的yaml文件:
kubectl explain job
#vim job.yaml
編寫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
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"已經執行成功了。
kubectl get job
kubectl get po #狀態是complete,完成job后退出了
kubectl logs my_job-s2grt #返回了test,說明echo "test"已經執行成功了。
restartPolicy:
Never:不重啟
Always:總是重啟,默認選項
OnFailure:只有pod異常退出時,返回碼非0就會重啟
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 “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的情況
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任務。
因為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 會報出不支持的錯誤。
當你的重啟策略為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"
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
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個。
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文件的簡單方法。
生成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 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
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 每個節點都運行了一個
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
kubectl get po -o wide #相應的pod每分鍾啟動一次
kubectl logs mycj-215123546-wert12 #返回test
svc外網訪問pod
外網訪問pod實際上是通過service,外網通過service的ip,service通過標簽選擇器來找到其對用的pod,報文的轉發是通過kube-proxy
外網訪問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
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
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
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