1.关于Kubernetes
1.1 Kubernetes简介
Kubernetes(简称K8S)是一个开源的,用于管理云平台中多个主机上的容器化的应用,提供了应用部署、规划、更新、维护的一种机制。他的一个核心特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务)
在Kubernetes中,所有的容器均在Pod中运行,用户可以自己创建并管理Pod。一个Pod可以承载一个或多个相关的容器,同一个Pod>中的容器会部署在同一个物理机器上并且能够共享资源。一个Pod也可以包含0哥或多个磁盘卷组(volumes),这些卷组会以目录的形式提供给一个容器,或者被所有Pod中的容器共享,对于用户创建的每个Pod,系统会自动选择那个健康并且有足够容量的机器,然后创建类似容器的容器,当容器创建失败的时候,容器会被node agent自动的重启,这个node agent叫kubelet,但是,如果是Pod失败
或者机器,它不会自动的转移并且启动,除非用户定义了 replication controller。
Kubernetes支持一种特殊的网络模型,Kubernetes创建了一个地址空间,并且不动态的分配端口,它可以允许用户选择任何想使用>的端口,为了实现这个功能,它为每个Pod分配IP地址。
1.2 Kubernetes架构
kubernetes集群包含有节点代理kubelet和master组件(APls ,scheduler,etc)基于分布式的存储系统,下面这张是kubernetes架构图
在这张系统架构图中,我们把服务分为运行在工作节点上的服务和组成集群级别控制板的服务。Kubernetes节点有运行应用容器必>备的服务,而这些都是受Master的控制。每次个节点上当然都要运行Docker。Docker来负责所有具体的映像下载和容器运行。
Kubernetes主要由以下几个核心组件组成:
- etcd保存了整个集群的状态
- apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
- controller manager负责维护集群状态,比如故障检测、自动扩展、滚动更新等
- scheduler负责资源的调度,按照预先制定的调度策略将Pod调度到相应的机器上
- kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
- Container runtime负责镜像管理以及pod和容器的真正运行
- kube-proxy负责为service提供cluster内部的服务发现和负载均衡
除了核心组件,还有一些推荐的Add-ons:
- kube-dns负责为整个集群提供DNS服务
- Ingress Controller为服务提供外网入口
- Heapster提供资源监控
- Dashboard提供GUI
- Federation提供跨可用区的集群
- Fluentd-elasticsearch提供集群日志采集、存储与查询
1.3 Pod、Node、容器
K8s为每个Pod都分配了唯一的IP地址。称为PodIP。一个Pod里的多个容器共享Pod IP。K8s要求底层网路支持集群内任意两个Pod之间的TCP/IP直接通信,者通常是通过二层网络技术来实现(如Flannel、Openswith)。一个Pod容器与另外主机上的Pod容器能够直接通信
Pod其实有两种类型,普通的Pod及静态的Pod(static Pod)。后者比较特殊,并不存放在K8S的etcd中存储,而是存放在某一个具体的Node上的一个文件中,并且只在此Node上启动运行。而普通的Pod一旦被创建,就会被放入到etcd中存储,随后会被K8S Master调度到某个具体的Node上面进行绑定(Binding),随后该Pod被对应的Node上的kubelet进程实例化成一组Docker容器并启动起来。默认情况下,当Pod里的某个容器停止时,K8S会自动检测这个问题,并重启启动这个Pod(Pod里面的所有容器),如果Pod所在的Node宕机,则会将这个Node上的所有Pod重新调度到其它节点上。
Pod、Node与容器的关系
1.4资源对象介绍
K8S里的所有资源对象都可以采用Yaml或JSON格式的文件定义或描述,下面的是某个Pod文件的资源定义文件
apiSerdion: v1
kind: Pod
matadata:
name: myweb
labels:
name: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
va