是时候使用Helm了:Helm, Kubernetes的包管理工具
简化Kubernetes应用部署工具-Helm安装
Picking the Right Solution
吐槽安装的
Kubernetes on Ubuntu
Get Docker EE for Ubuntu
Docker设置proxy的文件: /etc/default/docker
To further debug and diagnose cluster problems, use ‘kubectl cluster-info dump’.
Unable to connect to the server: context deadline exceeded (Client.Timeout exceeded while awaiting headers)
etcd, kube-controller-manager, kube-scheduler这些
为什么被8080refused了呢。别着急,还没有启动呢,这是没有成功连接kubernetes apiserver的节奏,一切正常,到目前为止,我们只是下载了一个可执行文件设置了权限而已。
用replicationcontroller创建pod,再创建service,暴露cluster IP. tcp访问。
kubelet是进程,向Master注册自己
pod的ip加上containerport,组成了endpoint,代表pod里的一个服务进程的对外通信地址。
m:千分之一个CPU配额。
Master node上的Controller Manager定期巡检系统中存活的目标pod,确保其实例数量等于RC的期望值。
检查Deployment状态来看部署动作是否完成
HPA:Horizontal Pod Autoscaling - 横向自动扩容
通过跟踪分析RC控制的所有目标POD的负载变化来确定是否需要针对性的调整目标POD的副本数。
监控CPU使用率,当前使用量 / yaml里的pod request。
HPA本身也是一种kind:HorizontalPodAutoscaler
service就是我们说的微服务。Pod和RC其实都是为Service做铺垫。
Service和后端pod副本集群间通过Label Selector实现无缝对接。
rc的作用:保证service的服务能力和质量始终处于预期的标准,服务之间通过TCP/IP通信。每个pod都有单独的IP,和containerPort一起组成了end point,那组成集群后的入口是什么?负载均衡器(软件或硬件),负责决定请求被转发到哪个pod。每个node上都运行了kube-proxy进程,实际就是一个智能的软件负载均衡器,负责把对service的请求转发到后端某个pod上,并在内部实现服务的负载均衡与会话保持机制。
每个service有一个全局唯一的虚拟IP地址,cluster IP,每个服务具有唯一IP地址的通信节点。整个生命周期内不变。内部pod的endpoint会随销毁和重新创建而发生变化。
服务发现 - 如何通过Service name找到cluster ip?
Cluster IP是Service创建后由Kubernetes自动分配的,其他pod无法预先知道某个service的cluster IP地址。因此需要一个服务发现机制来找到这个服务。
a. Service生成一些Linux环境变量,pod启动时注入环境变量。通过Add-On
增值包引入DNS系统,把服务名作为dns域名。通过服务名建立通信连接。
node节点的IP地址。真实存在的物理网络,Kubernetes集群外的节点访问集群内的节点时,必须通过node ip进行通信。
很多服务都存在多个端口,一个端口提供业务服务,另一个端口提供管理服务。
Pod IP是每个pod的ip地址,是Docker engine根据docker0网桥的IP地址段进行分配的。通常是一个虚拟的二层网络。
一个pod里的容器访问另一个pod里的容器,就是通过pod IP所在的虚拟二层网络进行通信的,而真实的tcp/IP流量通过node IP所在的物理网卡流出。
Cluster IP没有一个实体网络对象,因此无法被ping。不具备TCP/IP通信基础,属于Kubernetes集群的封闭空间。
集群内部,node ip,pod IP,cluster IP之间的通信,采用的是一种特殊的路由规则,和IP路由完全不同。
使用nodeport同外界通信。
http://:
nodeport就是一个TCP监听端口。
GCE - google cloud engine
volume在pod中的意思是能被多个Docker访问的共享目录。
Kubernetes中的volume与pod的生命周期相同,但与容器的生命周期无关。
给volume定义一个名字,然后mount到docker的某个目录下。
volume类型:
emptyDir: pod分配到node时创建,初始内容为空,无须指定宿主机上对应的目录文件,由Kubernetes自动分配一个目录,当pod从node上移除时,emptyDir中的数据也被永久删除。
用于临时空间,一个容器需要从另一个容器中获取数据的目录。
hostPath:在pod上挂载宿主机上的文件或目录。
PV只能是网络存储,不属于任何Node,但可以在每个node上访问。PV不是定义在node上的,而是独立于pod之外定义。
不同的分组在共享使用整个集群资源同时还能被分别管理. 默认是default。
annotation和label类似,都是key/value, 但label有严格的naming convention,定义的是Kubernetes对象的元数据,而且用于label selector,而annotation是用户任意定义的附加信息,用于外部工具查找。
DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53
如果在DNS服务器处显示的是个人公司的内部网络地址,那么说明该公司的DNS解析工作是交给公司内部的DNS服务器来完成的,这时需要检查这个DNS服务器,在DNS服务器上进行nslookup操作看是否可以正常解析
工作node上仅需部署kubelet和kube-proxy服务进程。
Master与工作node间会有大量网络通信,在防火墙上需配置各组件需要相互通信的端口号。
etcd是Kubernetes集群的主数据库
Kubernetes各组件与Master之间通过apiserver的非安全端口http://apiserver:8080访问,但如果apiserver需要对外提供服务,或者集群中某些容器需要访问apiserver以获取集群中的某些信息,CA签名的双向数字证书认证。
google_containers/pause的镜像实现pod的概念
http://gcr.io
第二章有很多命令行参数。
2018-11-12 11:02AM 看到P38 1.4.6 Deployment,飞机上14:16看到42页。
20:30, p46, 三种ip. 10:15 53 namespace 22:31第一章结束。
Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。
为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。
确保pod数量:它会确保Kubernetes中有指定数量的Pod在运行。如果少于指定数量的pod,Replication Controller会创建新的,反之则会删除掉多余的以保证Pod数量不变。
确保pod健康:当pod不健康,运行出错或者无法提供服务时,Replication Controller也会杀死不健康的pod,重新创建新的。
弹性伸缩 :在业务高峰或者低峰期的时候,可以通过Replication Controller动态的调整pod的数量来提高资源的利用率。同时,配置相应的监控功能(Hroizontal Pod Autoscaler),会定时自动从监控平台获取Replication Controller关联pod的整体资源使用情况,做到自动伸缩。
滚动升级:滚动升级为一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始化升级的时候就可以及时发现和解决问题,避免问题不断扩大。
see:https://www.jianshu.com/p/6bc8e0ae65d1
Docker Swarm vs Kubernetes