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

NAME                               READY     STATUS    RESTARTS           AGE
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 运行

NAME               READY     STATUS    RESTARTS     AGE             IP                      NODE             NOMINATED        NODE            READINESS GATES
filebeat-2pckn     1/1           Running            0            3m34s   10.244.2.56            k8s-node1             <none>             <none>
filebeat-9wn4m   1/1           Running            0            3m34s   10.244.1.188          k8s-node2             <none>             <none>
查看相关的配置清单

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, 默认 1
  • spec.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

 

posted @ 2019-04-25 17:18  屌丝的IT  阅读(618)  评论(0)    收藏  举报