睿象云智能告警平台的分派策略
1349
2022-10-25
kubernetes之headless service运用
本文档中的IP和域名未涉及任何单位和组织,其IP、域名及本文,我花了两个小时完成编写和处理。
网上编写kubernetes service的文档非常多,这里我就不做说明。我们知道,大多数kubernetes service访问模式是,kube-proxy会监视 Kubernetes 控制节点对 Service 对象和 Endpoints 对象的添加和移除。对每个 Service,它会通过 iptables规则,从而捕获到达该 Service 的 clusterIP 和端口的请求,进而将请求重定向到 Service 任意一组 backend pod 中。对于每个 Endpoints 对象,它也会通过 iptables 规则,这个规则会选择一个 backend pod 组合。
默认的策略是,kube-proxy在 iptables 模式下随机选择一个 backend pod。下面是一个简图:
Headless Service
对于headless service,我们先看一下官方定义:
有时不需要或不想要负载均衡,以及单独的 Service IP。遇到这种情况,可以通过指定spec.clusterIP的值为 None来创建 Headless Service 。这类 Service并不会分配 Cluster IP, kube-proxy不会处理它们,而且平台也不会为它们进行负载均衡和路由。
这里光看一段文字未免太抽象,我也曾是一脸懵,下边是我对于headless service的一个实际运用:
现有一个生产应用,Web服务分为前后端,未部署到kubernetes,采用虚拟机部署,其环境如下:
前端UI:192.168.7.57:8001
后端服务:192.168.7.27:8004
项目提出的转发要求如下:
路径 | 对应后端服务 |
/ | 192.168.7.57:8001 |
/api | 192.168.7.27:8004 |
/signin | 192.168.7.27:8004 |
/signout | 192.168.7.27:8004 |
前期我已使用nginx不同路径转发到不同端口实现了需求,配置如下:
upstream server57 {
server 192.168.7.57:8001;
}
upstream service27 {
server 192.168.7.27:8004;
}
server {
server_name bbs.test.com;
charset utf-8;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
client_body_timeout 300;
proxy_read_timeout 300;
client_header_timeout 300;
keepalive_timeout 300;
client_max_body_size 200m;
client_body_buffer_size 512k;
includeconf.d/cert/prod-web-ssl-nginx.conf; #引用证书,全部使用https访问
location {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection"";
proxy_pass http://server57;
}
location api {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection"";
proxy_pass http://server27;
}
location signin {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection"";
proxy_pass http://server27;
}
location signout {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection"";
proxy_pass http://server27;
}
}
由于该应用需要发布到公网,故存在https访问的安全需求,而应用自身不提供https,项目组也不愿意整改。现通过kubernetes headless service的方式进行发布。
我的kubernetes环境如下:
192.168.7.40-43,kubernetes 3个master节点
192.168.7.44-47,kubernetes 4个worker节点
整个集群通过rancher部署。
以下是本次运用实践:
1、Rancher上添加服务发现
依次把前后端对应的IP和端口添加为服务
2、Rancher上添加ingress规则
新增ingress规则bbs.test.com,并添加对应的服务
3、使用kubectl命令查看
4、nginx解析到Rancher对外提供服务
[root@localhost conf.d]# cat bbs.test.com.conf
upstream rancher-server {
server 192.168.70.40:443 weight=5max_fails=2 fail_timeout=3s;
server 192.168.7.41:443 weight=5max_fails=2 fail_timeout=3s;
server 192.168.7.42:443 weight=5max_fails=2 fail_timeout=3s;
server 192.168.7.43:443 weight=5max_fails=2 fail_timeout=3s;
server 192.168.7.44:443 weight=5max_fails=2 fail_timeout=3s;
server 192.168.7.45:443 weight=5max_fails=2 fail_timeout=3s;
#ip_hash;
}
server {
server_name bbs.test.com;
charset utf-8;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
client_body_timeout 300;
proxy_read_timeout 300;
client_header_timeout 300;
keepalive_timeout 300;
client_max_body_size 200m;
client_body_buffer_size 512k;
client_header_buffer_size 320k;
large_client_header_buffers 4 80k;
include conf.d/cert/prod-web-ssl-nginx.conf;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection"";
proxy_pass https://rancher-server;
}
}
你看明白了吗?如有问题、交流或错误指正,欢迎在下方留言或者发邮件我们一起探讨
125677227@qq.com,谢谢!
发表评论
暂时没有评论,来抢沙发吧~