kubernetes之headless service运用

网友投稿 1349 2022-10-25

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

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,谢谢!

上一篇:Kubernetes | 存储卷(1/2)
下一篇:巧用 Kubernetes 中的 Leader 选举机制来实现自己的 HA 应用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~