1.k8s集群的安装
1.1 k8s的架构
etcd:数据库nosql-非关系型,存储键值对数据,储存K8S集群所有重要信息,持久化
API server:
1.运维人员操作k8s就是操作apiserver,也是最核心的;
2.当scheduler选择好一个合适的node。apiserver会去命令Kubelet服务,然后Kubelet在去调用docker启容器(pod)
Scheduler:调度器,会去选择一个合适的node节点。
Users:外界用户访问的是node节点中的Kube-Proxy,然后Kube-Proxy做端口映射到pod
Kube-Proxy:负责写入规则至iptables、ipvs实现服务映射访问;
Controller Manager:
1.会实时检测容器(pod)是否挂掉,如果某一个容器挂掉了,他会重启给起一个容器;
2.如果要是某一个node节点都挂掉了,它会读取etcd数据库中的数据然后会重新找一台机器将node启动起来,保持服务的高可用;
Kubelet:安装好kubelet服务之后,该服务会自动安装好docker服务;直接跟容器引擎交互实现容器的生命周期管理;
除了核心组件,还有一些推荐的Add-ons:
组件名称 | 说明 |
---|---|
kube-dns | 负责为整个集群提供DNS服务 |
core-dns | 为集群中的svc创建一个域名IP的对应关系解析 |
Ingress Controller | 为服务提供外网入口7层 |
Ingress | 7层代理 |
Heapster | 提供资源监控 |
Dashboard | 提供GUI |
Federation | 提供跨可用区的集群 |
Fluentd-elasticsearch | 提供集群日志采集、存储与查询 |
Peometheus | 提供K8S集群监控能力 |
1.1.1k8s ingress原理
前提:但是,单独用service暴露服务的方式,在实际生产环境中不太合适
1.ClusterIP的方式只能在集群内部访问。
2.NodePort方式的话,测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理是灾难。
3.LoadBalance方式受限于云平台,且通常在云平台部署ELB还需要额外的费用。
ingress可以简单理解为service的service,他通过独立的ingress对象来制定请求转发的规则,把请求路由到一个或多个service中。这样就把服务与请求规则解耦了,可以从业务维度统一考虑业务的暴露,而不用为每个service单独考虑。
举个例子,现在集群有api、文件存储、前端3个service,可以通过一个ingress对象来实现图中的请求转发:
注释:
ingress对象:
指的是k8s中的一个api对象,一般用yaml配置。作用是定义请求如何转发到service的规则,可以理解为配置模板。
ingress-controller:
具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。简单来说,ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用