k8s学习笔记-pod控制器
k8s资源对象(控制器):
参考资源:
https://feisky.gitbooks.io/kubernetes/concepts/deployment.html
https://www.kubernetes.org.cn/docs
ReplicationController
ReplicaSet
Deployment
DaemonSet
Jod
Cronjob
StatefulSet
TPR:Third Party Resources 第三方资源 1.2+ 1.7 1.2 支持, 1.7 废弃了
CDR: Custom Defined Resources 自定义资源 1.8+
Operator: 封装运维功能,还在开发阶段
Helm: 等同于yum
参考资料:https://blog.51cto.com/12462495/2084517?tdsourcetag=s_pcqq_aiomsg
Replication Controller(RC)
1.可以通过定义RC实现Pod的创建过程及副本数量的自动控制。
2.RC里面包括完整的Pod定义模板。
3.RC 通过Label Selector (等值的)机制实现对Pod副本的自动控制。
4.通过修改RC的Pod副本数量可以实现Pod的扩容和缩容功能。
5.通过改变RC里Pod模板中的镜像版本可以实现Pod的滚动升级功能。
kubectl explain rc.spec
kubectl explain rc.spec.template.spec
vim rc-demo.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 3
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
ReplicaSet(RS)
和RC 一样,只是标签选择多了集合的功能,后续让Deployments取代
kubectl explain rs.spec
kubectl explain rs.spec.template.spec
vim rs-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
name: myapp-pod
labels:
app: myapp
release: canary
environment: qa
spec:
containers:
- name: myapp-container
image: ikubernetes/myapp:v1
ports:
- name: http
- containerPort: 80
可以动态修改,把replicas: 2 修改成 replicas: 5
[root@k8s-master k8s]# kubectl edit rs myapp
replicaset.extensions/myapp edited
[root@k8s-master k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-7vpxn 1/1 Running 0 8s
myapp-c9kh7 1/1 Running 0 13m
myapp-dqmzr 1/1 Running 0 8s
myapp-v5jm2 1/1 Running 0 11m
myapp-wjw9r 1/1 Running 0 8s
当然并不是修改了里面的资源参数就生效,比如更新镜像版本,不会修改的
image: ikubernetes/myapp:v2 只有手动删除POD,才会更新。
kubectl delete pod myapp-7vpxn
在看新生成的Pod就会看到效果了,需要人工参与进去
所以接下来Deployment取代了RS,实现智能部署
Deployment
为Pod和Replica Set(下一代Replication Controller)提供声明式更新
用来替代以前的ReplicationController来方便的管理应用
滚动升级和回滚应用
扩容和缩容
暂停和继续Deployment
它是3级的结构,通过rs来控制Pod

参考:https://www.kubernetes.org.cn/deployment
kubectl explain deploy
kubectl explain deploy.spec 多的字段 strategy
kubectl explain deploy.spec.strategy
kubectl explain deploy.spec.strategy.rollingUpdate
vim deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
labels:
app: myapp
release: canary
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v2
ports:
- name: http
- containerPort: 80
kubectl apply -f deploy-demo.yaml
deployment.apps/myapp-deploy created
apply声明式的发布资源,这样可以持续修改配置文更新资源 我这里修改了 replicas: 3 然后在修改 为 5
通过命令查看详细消息
[root@k8s-master k8s]# kubectl apply -f deploy-demo.yaml
deployment.apps/myapp-deploy configured
kubectl describe deploy myapp-deploy
Name: myapp-deploy
Replicas: 5 desired | 5 updated | 5 total | 5 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Normal ScalingReplicaSet 3m45s deployment-controller Scaled up replica set myapp-deploy-65df64765c to 2
Normal ScalingReplicaSet 67s deployment-controller Scaled up replica set myapp-deploy-65df64765c to 3
Normal ScalingReplicaSet 27s deployment-controller Scaled up replica set myapp-deploy-65df64765c to 5
可以通过打补丁的方式修改
kubectl patch --help
[root@k8s-master k8s]# kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":3}}'
deployment.extensions/myapp-deploy patched
[root@k8s-master k8s]# kubectl get pods -l app=myapp -w 动态的看POD 的状态
当然也看有通过kubectl set --help 这里我修改了镜像版本V1 到V2
kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v2

因为deployment 是通过控制rs来实现部署的,所以创建的时候RS也创建了,所以通过查看rs 就知道deployment控制几个rs
这里全部升级到V2 了,但是还有保留v1是为后续回滚用。
[root@k8s-master k8s]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myapp-deploy-65df64765c 0 0 0 7m17s myapp ikubernetes/myapp:v1 app=myapp,pod-template-hash=65df64765c,release=canary
myapp-deploy-6b56d98b6b 3 3 3 66s myapp ikubernetes/myapp:v2 app=myapp,pod-template-hash=6b56d98b6b,release=canary
kubectl explain deploy.spec.strategy.rollingUpdate
[root@k8s-master k8s]# kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
deployment.extensions/myapp-deploy patched
[root@k8s-master k8s]# kubectl describe deployment myapp-deploy
RollingUpdateStrategy: 0 max unavailable, 1 max surge
金丝雀发布模式:先更新一个看效果,没问题在更新所有
kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment myapp-deploy
deployment.extensions/myapp-deploy image updated
deployment.extensions/myapp-deploy paused
[root@k8s-master k8s]# kubectl get pods -l app=myapp -w
NAME READY STATUS RESTARTS AGE
myapp-deploy-6b56d98b6b-29k42 1/1 Running 0 16m
myapp-deploy-6b56d98b6b-cdj2l 1/1 Running 0 16m
myapp-deploy-6b56d98b6b-swwvb 1/1 Running 0 16m
myapp-deploy-548f47d899-lwfbv 0/1 Pending 0 0s
myapp-deploy-548f47d899-lwfbv 0/1 Pending 0 0s
myapp-deploy-548f47d899-lwfbv 0/1 ContainerCreating 0 0s
myapp-deploy-548f47d899-lwfbv 1/1 Running 0 11s
刚好更新一个停止了,查看消息
[root@k8s-master k8s]# kubectl rollout status deployment myapp-deploy
Waiting for deployment "myapp-deploy" rollout to finish: 1 out of 3 new replicas have been updated...
如果发现正常,可以继续更行
[root@k8s-master k8s]# kubectl rollout resume deployment myapp-deploy
deployment.extensions/myapp-deploy resumed
[root@k8s-master k8s]# kubectl get pods -l app=myapp -w 查看效果
kubectl rollout history deployment myapp-deploy 查看回滚的记录 这样看不到具体的命令
deployment.extensions/myapp-deploy
REVISION CHANGE-CAUSE
1 <none>
3 <none>
4 <none>
kubectl create -f nginx-deployment.yaml --record
deployment "nginx-deployment" created
将kubectl的 —record 的flag设置为 true可以在annotation中记录当前命令创建或者升级了该资源。
例如,查看在每个Deployment revision中执行了哪些命令
#kubectl rollout history deployment/nginx-deployment
deployments "nginx-deployment":
REVISION CHANGE-CAUSE
1 kubectl create -f nginx-deployment.yaml --record
2 kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
DaemonSet
保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:
日志收集,比如fluentd,logstash等
系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
系统程序,比如kube-proxy, kube-dns, glusterd, ceph等
DaemonSet会忽略Node的unschedulable状态,有两种方式来指定Pod只运行在指定的Node节点上:
nodeSelector:只调度到匹配指定label的Node上
nodeAffinity:功能更丰富的Node选择器,比如支持集合操作
podAffinity:调度到满足条件的Pod所在的Node上
参考https://www.kubernetes.org.cn/daemonset
kubectl explain ds
kubectl explain ds.spec
下面是一个filebet 的应用实例
vim ds-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis
role: logstor
template:
metadata:
labels:
app: redis
role: logstor
spec:
containers:
- name: redis
image: redis:4.0-alpine
ports:
- name: redis
containerPort: 6379
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: default
spec:
selector:
matchLabels:
app: filebeat
release: stable
template:
metadata:
labels:
app: filebeat
release: stable
spec:
containers:
- name: filebeat
image: ikubernetes/filebeat:5.6.7-alpine
env:
- name: REDIS_HOST
value: 'redis'
- name: REDIS_LOG_LEVEL
value: info
kubectl apply -f ds-demo.yaml
daemonset.apps/myapp-ds created
[root@k8s-master k8s]# kubectl get pods
filebeat-2pckn 1/1 Running 0 15s
filebeat-9wn4m 1/1 Running 0 15s
redis-85b846ff9c-h46ms 1/1 Running 0 15s
kubectl logs filebeat-2pcknf
2019/04/24 14:01:35.307438 beat.go:297: INFO Home path: [/usr/local/bin] Config path: [/usr/local/bin] Data path: [/usr/local/bin/data] Logs path: [/usr/local/bin/logs]
2019/04/24 14:01:35.307465 beat.go:192: INFO Setup Beat: filebeat; Version: 5.6.7
[root@k8s-master k8s]# kubectl get pods -l app=filebeat -o wide 可以证明每个节点只能有一个POD 运行
filebeat-2pckn 1/1 Running 0 3m34s
filebeat-9wn4m 1/1 Running 0 3m34s
kubectl explain ds.spec.updateStrategy
kubectl explain ds.spec.updateStrategy.rollingUpdate 滚动更新
滚动更新
v1.6 + 支持 DaemonSet 的滚动更新,可以通过 .spec.updateStrategy.type 设置更新策略。目前支持两种策略
- OnDelete:默认策略,更新模板后,只有手动删除了旧的 Pod 后才会创建新的 Pod
- RollingUpdate:更新 DaemonSet 模版后,自动删除旧的 Pod 并创建新的 Pod
在使用 RollingUpdate 策略时,还可以设置
.spec.updateStrategy.rollingUpdate.maxUnavailable, 默认 1spec.minReadySeconds,默认 0
回滚
v1.7 + 还支持回滚
# 查询历史版本
$ kubectl rollout history daemonset <daemonset-name>
# 查询某个历史版本的详细信息
$ kubectl rollout history daemonset <daemonset-name> --revision=1
# 回滚
$ kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>
# 查询回滚状态
$ kubectl rollout status ds/<daemonset-name>
kubectl describe ds filebeat
[root@k8s-master k8s]# kubectl set image daemonsets filebeat filebeat=ikubernetes/filebeat:5.6.6-alpine
daemonset.extensions/filebeat image updated
kubectl get pods -w

浙公网安备 33010602011771号