容器编排管理平台
- 以Pod(容器组)为基本的编排和调度单元以及声明式的对象配置模型(控制器、configmap、secret等)
- 资源配额与分配管理
- 健康检查
微服务支撑平台
- 服务发现、服务编排与内部路由支持
- 服务快速部署和自动负载均衡
- 提供对“有状态”的支持
可移植的云平台
- 新一代应用云化的事实标准,成为面向云原生应用的新可移植层、即新“云平台”
- 为用户提供简单且一致的容器化应用部署、伸缩和管理机制,形成新的、通用的应用云化模型
- 云厂商锁定的问题得以解决,云应用支持跨云迁移
k8s hello word演示
service部署
#创建hello-service服务
kubectl create -f hello-service.yaml --record
#查看服务是否创建成功
kubectl get svc|grep hello-service
#查看服务的详细信息
kubectl describe svc|hell-service
#启动前台可以访问的k8s内部的容器
kubectl run -i --tty busbox --image=busybox --restart=Never
#查看服务的dns地址
nslookup hello-service
Deployment部署
#创建deployment
kubectl create -f hello-deployment.yaml --record=true
#查看deployment
kubectl get deployments
请求的自动负载均衡
#查看部署pods的信息
kubectl get pods|grep hello
#查看部署的日志 deployname可以通过pods信息中获得
kubectl logs -f deployname
查看两个pods的日志可以看到负载均衡的效果
服务伸缩
#使修改的文件生效
kubectl apply -f hello-deployment.yaml
服务的版本升级
修改版本后用以下命令监控
#查看版本升级的日志
kubectl rollout status deployment/hello-deployment
#回退到上一个版本
kubectl rollout undo deployments/hello-deployment
Master组件
Kubernetes集群大脑,控制平面
所有集群的控制命令都传递给Master组件并在其上执行
每个Kubernetes集群至少有一套Master组件
每套master组件包括三个核心组件(apiserver,scheduler和controller-manager)以及集群数据配置中心etcd
API Server:
集群控制的唯一入口,是提供kubernetes集群控制Restful API的核心组件
集群内各个组件间数据交互和通信的中枢
提供集群控制安全机制(身份认证、授权以及admission control)
Schelduler
通过API Server的watch接口监听新建Pod副本信息,并通过调度算法为该Pod选择一个最合适的Node
支持自定义调度算法provider
默认调度算法内置预选策略和优选策略,决策考量资源需求、服务质量、软硬件约束、亲缘性、数据局部性等指标参数
ControllerManager
集群内各种资源controller的核心管理者
针对每一种具体的资源,都有相应Controller
保证其下管理的每个Controller所对应的资源始终处于期望状态
每个Controller的逻辑
for{
获取资源期望状态
获取资源当前状态
改变:当前状态 -> 期望状态
}
Etcd:
Kubernetes集群的主数据库,存储着所有资源对象以及状态
默认与Master组件部署在一个Node上
Etcd的数据变更都是通过API Server进行
Node
Node:Kubernetes集群中真正的工作负载节点
kubernetes集群由多个Node共同承担工作负载,Pod被分配到某个具体的Node上执行
kubernetes通过node controller对node资源进行管理,支持动态在集群中国添加或删除node
每个集群node上都会部署kuberlet和Kube-proxy两个组件
Kube-proxy:运行在每个Node上
service抽象概念的实现,将到service的请求按策略(负载均衡)算法分发到后端Pod(Endpoint)上
默认使用iptables mode实现
支持nodeport模式,实现从外部访问集群内的service
Kubernetes架构和组件:
两类节点:Master和Node
Master组件:apiserver,scheduler,controller
节点组件:kubelet,kube-proxy
kubernetes基本概念
kubernetes对象
是一种持久化的、用于表示集群状态的实体
kubernetes示意图
Metedata属性
Name和UID
kubernetes集群中左右对象都通过name和UID明确标识
API中的对象访问路径:/api/{version}/namespaces/{namespace}/{object-kind}/name 比如/api/v1/namespaces/default/pods/hello-kubernetes
在kubernetes集群的整个生命周期内创建的每个对象实例都具有不同的UID
Namespace
不仅仅是一个属性、本身也是一个object
namespace:用于将物理集群划分为多个虚拟集群
namespace间完全隔离,因此也常被用来隔离不同的用户以及权限
内置三个namespaces;default、kubet-system和kube-public,Node和PersistentVolume不属于任何namespace
Label 标签
label用于建立集群对象之间的灵活的、松耦合的多维关联关系
一个label是一个键-值对,其中的key、value均由用户自己定义
label可以附着任何对象上,每个对象也可以有任意个标签。标签可以在对象定义时附加上,也可以通过命令动态管理标签
label可以将有组织的结构映射到集群对象上,从而形成一个与现实世界管理结构同步对应松耦合的、多维对象管理结构
通过label selector查询和筛选建立对象间的关系
Annotations注解
可以将任意非标识性的元数据附加到对象上
Annotations也是以键值对形式呈现
工具和库可以检索到并使用这些Annotations元数据
将数据作为Annotation附着在对象上,有利于创建一些用于部署,管理和做内部检查的共享工具或客户端
kubernetes对象分类
kubernetes 常用对象分为四类:
workload
discovery&loadbalance
config&storage:向应用中注入配置信息或者将数据持久化保存到容器外的
cluster:定义了集群自身的数据如何配置
pod 一个有特定关系的容器集合
pod是集群中可以创建和部署的最小且最简的kubernetes对象单元
pod也是一种封装,它封装了应用容器,存储资源,独立的网络IP以及决定容器如何运行的策略选项
每个pod顶置一个Pause容器,其名字空间,IPC资源,网络和存储资源被Pod内其他容器共享。pod中的所有容器紧密协作,并且作为一个整体被管理,调度和运行
pod生命周期
pod是一个非持久性实体
![](http://7xsaec.com1.z0.glb.clouddn.com/pod%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.png)
Controllers
controller是kubernetes核心对象之一
controller用于保证集群内一组pod始终按照某种期望的状态(desired state)正常运行
状态包括:pod副本数量、节点选择、资源约束、持久化数据维持等
kubernetes支持多种controller,常用的deployment,replicaset,deamonst等
replicaset
确保健康pod的副本数始终满足用户定义的数量
前身是ReplicationController(rc)
相比rc,增加集合式label selector的支持
支持单独使用,但更多隐藏在deployment控制器后面,由deployment自动管理
Deployment
为Pod和ReplicaSet提供了声明式的定义(declarative)
用户在deployment文件中描述期望状态,Deployment controller就会自动将Pod和Replica Set的实际状态改变到期望状态
Deployment支持Pod的RollingUpdate,并自动管理背后的ReplicaSet
Deployment支持将pod Rollback到之前的任意revision(仅限于pod-template模板改动)
StatefulSet
提供对有状态的应用的部署和控制的支持
DeamonSet
保证在每个Node上都运行一个Pod副本
适用场景:系统Daemon程序、监控跟踪、日志收集等
ConfigMap
常用来向Pod提供非敏感的配置信息
Secret
Secret解决的是集群内密码,token,秘钥等敏感数据的配置问题