POD概念
1.什么是pod
1.自主式(不被控制器管理的pod)
1 |
一旦死亡没有人拉起来他,或者创建新的pod来代替它,他有很大缺陷 |
2.控制器管理的pod(如下图所示)

这里还要了解POD相关几个概念
1 2 |
Replication Controller 保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,Replication Controller就杀死几个,如果太少了,Replication Controller会新建几个,和直接创建的pod不同的是,Replication Controller会替换掉那些删除的或者被终止的pod,不管删除的原因是什么(维护阿,更新啊,Replication Controller都不关心)。 注意:新版本的建议使用RS来取代RC |
注意:新版本的建议使用RS来取代RC,因为RC支持集合式的selector(选择器)
ReplicaSets(RS)
Deployment(滚动更新)
- 定义Deployment来创建Pod和ReplicaSet,因为RC不支持滚动更新,Deployment不支持pod创建,所以他两要放一起,各取所长,搭配干活
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续Deployment

如果是回滚,也就是退回原有应用或者镜像版本,道理是一样的,步骤如下
1.RS-2停止一个v2pod –> RS-1启动一个旧的v1pod
RS-2停止一个v2pod –> RS-1启动一个旧的v1pod
…
因为滚动升级,只是停止了pod,并不是删除,所以回滚启动就好了
Horizontal Pod Autoscaling(HPA)
Horizontal Pod Autoscaling可以根据CPU使用率或应用自定义metrics自动扩展Pod数量(支持replication controller、deployment和replica set)。
- 控制管理器每隔30s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
- 支持三种metrics类型
- 预定义metrics(比如Pod的CPU)以利用率的方式计算
- 自定义的Pod metrics,以原始值(raw value)的方式计算
- 自定义的object metrics
- 支持两种metrics查询方式:Heapster和自定义的REST API
- 支持多metrics

StatefulSet( 解决有状态服务的问题 如mysql)
- 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现(例如mysql重启后数据与其他节点不一致,导致的问题)
- 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
- 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
- 有序收缩,有序删除(即从N-1到0)
DaemonSet可以保证集群中所有的或者部分的节点都能够运行同一份 Pod 副本 ,当有新的(节点)Node加入集群时,DaemonSet也会为他们新增一个Pod,当有节点被从集群中移除时,节点上的Pod也会被垃圾清除器回收。删除DaemonSet将会删除它创建的所有的Pod,daemonSet作用就像是计算机的守护进程,他能够运行集群存储,日志收集,和监控等[守护进程],这些服务一般都是集群必备的基础服务。
典型的应用包括:
- 日志收集,比如fluentd,logstash等
- 系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
- 系统程序,比如kube-proxy, kube-dns, glusterd, ceph等

Google Cloud 的 Kubernetes 集群就会在所有的节点上启动 fluentd 和 Prometheus 来收集节点上的日志和监控数据,想要创建用于日志收集的守护进程其实非常简单,我们可以使用如下所示的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-elasticsearch namespace: kube-system spec: selector: matchLabels: name: fluentd-elasticsearch template: metadata: labels: name: fluentd-elasticsearch spec: containers: - name: fluentd-elasticsearch image: k8s.gcr.io/fluentd-elasticsearch:1.20 volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true volumes: - name: varlog hostPath: path: /var/log - name: varlibdockercontainers hostPath: path: /var/lib/docker/containers |
1 |
当我们使用 kubectl apply -f 创建上述的 DaemonSet 时,它会在 Kubernetes 集群的 kube-system 命名空间中创建 DaemonSet 资源并在所有的节点上创建新的 Pod: |
Job(批处理任务,仅执行一次,和linux的 定时任务 at 一样)
CronJob (定时任务,和linux的crontab一样)
服务发现:
网络通讯方式
1.同一个pod的,多个容器之间互相访问:
1 |
可以用pause互相访问 |
2.各个pod之间的通讯:Overl Network


那么上图中 ETCD 和 Flannel 之间有什么关系呢?
1 2 3 |
ETCD 存储管理Flannel 可分配的ip地址段资源 监控ETCD中每个pod的实际地址,并在内存中建立维护Pod节点路由表,当请求发过来的时候,立即去etcd里查找并发现。 |
k8s主要组件一览
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
名称 作用 Api server 所有服务访问统一入口 ControllerManager 维持副本期望数目 Scheduler 负责介绍任务,选择合适的节点进行分配任务 Etcd 键值对数据库,存储k8s集群的所有重要信息(持久化) Kubelet 直接跟容器引擎交互,实现容器的生命周期管理 Kube-proxy 负责携入规则至iptables IPVS 或者 实现服务映射映射访问的 CoreDNS 可以为集群中的svc创建一个域名 解析到组件ip DashBoard 给k8s集群提供一个B/S结构的访问体系 Ingress controller 官方只能实现4层代理,而ingress可以实现7层 Federation 提供一个可以跨集群中心,多k8s统一管理的功能 Prometheus 提供一个k8s集群的监控能力 ELK 提供k8s集群日志统一分析平台 高可用集群副本数目,最好是奇数的形式,1,3,5,7,9 |
1 |
- 本文固定链接: https://www.yoyoask.com/?p=1685
- 转载请注明: shooter 于 SHOOTER 发表