暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kubernetes之headless service运用

发发个人实践及心得分享 2021-04-14
2036

声明:

本文档中的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,谢谢!

文章转载自发发个人实践及心得分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论