1.生产中,很少会跑一个自主式pod,一般由控制器去创建pod,其配置文件中内嵌了pod的创建方式.

pod控制器:ReplicaSet、Deployment、DaemonSet、Job、Cronjob、StatefulSet

ReplicaSet:代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能.

ReplicaSet主要由三个组件组成:

a.用户期望的pod副本数量;
b.标签选择器,判断哪个pod归自己管理;
c.pod资源模板,当现存的pod数量不足,会根据pod资源模板进行新建.

帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但RelicaSet不是直接使用的控制器,而是使用Deployment;

Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器.支持滚动更新和回滚功能,还提供声明式配置;

DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务,比如ELK中负责收集日志filebeat,特性:服务是无状态的,服务必须是守护进程;

Job:只要完成就立即退出,不需要重启或重建;

Cronjob:周期性任务控制,不需要持续后台运行;

StatefulSet:管理有状态应用.

2.ReplicaSet(rs)示例

cat rs-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-myapp
namespace: default
spec:
replicas: 2
selector:
matchLabels:
run: myapp
release: canary
template:
metadata:
name: whatever
labels:
run: myapp
release: canary
env: test
spec:
containers:
- name: nginx-web
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
template:资源模板中定义的name其实不生效,pod运行起来之后,真正的名字是控制器名+随机字符串
kubectl create -f rs-demo.yaml
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
rs-myapp-2hxc9 1/1 Running 0 74s 10.244.2.7 k8s-node2
rs-myapp-d6845 1/1 Running 0 74s 10.244.1.9 k8s-node1
curl 10.244.2.7
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
# 编辑replicatset的配置文件,这个文件不是我们手工创建的,而是apiserver维护的,修改副本数
kubectl edit rs myapp
# 也可以升级版本,将v1改成v2,但只有pod重建后,比如增加或删除Pod,才会更新成v2版本

3.Deployment控制器

图解:通过Deployment控制器来动态更新pod版本,Deployment下有众多replicatset,但只有一个是激活的,更改配置文件中的镜像版本,就会一个一个的删除replicatset v1版本中的Pod,自动新创建的pod就会变成v2版本,当pod全部变成v2版本后,replicatset v1不会被删除,这样一旦发现v2版本有问题,还可以回退到v1版本,通常deployment默认保留10个版本的replicatset.

kubectl explain deploy  # 文档是落后于k8s版本的
deploy示例:
cat 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
# apply:声明式更新和创建,可以应用多次,create只能用一次
kubectl apply -f deploy-demo.yaml
kubectl get deploy # 会看见一个名为myapp-deploy的deploy生成
kubectl get rs
NAME DESIRED CURRENT READY AGE
myapp-deploy-574965d786 2 2 2 93s
kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-deploy-574965d786-5x42g 1/1 Running 0 70s
myapp-deploy-574965d786-dqzpd 1/1 Running 0 70s # 默认滚动策略是RollingUpdate,查看滚动更新的历史
kubectl rollout history deployment myapp-deploy # 如果要修改副本数,则编辑deploy-demo.yaml修改副本数,或者:
kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}'
# 给更新策略打补丁:
kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
# maxSurge:pod的数量最多可超出期望值多少个;maxUnavailable:最多不可用的pod有多少个. # 金丝雀发布,先发布一个,此时多了一个pod,现在有6个
# 用set image命令将镜像myapp升级为v3版本,并且将myapp-deploy控制器标记为暂停,
# 被暂停的资源不会被控制器使用,可以使"kubectl rollout resume"命令恢复已暂停资源
kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3
&& kubectl rollout pause deployment myapp-deploy
kubectl get pods -l app=myapp -w
# resume:继续,重新开始,可以看到继续更新,删一个更新一个
kubectl rollout status deployment myapp-deploy
kubectl rollout resume deployment myapp-deploy
# 查看副本集的详细信息
kubectl get rs -o wide
# 版本回滚
kubectl rollout history deployment myapp-deploy
kubectl rollout undo deployment myapp-deploy --to-revision=1

4.DaemonSet示例

# node1、node2下载filebeat镜像
docker pull ikubernetes/filebeat:5.6.5-alpine
cat 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
- name: REDIS_LOG_LEVEL
value: info # REDIS_HOST这个键值对是filebeat-ds向filebeat配置文件传的环境变量
kubectl apply -f ds-demo.yaml
# 暴露redis端口
kubectl expose deployment redis --port=6379
# 进入redis
kubectl exec -it redis-664bbc646b-sg6wk -- /bin/sh
/data # redis-cli -h redis.default.svc.cluster.local
# 进入filebeat
kubectl exec -it filebeat-ds-bszfz -- /bin/sh
nslookup redis.default.svc.cluster.local
# daemon-set也支持滚动更新
kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filebeat:5.5.7-alpine
kubectl explain pods.spec # 有一个字段hostNetwork,可以让容器直接共享宿主机的网络
注:不同pod之间通信,filebeat向redis发送日志靠的是service

参考博客:http://blog.itpub.net/28916011/viewspace-2214692/

k8s之pod控制器的更多相关文章

  1. k8s的Pod控制器

    pod的配置清单常见选项: apiVersion,kind,metadata,spec,status(只读) spec: containers: nodeSelector: nodeName: res ...

  2. k8s 中 Pod 的控制器

    k8s 中 Pod 的控制器 前言 Replication Controller ReplicaSet Deployment 更新 Deployment 回滚 deployment StatefulS ...

  3. k8s之pod与Pod控制器

    k8s中最为重要的基础资源,pod,pod controller,service pod controller类型有多种需要向控制器赋值之后使用: kubectl命令使用 kubectk get no ...

  4. k8s学习笔记之六:Pod控制器(kube-controller-manager)

    第一章.什么是kube-controller-manager? Controller Manager 由 kube-controller-manager 和 cloud-controller-mana ...

  5. Kubernetes学习之路(十二)之Pod控制器--ReplicaSet、Deployment

    一.Pod控制器及其功用 Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源. pod控制器 ...

  6. 还不会用 K8s 集群控制器?那你会用冰箱吗?(多图详解)

    作者 | 阿里云售后技术专家 声东 导读:当我们尝试去理解 K8s 集群工作原理的时候,控制器(Controller)肯定是一个难点.这是因为控制器有很多,具体实现大相径庭:且控制器的实现用到了一些较 ...

  7. K8s无状态控制器原理介绍

    Pod控制器: ReplicationController:早期K8s只有这一个控制器,但后来发现让这一个来完成所有任务,太复杂.因此被废弃. ReplicaSet: 它用于帮助用户创建指定数量的Po ...

  8. Kubernetes 学习8 Pod控制器

    一.回顾 1.Pod是标准的kubernetes资源,因此其遵循为其资源清单配置定义的基本格式,包含:apiVersion,kind,metadata,spec,status(只读) 2.spec的内 ...

  9. Kubernetes 学习6 Pod控制器应用进阶

    一.资源配置清单 1.自主式Pod资源 2.资源的清单格式,大多数清单格式都遵循如下条件: a.一级字段:apiVersion(group/version),kind,metadata(name,na ...

随机推荐

  1. python3 完全平方数(循环)

    题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 代码: for i in range(1,85): if 168 % i == 0: j = 168 ...

  2. Python基础——列表(list)

    创建列表(list) 通过[]来创建list结构,里面放任何类型都可以,没有长度限制. list1=[] type(list1) list1=[1,2,3,4] list1 list1=['] lis ...

  3. OpenCV中图像的读取,显示与保存

      图像的读取,显示与保存 相关函数:cv2.imread().cv2.imshow().cv2.imwrite() 1.读入图像: 用cv2.imread()函数来读取图像,cv2.imread(路 ...

  4. LA 5010 Go Deeper 2-SAT 二分

    题意: 有\(n\)个布尔变量\(x_i\),有一个递归函数.如果满足条件\(x[a[dep]] + x[b[dep]] \neq c[dep]\),那么就再往深递归一层. 问最多能递归多少层. 分析 ...

  5. JS实现——用3L和5L量出4L的水

    把以下代码保存成donglanguage.html文件,使用Google或360浏览器打开 <!DOCTYPE html> <html> <head> <me ...

  6. Java集合数据类型

    Java集合如Map.Set.List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int.long.float.double等基础类型的数据. 1. 集合存储对象 Jav ...

  7. Leetcode13--->罗马数字转换为整数

    该算法是将罗马数字转换为整数,思路如下:比如IXX,使用临时变量temp保存上一个已经遍历的罗马数字,比如:遍历时是从后往前遍历的:1> 刚开始时,temp = 0; 遍历当前遍历到第一个X,则 ...

  8. grunt-nodemon参数配置

    grunt-nodemon参数配置 nodemon0.2.0版本后参数名称做了较大改动,调整了下nodemon的参数配置,有需要的同学可以参考下: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  9. 精通CSS高级Web标准解决方案(2-2 可视化格式模型之定位概述)

    视觉格式化模型 块级元素(块框).行内元素(行内框),可以使用display改变生成的框的类型,display:block让行内元素(比如<a>)表现的跟块级元素一样,display:no ...

  10. Leetcode 482.密钥格式化

    密钥格式化 给定一个密钥字符串S,只包含字母,数字以及 '-'(破折号).N 个 '-' 将字符串分成了 N+1 组.给定一个数字 K,重新格式化字符串,除了第一个分组以外,每个分组要包含 K 个字符 ...