掌握各种控制器的特点以及使用定义方式
每个Pod都有一个特殊的被称为“根容器”的Pause容器。除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器
- Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂接的Volume
- Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP的直接通讯(采用虚拟二层网络技术来实现),一个Pod里的容器与另外主机上的Pod容器能够直接通信。
Pod 的分类
( 1 )普通 Pod 【控制器管理】
普通 Pod 一旦被创建,就会被放入到 etcd 中存储,随后会被 Kubernetes Master 调度到某
个具体的 Node 上并进行绑定,随后该 Pod 对应的 Node 上的 kubelet 进程实例化成一组相
关的 Docker 容器并启动起来。在默认情 况下,当 Pod 里某个容器停止时,Kubernetes 会
自动检测到这个问题并且重新启动这个 Pod 里某所有容器, 如果 Pod 所在的 Node 宕机,
则会将这个 Node 上的所有 Pod 重新调度到其它节点上。
( 2 )静态 Pod 【自主式,不能被控制器管理】
静态 Pod 是由 kubelet 进行管理的仅存在于特定 Node 上的 Pod,它们不能通过 API Server
进行管理,无法与 ReplicationController、Deployment 或 DaemonSet 进行关联,并且
kubelet 也无法对它们进行健康检查。
Service 和Pod如何关联 (通过标签关联)
为了建立Service 和Pod间的关联关系,Kubernetes 首先给每个Pod填上了一个标签Label,
Service 要作用于所有包含对应 Label的Pod上。这样就巧妙的解决了Service和Pod关联问题
~~RC
Replication Controller 用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器的异常退出,会自动创建新的pod来代替,如果异常多出来的容器也会自动回收(新版本建议使用Replica Set)~~
【在Kubernetes1.2时,它就升级成另一个新的概念—Replica Set,官方解释为"下一代的RC"】
RS
它与RC当前存在的唯一区别是:Replica Sets支持基于集合的Label selector(Set-based selector基于集合的标签选择器),而RC只支持基于等式的Label Selector(equality-based selector基于等式),这使得Replica Set的功能更强 【matchExpressions 是一个pod的选择器条件的list 】
selector:
matchLabels:
tier: frontend
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
Deployment
(Kubernetes1.2引入的新概念,引入的目的是为了更好的解决Pod的编排问题)不负责pod创建, 为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的RC来方便的管理应用 (Deployment 创建RS ,RS创建pod ;升级时 在创建一个RS1 ,RS1创建pod1 替换pod ,老的不删除,只是停用,随时回滚)
典型的应用场景:
- 定义Deployment来创建Pod和ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deploymen
StatefulSet
是为了解决有状态服务的问题(ReplicaSet和Deployment 为无状态服务)例如MySQL集群(不太稳定)、MongoDB集群(比较稳定)、kafa集群、ZooKeeper集群等。【Kubernetes在1.4版本引入了PetSet这个新资源对象,在1.5更名为"StatefulSet"】
应用场景:
- 稳定的持久化存储,pod重新调度后还是能访问到相同的持久化数据,基于PVC实现
- 稳定的网络标志,pod重新调度后podname和hostname不变,基于Headless Service(即没有Cluster
IP的Service)来实现 - 有序部署,有序扩展,pod的部署是有顺序的(即从0到N,在一下个pod运行前,之前所有pod必须是running和ready状态), 基于
init containers来实现 - 有序收缩,有序删除 (从 N到0)
Job和CronJob
job负责批处理任务,即仅执行一次的任务,他保证批处理任务的一个或多个pod成功结束
cron job管理基于时间的job (版本》=1.8)
应用场景:
- 数据库备份、发送邮件
DaemonSet
确保全部(或者一些)node上运行一个pod的副本,当有node加入集群时,也会为他们新增一个pod。当有node从集群中移除时,这些pod也会被回收,删除时将会删除它创建的所有pod
典型用法:
- 运行集群存储daemon,例如在每个node上运行glusterd,ceph
- 在每个node上运行日志搜集daemon,例如fluentd,logstash
- 在每个node上运行监控daemon,例如Promethues,Node Exporter
HPA(控制控制器,自动扩缩容)
Horizontal Pod Autoscaling 仅适用于ReplicaSet和Deployment【在V1版本中支持Pod的CPU利用率扩容】,目前HPA可以从两个地方获取数据
- Heapster: 仅支持CPU使用率
- 自定义监控
命令选择:
申明式编程 (Deployment) apply(优) create
命令式 (rs) create(优) apply
查看版本 (部署时注意版本)
-- 所有版本
kubectl api-versions
-- 不同服务的版本
-- v1
# kubectl explain ReplicationController.apiVersion
-- apps/v1
# kubectl explain ReplicaSet.apiVersion
-- apps/v1
# kubectl explain Deployment.apiVersion
-- apps/v1
# kubectl explain DaemonSet.apiVersion
-- apps/v1
# kubectl explain StatefulSet.apiVersion
-- batch/v1
# kubectl explain Job.apiVersion
-- batch/v1beta1
# kubectl explain Job.apiVersion
如出现这个错误信息:no matches for kind “ReplicaSet” in version “extensions/v1beta1” 说明使用的api版本不对,请使用上述命令获取api版本
RC例子演示
#vim rc-demo.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-demo
labels:
app: rc
spec:
replicas: 3
selector:
app: rc
template:
metadata:
labels:
app: rc
spec:
containers:
- name: nginx-demo
image: nginx
ports:
- containerPort: 80
运行
kubectl create -f rc-demo.yaml
查看rc数量 (DESIRED 设置的 ;CURRENT 已经创建的 ;READY 准备好的)
[root@k8s ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
rc-demo 3 3 2 25s
查看pod (rc的名字-随机数)【-o wide 查看详情】
[root@k8s ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE
rc-demo-65kjt 1/1 Running 0 2m32s
rc-demo-ctm6b 1/1 Running 0 2m32s
rc-demo-mlh45 1/1 Running 0 2m32s
查看rc创建详情
[root@k8s ~]# kubectl describe rc rc-demo
Name: rc-demo
Namespace: default
Selector: app=rc
Labels: app=rc
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=rc
Containers:
nginx-demo:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
副本扩容、缩容 (设置pod个数)
kubectl scale rc rc-demo --replicas=4
上述命令是在运行中执行,也可修改文件重新部署
注意:
删除RC并不会影响通过该RC已创建号的Pod。为了删除所有Pod,可以设置replicas的值为0,然后更新该RC。另外,kubectl提供了stop和delete命令来一次性删除RC和RC控制的全部Pod
# 删除rc,但是pod不会收到影响
kubectl delete rc rc-demo
# 会删除rc,也会删除rc下的所有pod
kubectl delete -f rc-demo.yaml
RS例子演示
#vim rs-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-demo
labels:
app: rs
spec:
replicas: 3
selector:
matchLabels:
app: rs
template:
metadata:
labels:
app: rs
spec:
containers:
- name: nginx-demo
image: nginx
ports:
- containerPort: 80
运行
kubectl create -f rs-demo.yaml
查看rs数量 (DESIRED 设置的 ;CURRENT 已经创建的 ;READY 准备好的)
kubectl get rs
查看pod (rs的名字-随机数)【-o wide 查看详情】
kubectl get pod -o wide
副本扩容、缩容 (设置pod个数)
kubectl scale rs rs-demo --replicas=2
删除
删除rc,但是pod不会收到影响
kubectl delete rs rs-demo
会删除rc,也会删除rc下的所有pod
kubectl delete -f rs-demo.yaml
RS+Deployment例子演示
# vim rs-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: rs-deployment
spec:
replicas: 2
selector:
matchLabels:
app: rs-deployment
template:
metadata:
labels:
app: rs-deployment
spec:
containers:
- name: nginx-demo
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
运行 【–record可以记录命令,方便查看每次的变化】
kubectl apply -f rs-deployment.yaml --record
查看 【rs 有deployment前缀 pod有rs前缀】
[root@k8s ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
rs-deployment 2/2 2 2 88s
[root@k8s ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
rs-deployment-68946dcd46 2 2 2 93s
[root@k8s ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
rs-deployment-68946dcd46-jd22w 1/1 Running 0 116s
rs-deployment-68946dcd46-kmvzx 1/1 Running 0 116s
扩容
kubectl scale deployment rs-deployment --replicas 5
如果集群支持HPA,还可以设置动态扩容
kubectl autoscale deployment rs-deployment --min=7 --max=20 --cpu-percent=80
更新containers镜像 (也可修改配置文件)
#kubectl set image deployment/rs-deployment nginx-demo=nginx:1.9.1
#deployment "rs-deployment" image updated
or
#kubectl edit deployment/rs-deployment
#deployment "rs-deployment" edited
回滚 【--to-version=? 回滚到指定版本,没指定回到上一版本】
kubectl rollout undo deployment/rs-deployment
查看回滚状态
kubectl rollout status deployment/rs-deployment
查看历史
kubectl get rs
kubectl rollout history deployment/rs-deployment
查看某一版本的详细信息
kubectl rollout history deployment/rs-deployment --revision=3
删除
kubectl delete deployment rs-deployment
kubectl delete -f rs-deployment.yaml
可以通过设置.spec.revisonHistoryLimit来指定deployment最多保留多少历史版本,默认保留所有,设置为0则不允许回退
DaemonSet例子演示
# vim ds-demo.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ds
labels:
app: nginx
spec:
selector:
matchLabels:
name: nginx-ds
template:
metadata:
labels:
name: nginx-ds
spec:
containers:
- name: nginx-ds
image: nginx
ports:
- name: http
containerPort: 80
运行
kubectl apply -f ds-demo.yaml
查看
[root@k8s ~]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-ds 2 2 2 2 2 <none> 44s
daemonSet是根据我们节点的数量进行创建(每个节点都有)
# kubectl get pod -o wide
删除
kubectl delete ds nginx-ds
kubectl delete -f ds-demo.yaml
StatefulSet例子演示
Job例子演示
# vim job-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
metadata:
name: job-demo
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox
command:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1;do echo $i;done"
运行
kubectl create -f job-demo.yaml
//待完善
查看
kubectl get job
#job任务执行完毕后状态就变更为Completed(完成状态),不会像其他pod属于running状态
[root@k8s ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
job-demo-kzskp 0/1 Completed 0 66s
#查看详细信息
kubectl describe job job-demo
#查看pod日志
kubectl logs job-demo-kzskp
删除
kubectl delete job job-demo
kubectl delete -f job-demo.yaml
注意:Job Pod类型中的RestartPolicy (pod重启策略)仅支持Never和OnFailure两种,不支持Always,Job就相当于来执行一批处理任务,执行完就结束,如果支持Always(一直重启,直到pod健康)就会陷入死循环
CronJob例子演示
#vim cronjob-demo.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
spec:
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 10
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
metadata:
name: cronjob-demo
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox
command:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1 ;do echo $i;done"
运行
kubectl create -f cronjob-demo.yaml
查看
kubectl get cronjob
#job任务执行完毕后状态就变更为Completed(完成状态),不会像其他pod属于running状态
[root@k8s ~]# kubectl get pod
#每1分钟执行一次job,执行完毕job后状态会进行保留。通过get jobs和get pod都可以看到
kubectl get jobs
kubectl get pods
删除
kubectl delete cronjob cronjob-demo
kubectl delete -f cronjob-demo.yaml
注意:我们需要给cronjob设置一个历史记录限制,否则jobs会一直增加(1.14版本默认只保留3个),在spec下面添加如下2条内容,自定义历史记录限制
successfulJobsHistoryLimit: 5 #成功保留次数
failedJobsHistoryLimit: 10 #失败保留次数