Kubernetes概念入门
1 Kubernetes自发现机制
一个是pod被创建后,会自动加载所有可用service的变量,另一个是dns,dns用watchapi不断监控service的创建,并建立一个记录,假设有个my-service的service他在namespace my-ns中,dns会记录my-service.my-ns,其他pod访问,只需要访问my-service.my-ns就可以解析到cluster ip和端口了,Service可用external ip作为外部ip地址池
Kubernetes能被创建的最小单位是pod,Kubectl get pods 查看pod,Kubectl create –f testpod.json是创建.json文件中的pod,service,rc等,Pod内共享network namespace pod内除了启动应用容器还会启动一个网络容器gcr.io/google_containers /pause很小的容器
2 基础概念
Replication controller
决定了一个pod有多少同时运行的副本,并保证这些副本的期望状态与当前一致,并且当pod failed或者容器退出,都会固执的重启pod和容器,Rc只支持重启策略为always的pod进行协作可以通过修改pod的labels将一个pod从rc的控制集中移除,rc将会重启一个新的pod来替换那个pod,删除rc不会影响它所创建的pod,要是删除rc中的pod 需要把rc的副本数replicas字段设置为0,Rc被设计成滚动更新。
Pod在kubernetes中地址是不固定的,可以创建service,service将外部流量转到service对应的endpoints上,service创建后会被随机分配一个ip可以用kubectl get service命令获取,Service也可以代理不是pod的对象,这时不会创建endpoints,可以手动创建,多用于外部连接自定义后端系统,Service的主要组件就是node节点上的kube-proxy
Labels一般作为匹配名字
Kube-proxy为每个service真正打开的是一个绝不重复的端口,用户自定义的端口将会被映射到随机端口上
Service不足
Service和pod两者存在创建时间关系,pod需要在service后创建
新一代副本控制器
Replica set是rc的升级版,但不支持滚动更新
Deployment是为了应用更新而设计的
是更加强劲的更新应用系统,提供平滑过渡,当升级有错误时,会保证一定量的pod提供对外服务,他也会记录每次升级的记录,用kebectl rollout history deployment/nginx-deployment 查看更新状态,然后执行kubectlrollout undo deployment/nginx-deployment –to-revision=2
ConfigMap
帮助配置信息从应用程序镜像中解耦出来,保证镜像的可移植性以及配置信息不泄露
Namespace
Kubernetes默认的namespace是default
Kubectl get namespaces 可以查询所有可用namespace
Kubernetes用户认证机制
apiserver启动过程中,通过传入--client-ca-file=somefile参数可以启用客户端证书认证,如果客户端证书提供给apiserver且被认证通过,则ssl证书主题中的共用名(common name)将作为客户端发起api请求的用户名
Horizontal Pod Autoscaler水平扩展
操作rc ,res,deployment对应的pod,观察cpu实际使用量与用户期望值做对比,在hpa controller检测到cpu实际用量后,对比cpu用量会调整副本数量使cpu使用率尽量向期望靠近,副本范围参考【minreplicas,maxreplicas】之间数值
注意:在每一次做出决策生成减少一个pod时,将不再进行扩展决策,时长为3分钟 scale down为5分钟
3 Kubernetes的master结构
APIserver
Kubernetes由两种节点组成,管理节点和工作节点,工作节点跑容器,master组件分为APIserver 相应用户的管理,指挥协调,安全端口6443,非安全端口8080,默认监听8080,通过registry实体操作etcd,etcd存储路径所以registry为前缀
scheduler
创建一个http server监听10251,可以通过web运行状态进行辅助检测,将待调度的pod绑定到适合的工作点上,定时向apiserver获取数据,schedule策略分为两个阶段,predicates和priorities,先判定7项评分标准,评分高的node节点为pod的调度位置,也可以指定pod的调度位置
controller manager
控制器合集,管理副本和node,创建一个http server用作辅助debug和收集metric数据之用endpoint controller replicationcontroller gc controller垃圾回收控制器
工作节点运行两个重要组件
Kubelet
管理运行pod 真正负责容器的操作,与cadvisor交互抓取容器和宿主机资源信息,定期进行垃圾回收,10秒调用apiserver获取node信息,调用cadvisor获取宿主机信息,更新node对象
在启动kubelete时候,启动cadvisor cAdvisor当前都是只支持http接口方式,被监控的容器应用必须提供http接口,所以能力较弱。在Kubernetes的新版本中已经集成了cAdvisor,所以在Kubernetes架构下,不需要单独再去安装cAdvisor,可以直接使用节点的IP加默认端口4194就可以直接访问cAdvisor的监控面板如需要通过cAdvisor查看某台主机上某个容器的性能数据只需要调用: http://:4194/v1.3/subcontainers/docker/
Kube-proxy
负责将service的流量转发到对应endpoint(通过server配置在工作节点上维护iptables设置进行转发)
4 存储 Volume
Emptydir主要用做临时空间,pod离开宿主机,emptydir中数据被删除
可以在/var/lib/kubelet/pods/poduid/volumes/kubernetes.io~empty-dir的redis-data找到
Hostdir 使得容器能够访问宿主机的目录,一点pod离开,hostdir数据不会被删除
Gcepersistentdisk 可以迁移,对工作环境有要求
Persistent volume
Pv有单独的生命周期,有单独管理的api,pvc是用户对于存储的请求,根据pvc来绑定pv资源,类似lvs
5 Kubernetes网络原理
扁平化网络(需用户保证)+单podip,为每个pod随机分配一个ip地址如10.x.x.x,通过该ip地址,pod能够跨网络与其他物理机,虚拟机或容器通信
不建议采取让pod直接访问另一个pod的ip进行通信,因为pod销毁会重新定义ip,对外提供服务的pod应该在pod前创建service,pod里的用户容器定义完全交给网络容器,是极小的scratch
5.1 集成DNS
Kubernetes最初用向pod注入环境变量映射域名,这会代理环境变量泛滥情况,可以增加集群dns服务为每个service映射一个域名,如果启用了dns选项,系统则会自动创建一个运行skydns域名服务器的pod和一个对外提供集群service域名解析服务的skydns service会被分配一个静态ip,kubelet配置成向每个docker容器中传入skydns service的ip地址,作为dns服务器,dns中存储格式为 namespace:service,同namespace直接搜索service名,不同namespace需要搜索全名
Skydns service工作原理
Skydns pod 中包含4个容器skydns etcd 和一个连接kubernetes和skydns的网桥(kube2sky)及用于健康检查的容器
kube2sky检测kubernetes主控节点的service更新,向dns pod 中的etcd写入service对象,skydns会去etcd读取信息,skydns
service可以被所有kubernetes节点访问,需要在kubernetes节点上的resolv.conf文件中将dns nameserver指向skydns域名服务器
6 Kubernetes健康检查
系统和应用程序的健康检查是有kubelet完成的,kubelet会定期通过docker daemon获取所有docker进程,发现某个docker为正常运行,则重新启动
Kubernetes还引入探针概念,支持用户自己实现应用业务级的健康检查,支持三种类型
http get ,container exec,tcp socket
kubelet根据livenessprobe:periodseconds定义时间间隔默认为10秒
7 高可用性
Apiserver挂掉,影响更新创建pod, service, rc等,不影响现有的pod和service
Kubelet发生软件故障,工作节点被标记为非健康,rc会在其他节点启用pod
Kubernetes单个集群能支持1000个工作节点和30000个pod
8 Kubernetes组件日志
建议将kubernetes日志划分一个单独的盘glog.Errorf() glog.warningf()
可以设置环境变量将输出的log给elasticsearch,通过启动一个名为fluentd-elasticsearch的pod
附录摘自《Docker容器与容器云》
网友评论