5.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
