k8s底层除了用docker,也可以用rocker,rocker是coreOS推出的竞争性产品
service和pod之间的关系通过Lable来绑定
pod最底层有pause容器(pod的根容器),用来pod内部docker之间的网络通信和数据共享(业务容器共享pause的网络栈和Volume挂载卷);sidecar容器可以先于正常业务启动
所有的资源对象都可以通过kubectl(API编程)实现增删查改到etcd中进行持久化存储
API版本:extensions/v1beta1,apps/v1beta1(我们现在用的这个,其实已经被淘汰了),apps/v1beta2,1.9版本之后用app/v1
yaml文件中,annotations这个可以新增多条属性,等属性稳定之后会过渡成正式属性
有一种静态的pod,仅运行在node上,不在etcd库中
滚动升级:逐渐升级service的每一个pod
pod(Deployment)其实有回滚以及暂停的功能(暂停之后可以恢复)
以前以为pod的管理对象只有Deployment,但实际上有RC、Deployment、ReplicaSet、DaemonSet、StatefulSet、Job等,用于不同的应用场景
有状态服务:StateSet(headlessService,pod没有clusterIP。如果解析headlessService的DNS域名,返回的事Service对应的pod的endPoint列表)
服务的每一个pod都有稳定唯一的网络标识 pod副本的启动顺序是一定的 采用稳定的持久卷,删除pod不会删除服务数据 每一个stateset服务都需要声明其属于哪一个headless servicenode节点内部的智能软件负载均衡器由kube-proxy完成,将service的请求转发到pod实例中,在内部实现服务的负载均衡与会话保持机制。
正常pod的endpoint地址会随着pod的销毁和重建而发生改变。
一个服务可以有多个端口,一个端口提供业务服务,另外一个端口提供管理服务。
k8s服务发现机制
早期:采用linux变量,每个pod容器启动是,自动注入环境变量:固定的命名规范找到ip和port 现在:dns发现机制,借助于kube-dnsk8s内有三种ip
node ip:集群物理节点的ip地址 pod ip:每个pod的ip地址,通过docker engine根据docker0网桥的ip地址段进行分配的。集群内部通过pod之间通过这个虚拟二层网络。真实TCP/IP流量从物理网卡流出 cluster ip:k8s自行管理和分配IP地址;无法被ping通,因为没有对应的实体网络对象node port:在集群的每一个node上都为需要外部访问的service,开启对应的tcp监听端口
node间的负载均衡
公有云支持,私有云的还在被开发:service的type从nodeport改成loadbalance 19. job的概念 批处理任务:可以并行(或者串行)启动多个计算进程去处理一批工作项;通过job定义并启动一个批处理任务。 原理:控制一组pod副本,pod运行结束job也就结束了。1.5版本之后有cronjob,解决批处理任务需要定时反复执行的问题;job支持多实例并行运行Volume的概念(扩展出ConfigMap,容器配置文件集中化定义与管理)
volumn是pod中能够被多个容器访问的共享目录。volumn和pod的生命周期相关,和docker的生命周期不相关【pod中的根容器】 使用方法:pod上声明一个volumn,然后在容器里引用该volume并挂载到容器的某个目录上 几种类型 emptyDir:初始内容为空,无需制定宿主机上对应的目录文件。k8s自动分配目录,当pod从node中移除,emptyDir的数据会被永久删除。无法控制介质种类(k8s的配置是硬盘,那所有的都会创建在硬盘上) hostpath:在pod上挂载宿主机上的文件或目录。注意一下亮点 针对的是宿主机,所以pod在不同宿主机下,hostpath是一样的,但实际的访问结果可能不一样 如果使用资源配额管理,k8s无法管理宿主机下的资源 gcePersistentDisk (gce是谷歌计算引擎) 先创建一个永久磁盘:Persistent Disk,用来存放Volume数据 pod被删除,pd只是被卸载,但不会被删除 可以用gcloud命令创建一个pd(永久磁盘:persistent disk) awsElasticBlockStore(使用亚马逊公有云的ebs volume存储数据) 和gce类似,需要先创建一个ebs volume NFS 使用NFS网络文件系统提供的共享目录存储数据,我们需要在系统中部署一个NFS Server 等等 持久卷的概念 k8s集群中某个网络存储对应的一块存储 不属于任何node,但可以在每个node上访问 pv不属于pod,独立于pod pv有一个accessModes属性,可以显示读写权限,限制是否能被多个node挂载 使用方法:先定义好pvc,然后通过在pod的Volume引用pvc(persistent volume claim) pv是由状态的:空闲状态、绑定到pvc、pvc已经删除但是资源还没有被集群回收、集群回收资源失败 namespace 用户多租户的资源隔离 集合k8s的资源配额管理,限定不同用户所占资源 annotation注解 label不同,label是k8s的元数据,可以用于label selector 用户任意定义的附加信息 ConfigMap docker的原理:将程序、依赖库、数据及配置文件打包固定到镜像文件。为了解决配置文件修改的问题,通过docker volume将容器外的配置文件映射到容器内 k8s通过key-value模式存储到etcd数据库中 etcd的configMap通过volume映射的方式变成pod内的配置文件。不管pod去了哪台机器,都可以完成自动映射,如果configMap的key-value数据被修改,映射到pod配置文件的也会被修改。【configmap是k8s对应用无入侵的配置中心】