首先,作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就需要一个集群范围内的DNS服务完成从服务名到ClusterIP解析
Kubernetes DNS解析经历了三个阶段
主要由四个容器组件
a kube2sky
获取Kubernetes中Service资源变化,将Service ip地址和名称生成DNS记录,并保存到etcd中
b skydns
skydns容器从etcd中读取DNS记录,并为客户端容器应用提供DNS查询服务
c healthz
healthz容器提供对skydns服务的健康检查功能
d etcd
数据库存储
a kubedns
功能类比kuber2sky 负责监控Service资源变化,但是不存储在etcd中,存储在内存中
b dnsmasq
从kubedns容器获取DNS记录,提供dns缓存,为客户端容器应用提供DNS查询服务
c sidecar
提供对kubedns和dnsmasq服务的健康检查
coreDNS是CNCF基金会的一个项目,由Go语言实现的高性能、插件式、易扩展的DNS服务端。解决了KuberDNS一些问题,如dnsmasq的安全漏洞,externalName 不能用stubDomains设置,等
coreDNS支持自定义DNS记录及配置upstream DNS Server,可以统一管理Kubernetes基于服务的内部DNS和数据中心的物理DNS
coreDNS只使用了一个容器便实现了kuberDns三个容器的全部功能
-cluserter-dns=*.*.*.*: 为DNS服务的ClusterIP地址
-clusert-domain=cluster.local:为DNS服务中设置的域名
重启kubelet服务
configMap coreDNS 主要设置coreDNS的主要配置文件CoreFile的内容,其中可以定义各种域名的解析方式和使用的插件
Deployment coreDNS 主要设置CoreDNS容器应用的内容,
其中注意因为DNS服务是Kubernetes集群的核心关键服务,所以建议为其Deployment设置自动扩缩容控制器,自动管理其副本数量,另外对资源限制部分(CPU和内存限制)的设置也应根据实际环境进行调整
是 DNS服务的配置 这个服务需要设置固定的ClusterIP,也需要将所有的Node上的Kubelet启动参数 --clusterj-dns设置为这个ClusterIP
根据对Service上述的那么多解释,我们知道Service的表现形式为IP:PORT形式,即工作在TCP/IP层。对于HTTP服务来说,不同的URL地址经常对应到不同的后端服务或者虚拟服务器(Virtual Host),应用层的转发机制如果仅仅靠Service机制是无法完成的。kubernetes从1.1新增Ingress资源对象,用于将不同的URL访问请求转发到后端不同的Service,以实现HTTP层的业务路由机制。
Kubernetes使用了一个Ingress策略定义和一个具体的Ingress Controller两者结合并实现了一个完整的Ingress 复杂均衡器
当使用Ingress进行负载分发时,Ingress Controller 基于Ingress规则将客户端请求直接转发到Service对应的后端EndPoint(POD)上,这样会跳过Kube-proxy的转发功能,kube-proxy不再起作用,如果Ingress Controller提供的是对外服务,则实际上实现的是边缘路由的功能
在定义Ingress策略之前,需要先部署Ingress Controller,实现为所有后端的Service都提供一个统一的入口。Ingress Controller需要实现基于不同HTTP URL向后转发的负载分发规则,并可以灵活设置7层分发策略。如果公有云服务商能提供该类型的HTTP路由Balancer,则也可设置其为Ingress Controller
在Kubernetes中,Ingress Controller 以Pod的形式运行,监控API Server的/ingress 接口后端的backend services 如果Services发生变化,则Ingress Controller应自动将其更新转发规则。
对一个地址(mywebsite.com)的访问,设置Ingress策略,定义对其路径(/demo)访问转发到后端服务规则
appVersion:extensions/v1betal
kind:Ingress
metadata:
name:mywebsite-ingress
spec:
rules:
-host:mywebsite-ingress
http:
paths
-paths:/demo
backend:
serviceName:webapp
servicePort:8080
上述Ingress定义,说明对目标地址http://mywebsite.com/demo的访问将被转发到集群中的Service webapp即webapp:8080/demo上
在Ingress生效之前,需要先将webapp服务部署完成。同时需要注意Ingress中的path的定义,需要与后端真实Service提供的path一致,否则将转发到一个不存在的path上,引发错误。
#kubectl create -f ingress.yaml
日志提示 ingress "mywebsite-ingress" created
#kubectl get ingress -o wide
这种配置,客户端到Ingress Controller的访问请求都被转发到后端的唯一Service上,这种情况下Ingress 无须定义任何rule
spec:
backend:
serviceName:myweb
servciePort:8080
用于同一个网站通过不同的路径提供不同服务场景