第五章 執行應用 第五章 執行應用
第五章 執行應用
轉載自:
https://www.cnblogs.com/liufei1983/p/10190321.html5.1 Deployment
5.1.1 執行Deployment
kubectl create namespace liufei # 建立namespace
kubectl run nginx-deployment -n liufei --image=nginx:1.7.9 --replicas=2 # 執行deployment
kubectl get deployment -n liufei # 檢視deployment
kubectl describe deployment -n liufei # 檢視deployment更詳細的資訊
kubectl get replicaset -n liufei # 檢視副本控制器
kubectl describe replicaset -n liufei # 副本控制器詳細資訊
總結一下執行deployment的過程:
A:使用者通過kubectl建立deployment。
B:Deployment建立ReplicaSet。
C:ReplicaSet建立Pod。
5.1.2 命令 VS 配置檔案
K8s兩種建立資源的方式:
(1)用kubectl命令的方式直接建立:比如前面的建立deployment
(2)通過配置檔案和kubectl apply建立,
kubectl apply -f nignx.yml
apiVersion: extensions/v1beta1 # 配置格式的版本
kind: Deployment # 建立的資源型別,這裡是deployment
metadata: # 元資料
name: nginx-deployment # name是必須的元資料
spec: # spec是Deployment的規格說明
replicas: 2 # 副本數量
template: # Pod的模板
metadata: # Pod的元資料,至少要定義label
labels:
app: web_server # label的key和value可以隨意指定
spec: # 描述Pod的規格,此部分定義Pod中每一個容器的屬性,name和image是必須的
containers:
- name: nginx
image: nginx:1.7.9
5.1.3 Deployment配置檔案簡介
上面檔案中介紹了各個欄位的含義。
如何刪除這些資源:
kubectl delete deployment nginx-deployment # 刪除之後deployment 和 pods就都沒有了。
或 kubectl delete -f nginx.yml
5.1.4 伸縮(線上增加或減少Pod的副本數)
可以改replicas的數來更改Pod副本數量。預設不會將Pod排程到Master節點。當然,通過命令也可以將Master節點也當做Node來用。
如何使得Deployment的改動生效:
(1)改動nginx.yml檔案後, 直接執行 kubeclt apply -f nginx.yml 就可以生效。
(2) kubectl edit deployment deployment_XXXX, 改動後,儲存,即刻生效。
5.1.5 Failover
當有一個Node故障時,k8s會檢測到,並且Pod狀態會變成Unknown, 其他狀態良好的Node上回建立新Pod來保證Pod副本的數量。
5.1.6 用label控制Pod的位置
預設,Scheduler會將Pod排程到所有可用的Node。但是有時希望將Pod部署到指定的Node,比如將有大量磁碟IO的Pod部署到配置了SSD的Node;或者Pod需要GPU,需要執行在配置了GPU的節點上。
K8s通過label來實現這個功能。
label是key-value對,各種資源都可以設定label,靈活新增各種自定義屬性。比如執行如下命令標註galaxykubernetes03 是配置了SSD的節點。
kubectl label node galaxykubernetes03 disktype=ssd # 給節點打上label
kubeusr@GalaxyKubernetesMaster:~$ kubectl label node galaxykubernetes03 disktype=ssd
node "galaxykubernetes03" labeled
kubectl get node --show-labels # 檢視label
可以發現galaxykubernetes03 被打上了label
下面可以指定將Pod部署到galaxykubernetes03, 編輯nginx.yml
在Pod模板的spec裡通過nodeSelector指定將此Pod部署到具有label具有disktype=ssd的node上。
然後檢視pod執行情況:發現Pod都執行在指定的node上了。
kubeusr@GalaxyKubernetesMaster:~$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-deployment-6fdd68f578-7djlh 1/1 Running 0 14s 10.244.2.40 galaxykubernetes03
nginx-deployment-6fdd68f578-dqhlb 1/1 Running 0 14s 10.244.2.41 galaxykubernetes03
nginx-deployment-6fdd68f578-hr9fd 1/1 Running 0 14s 10.244.2.43 galaxykubernetes03
nginx-deployment-6fdd68f578-n2jh6 1/1 Running 0 14s 10.244.2.39 galaxykubernetes03
nginx-deployment-6fdd68f578-r5rx6 1/1 Running 0 14s 10.244.2.42 galaxykubernetes03
刪除label:
kubectl label node galaxykubernetes03 disktype-
5.2 DaemonSet
Deployment部署的副本Pod會分佈在各個Node上,每個node都可能執行好幾個副本。
DaemonSet的不同之處是: 每個Node上最多隻能執行一個副本。其典型應用場景:
(1)在叢集的每個節點上執行儲存Daemon,比如glusterd或ceph
(2)在每個節點上執行日誌收集Deamon,比如flunentd或 logstash。
(3)在每個節點上執行監控Deamon,比如Prometheus Node Exporter或collectd.
kubeusr@GalaxyKubernetesMaster:~$ kubectl get DaemonSet -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-flannel-ds 5 5 5 5 5 beta.kubernetes.io/arch=amd64 127d
kube-proxy 5 5 5 5 5 <none> 127d
5.2.1 kube-flannel-ds
5.2.2 kube-proxy
kubeusr@GalaxyKubernetesMaster:~$ kubectl edit daemonSet kube-proxy --namespace=kube-system
5.2.3 執行自己的daemonSet
略
5.3 Job
Job適於:
(1)一次性任務,比如批處理,執行完就銷燬
(2)定期執行的任務, 比如Cronjob
apiVersion: batch/v1 # Job的apiVersion
kind: Job
metadata:
name: myjob
spec:
template:
metadata:
name: myjob
spec:
containers:
- name: hello
image: busybox
command: ["echo", "hell k8s job! "]
restartPolicy: Never # 在什麼情況下會重啟容器,對於job可以是Never or OnFailure。 對於controller(deployment)可以是Always
kubectl apply -f myjob.yml
job.batch "myjob" created
kubeusr@GalaxyKubernetesMaster:~$ kubectl get job
NAME DESIRED SUCCESSFUL AGE
myjob 1 1 3mkubeusr@GalaxyKubernetesMaster:~$ kubectl get pod --show-all
kubectl get pod --show-all (書上說需要使用--show-all引數才能看見completed 狀態的jOb,但是我不加--show-all, 也能看見)
Flag --show-all has been deprecated, will be removed in an upcoming release
NAME READY STATUS RESTARTS AGE
myjob-mx6rc 0/1 Completed 0 4m # Job已經執行完了
nginx-deployment-6fdd68f578-7djlh 1/1 Running 0 10h
nginx-deployment-6fdd68f578-dqhlb 1/1 Running 0 10h
nginx-deployment-6fdd68f578-hr9fd 1/1 Running 0 10h
nginx-deployment-6fdd68f578-n2jh6 1/1 Running 0 10h
nginx-deployment-6fdd68f578-r5rx6 1/1 Running 0 10h
檢視job輸出的日誌
kubectl logs -f myjob-mx6rc
hell k8s job!
5.3.1 Pod失敗的情況
看如下的命令。
kubeusr@GalaxyKubernetesMaster:~$ kubectl get job
NAME DESIRED SUCCESSFUL AGE # SUCCESSFUL的數目為0
myjob 1 0 31s
/*/*/*/*/*/*/*/*
kubeusr@GalaxyKubernetesMaster:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
myjob-n2bwz 0/1 ContainerCannotRun 0 1m
myjob-pmx7t 0/1 ContainerCannotRun 0 1m
myjob-rzm5m 0/1 ContainerCreating 0 43s
nginx-deployment-6fdd68f578-7djlh 1/1 Running 0 10h
nginx-deployment-6fdd68f578-dqhlb 1/1 Running 0 10h
nginx-deployment-6fdd68f578-hr9fd 1/1 Running 0 10h
nginx-deployment-6fdd68f578-n2jh6 1/1 Running 0 10h
nginx-deployment-6fdd68f578-r5rx6 1/1 Running 0 10h
/*/*/*/*/*/*/*/*
kubeusr@GalaxyKubernetesMaster:~$ kubectl logs -f myjob-n2bwz
container_linux.go:247: starting container process caused "exec: \"invalid_command\": executable file not found in $PATH"
5.3.2 Job的並行性
同時執行多個job,提高Job的執行效率。這個可以通過parallelism、completions設定。
實際中用處不大。
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
completions: 6 # 最多有6個job是completion狀態
parallelism: 2 # 並行2個,預設1
template:
metadata:
name: myjob
spec:
containers:
- name: hello
image: busybox
command: ["echo", "hell k8s job! "]
restartPolicy: Never
5.3.3 定時Job
Cronjob是K8s提供的定時任務。
apiVersion: batch/v2alpha1
kind: CronJob
metadata:
name: hello
spec:
schedule:"*/1 * * * *" #每分鐘啟動一次
jobTemplate: #job的模板
spec:
template:
spec:
containers:
- name:hello
image:busybox
command: ["echo", "hell k8s cron job! "]
restartPolicy:OnFailure
kubeusr@GalaxyKubernetesMaster:~$ kubectl apply -f cronjob.yml
error: unable to recognize "cronjob.yml": no matches for kind "CronJob" in version "batch/v2alpha1"
建立任務失敗。因為K8s預設沒有enable cronjob
安裝如下步驟:
(1)切換到root,進入/etc/kubernetes/manifests
執行: chmod -R 777 * 改檔案的屬性。
(2)修改 /etc/kubernetes/manifests/kube-apiserver.yaml, enable cronjob.
加上 --runtime-config=batch/v2alpha1=true
(3) 重啟kubelet服務。
systemctl restart kubelet.service
kubectl api-versions|grep v2 # 檢視是否生效
autoscaling/v2beta1
batch/v2alpha1
(4) 再次建立cronjob
kubeusr@GalaxyKubernetesMaster:~$ kubectl apply -f cronjob.yml
cronjob.batch "hello" created
kubeusr@GalaxyKubernetesMaster:~$ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 <none> 49s
kubeusr@GalaxyKubernetesMaster:~$ kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
hello-1546050900 1 1 38s
kubeusr@GalaxyKubernetesMaster:~$ kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
hello-1546050900 1 1 1m
hello-1546050960 1 0 14s
每隔一分鐘啟動一個Pod