k8s 可以通过三种方式将集群内服务暴露到外网,分别是NodePort、LoadBalancer、Ingress。
这里我们先介绍下Ingress。
ingress 一般是实现7层的转发,也可以实现4层。
这里我们也从nginx侧开始。
这里,我们看下 targetport port nodeport;
nodeport 就是外部访问端口
port 集群内部访问的端口 集群内部通过svc的时候的访问端口
targetport 是pod 控制器中定义的端口,即是应用访问的端口, 比如使用podip、127.0.0.1 的端口
经过kube_proxy流入到后端pod的targetPort上,最后进入容器。
一般情况下targetport 与 port 字段相同
办公室网络配置
upstream 反向代理可以让大家
upstream test_servers {
server 10.191.10.1:30080
server 10.191.10.2:30080
server 10.191.10.3:30080
}
server {
listen 80;
server_name www.tomcat.com
location / {
proxy_pass http://test_servers
}
}
ingress_controller 内部是监听的80 和 443,需要使用nodeport进行export出来
80 => 30080
443 =》 30443
ingress 侧的配置:
rules:
- host: "www.tomcat.com"
http:
paths:
- pathType: Prefix
backend:
service: tomcat
servicePort: 8080
service 配置
service 这里type是clusterIP, 除非service重建,实际这个clusterIp 也一直不会变;service的这个ClusterIp是一个虚拟Ip,仅仅存在于iptables规则,通过dnat实现访问clusterIp的负载均衡。
一个service 可能对应多个endpoint(Pod), client 访问的是clusterIp,通过iptables 或者IPVS 规则转发到real server,从而达到负载均衡的效果。例如一个service 有两个endpoint,但是dns查询时只会返回server的地址,具体client 访问的是哪个real server,是由iptables 或者 ipvs的规则决定的,客户端无法自行选择返回的是哪个endpoint。
headless service:
访问headless service时,DNS查询会如实的返回所有的EndPoint(Pod IP地址)。对应于每一个EndPoints,即每一个Pod,都会有一个DNS域名,这样Pod之间即可相互访问。
返回
什么是headless service?
clusterIp为None的时候,即为headless service,kube-proxy 不会处理。DNS 如何实现依赖与Service 是否定义了selector。
cluster ip类型的service用于无状态的服务。headless service 则用于无状态的服务。