k8s之pod控制器

Pod控制器类型:

  ReplicationController  à Replicaset

Replicaset:维持用户期望的pod副本数  标签选择器:以便选定由自己选定管理的pod副本  pod资源模板:完成pod资源的新建

特点:管理无状态的pod资源,精确反映用户所定义的目标数量

K8s不建议直接使用Replicaset,而是使用Deployment

Deployment:工作在replicaset上,通过控制replicaset来控制pod

           Deployment具备replicaset功能,还具有滚动更新,回滚,等更多强大机制,还提供声明式配置功能,管理群体,而不关注单个节点

DaemSet:确保集群中的每一个node只运行一个特定的pod副本,实现系统级的后台任务,也具有标签选择器,也可以指定部分满足条件的node运行一个pod副本,比如监控具有ssd存储的node节点

以上共同的特点:pod服务无状态,pod服务必须是守护进程类的,

Job:一次性作业,任务完成,pod退出

Cronjob:周期性运行,每一次完成,pod退出

Statefulset:管理有状态的运用pod,每一个pod运用,每一个pod副本,都是单独管理,

备注:

TPR: third party resource,  1.2 ~ 1.7版本 支持第三方资源

CDR: custom defined resource ,  1.8+版本  支持自定义资源

Operator

Helm:

Pod控制详解:

ReplicaSet

kubectl explain replicaset

kubectl explain rs

spec控制器规格

kubectl explain rs.spec

模板 既pod模板

kubectl explain rs.spec.template

模板规格 pod模板规格

kubectl explain rs.spec.template.spec

实例:定义一个replicaset控制器

vim replicaset-demo.yaml

apiVersion: apps/v1  控制器版本

kind: ReplicaSet  类型

metadata:    控制器元数据

  name: myapp  控制器name 也是创建的pod的名称

  namespace: default  控制器名称空间

spec:  控制器规格

  replicas: 2  创建2个副本

  selector:  控制器选择器

    matchLabels:  匹配

      app: myapp  选择的pod标签

      release: canary

  template:   pod模板

    metadata:  pod模板元数据

      name: myapp-pod  pod模板的pod名,实际使用选择器的name

      labels:  pod模板的pod标签

        app: myapp  pod模板pod标签名

        release: canary 

        environment: qa

    spec:  pod模板的pod的spec

      containers:

      - name: myapp-container

        image: ikubernetes/myapp:v1

        ports:

        - name: http

          containerPort: 80

创建replicaset选择器和pod

kubectl create -f replicaset-demo.yaml

查询验证

kubectl get rs  查询replicaset控制器类下的控制器

kubectl get replicaset

kubectl get pods

kubectl describe pod myapp-r65th

验证创建的replicaset控制器

kubectl delete pods myapp-r65th 删除一个pod,replicaset控制器会重新创建一个pod,以维持2个pod

kubectl get pods

如果pod数量大于2个

kubectl get pods --show-labels

kubectl create -f pod-demo.yaml

kubectl label pods pod-demo release=canary  这种情况pod的label标签和 myapp的一样,控制器replicaset会认为是和myapp同类型的pod,那么就会随机终止并删一个这样的pod以维持2个副本

kubectl get pods --show-labels

动态扩容:

kubectl edit rs myapp

kubectl edit replicaset myapp

修改replicas: 的值即可

动态升级:

kubectl edit rs myapp

kubectl edit replicaset myapp

kubectl edit 控制器类型 控制器名

修改- image:ikubernetes/myapp:v2即可

查询版本验证

kubectl get rs -o wide

注:只是升级镜像,容器升级需要重新建

kubectl delete pod myapp-k2kqx

重新创建的pod就用升级版本了

kubectl delete rs myapp  删除replicaset类下的myapp控制器和pod

Deploy

 基于在replicaset之上的更新逻辑,更新策略

kubectl explain deploy

kubectl explain deploy.spec 与replicaset相近

revisionHistoryLimit         <integer>  保留多少个历史版本 既保留多少个上个版本

kubectl explain deploy.spec.strategy  更新策略

kubectl explain deploy.spec.strategy.rollingUpdate 滚动更新

kubectl explain deploy.spec.template   创建pod模板

实例:

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:v1

        ports:

        - name: http

          containerPort: 80

kubectl apply -f deploy-demo.yaml  apply:声明式创建,即可以创建,也可以更新

kubectl get deploy

kubectl get pods -o wide

kubectl get rs  同时也创建了replicaset控制器

deploy更新运用

vim deploy-demo.yaml

修改:replicas: 3

重新声明,即可以修改完成

kubectl apply -f deploy-demo.yaml

kubectl get pods

kubectl describe deploy myapp 查看deploy下的myapp控制器详细描述信息默认rollingupdate 滚动更新

滚动更新

kubectl get pods -l app=myapp –w 监控滚动更新

vim deploy-demo.yaml

修改image: ikubernetes/myapp:v2

kubectl apply -f deploy-demo.yaml  就可以看到滚动更新,默认25%

kubectl get rs -o wide 可以看到创建了新的replicaset,旧的replicaset保留用于回滚

kubectl rollout history deploy myapp-deploy 查看滚动历史

打补丁扩容

kubectl patch  --help

kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}'

             控制器类  控制器名  参数  yaml文件下对应

kubectl get pods 验证

pause更新几个之后暂停更新

kubectl explain deploy.spec.strategy.rollingUpdate

kubectl patch deploy myapp-deploy -p

'{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'

                    滚动       最多多余几个可用  最少少于几个不可用

kubectl describe deploy my-app  查看补丁结果

启动更新版本

kubectl set image –help

kubectl get pods -l app=myapp –w 先监控

kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 && kubectl

rollout pause deploy myapp-deploy

      终止更新

kubectl rollout resume deployment myapp-deploy  继续更新

另一种监控方式

kubectl rollout status deploy myapp-deploy

kubectl get rs -o wide 将会看到3个replicaset版本

回滚

kubectl rollout  --help

kubectl rollout history  deploy myapp-deploy 查看滚动的版本历史

kubectl rollout undo deploy myapp-deploy --to-revision=1

                                     回滚到版本1

kubectl rollout history  deploy myapp-deploy 回滚之后版本1变成版本4

kubectl get rs -o wide 此时工作的replicaset  的是v1

daemonset

在整个集群的每一个节点上只运行一个指定的pod,或在指定的节点上运行一个pod,,实现系统级的管理功能,可以把节点上的某个目录作为一个存储卷,关联至pod中,让pod实现某些管理功能,支持滚动更新

kubectl explain ds

kubectl explain daemonset

kubectl explain daemonset.spec

kubectl explain pods.spec.containers  查询env容器环境变量

kubectl explain pods.spec.containers.env

实例

cp deploy-demo.yaml ds-demo.yaml

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-ds

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

        env:

        - name: REDIS_HOST

          value: redis.default.svc.cluster.local #如果获取不到域名,就填redis的实际IP

        - name: REDIS_LOG_LEVEL

          value: info

kubectl apply -f ds-demo.yaml 创建pod

kubectl get pods 查询

kubectl logs myapp-ds-w6dhg 查询日志

创建服务

kubectl expose deploy redis --port=6379

                 服务名  暴露端口               

kubectl get service 查询服务

kubectl exec -it redis-5c998b644f-zv7nj -- /bin/sh 验证redis发日志

# netstat –ntl

# nslookup redis.default.svc.cluster.local  解析地址

解析不到就用实际IP

kubectl get pods -o wide  找到redis  pod 的ip 10.244.1.25

# redis-cli -h  10.244.1.25 进入redis

#  > keys * 没有日志

# printenv  打印环境变量

#kill -1 重载配置文件 重载信号

kubectl exec -it filebeat-ds-ztj2h  -- /bin/sh  进入filebeat查看filebeat服务是否启动

# ps aux 进程存在,说明服务已经启动

修改redis地址:        - name: REDIS_HOST

                        value: 10.244.1.25

kubectl apply -f ds-demo.yaml

kubectl apply -f  /tmp/kubectl-edit-t7h63.yaml 再次引用

注:kill  -1 重载配置文件 重载信号

 滚动更新

kubectl explain daemonset.spec.updateStrategy

kubectl explain daemonset.spec.updateStrategy.rollingUpdate

查看是否有默认滚动更新

kubectl describe ds filebeat

执行滚动更新

kubectl get pods -o wide -l app=filebeat –w  先监控

kubectl set image –help

kubectl set image daemonsets filebeat-ds  filebeat=ikubernetes/filebeat:5.6.6-alpine

                控制器类   控制器名  容器名=镜像名

注:

容器可以共享使用宿主机的网络名称空间,那么容器中监听的端口就是监听在宿主机上了,也就是外面网络可以直接访问容器了,(hostNetwork状态必须为true,默认是false)

kubectl explain pods.spec.hostNetwork

原文地址:https://www.cnblogs.com/leiwenbin627/p/11296275.html