Borg是谷歌内部的大规模集群管理系统,负责对谷歌内部很多核心服务的调度和管理。Borg的目的是让用户能够不必操心资源管理的问题,让他们专注于自己的核心业务,并且做到跨多个数据中心的资源利用率最大化。
Borg主要由BorgMaster、Borglet、borgcfg和Scheduler组成,如下图所示
Kubernetes借鉴了Borg的设计理念,比如Pod、Service、Labels和单Pod单IP等。Kubernetes的整体架构跟Borg非常像,如下图所示
Kubernetes主要由以下几个核心组件组成:
除了核心组件,还有一些推荐的Add-ons:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: ng-deploy-80
template:
metadata:
labels:
app: ng-deploy-80
spec:
containers:
- name: ng-deploy-80
image: nginx:1.14.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: ng-deploy-80
spec:
ports:
- name: http
port: 81 # service pod
targetPort: 80 # pod服务监听的端口
nodePort: 30012 # node节点通过api-proxy监听的端口
protocol: TCP
type: NodePort
selector:
app: ng-deploy-80
概述:
Replication Controller 第一代pod副本控制器,用来维持副本数.匹配目的时只能用= 和!=匹配
控制器直接管理副本
apiVersion: v1
kind: ReplicationController
metadata:
name: ng-rc
spec:
replicas: 2
selector:
app: ng-rc-80
#app1: ng-rc-81
template:
metadata:
labels:
app: ng-rc-80
#app1: ng-rc-81
spec:
containers:
- name: ng-rc-80
image: nginx
ports:
- containerPort: 80
ReplicaSet 第二代pod副本控制器,用来维持副本数.对选择器支持selector还支持in notin
控制器直接管理副本
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 2
selector:
matchExpressions:
- {key: app, operator: In, values: [ng-rs-80,ng-rs-81]}
template:
metadata:
labels:
app: ng-rs-80
spec:
containers:
- name: ng-rs-80
image: nginx
ports:
- containerPort: 80
Deployment 第三代pod副本控制器 比rs更高一级的控制器,还支持滚动升级和回滚
deployment会另外再创建一个rs,容器数量由deployment的rs负责创建和回收
创建新的版本,会在pod创建完回收老的pod,但rs不会被回收,用作今后的回滚
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
#app: ng-deploy-80 #rc
matchLabels: #rs or deployment
app: ng-deploy-80
# matchExpressions:
# - {key: app, operator: In, values: [ng-deploy-80,ng-rs-81]}
template:
metadata:
labels:
app: ng-deploy-80
spec:
containers:
- name: ng-deploy-80
image: nginx
ports:
- containerPort: 80
Deployment创建的pod名字由3部分组成
例如:nginx-deployment-6b9f6c7549-dtr2z
第一部分是nginx-deployment由控制器的metadata的name决定
metadata:
name: nginx-deployment
第二部分6b9f6c7549是生成随机rs的名字
为什么使用Service
Pod重建之后IP会发生变化,这样pod之间的访问就会发生异常
Service解耦了服务和应用
kube-proxy有三种调度模式:
userspace: k8s1.1之前
iptables: 1.2-k8s1.11之前
ipvs: k8s1.11之后,如果没有开启ipvs就会自动降级到iptables