服务发布

服务发布

结合上文,我们的服务已经可以正常运行了,但它的访问方式只能通过服务器IP加上端口来访问,如何通过域名的方式来访问到我们服务,本来想使用Kubernetes的Ingress来做,折腾一天感觉比较麻烦,Ingress还得搭配Nginx使用,而且目前还是Beta版,就打算另辟蹊径,想到了之前用的Haproxy。

本文就结合OpenStack的负载和Haproxy来实现通过域名的方式访问K8s内部要发布的服务,用到的组件有OpenStack的负载均衡和Haproxy。

OpenStack负载配置到所有的K8s云主机上的一个端口,这个端口由Haproxy的K8s Service来监听,有请求过来时Haproxy根据不同的域名转发到对应的H8s Servie的Cluster IP。

整体拓扑图

具体的配置

OpenStack负载配置:

添加一个负载

注意它的IP地址,需要给它分配一个浮动IP,这样外部才能访问到

负载均衡池

30008 是Haproxy Service配置的NodePort

Haproxy配置

通过Kubernetes来运行Haproxy

haproxy-service.yml

{
    "kind": "Service",
    "apiVersion": "v1",
    "metadata": {
        "name": "haproxy-service"
    },
    "spec": {
        "type": "NodePort",
        "selector": {
            "app": "haproxy"
        },
        "ports": [
            {
                "name": "proxy",
                "protocol": "TCP",
                "port": 80,
                "nodePort": 30008,
                "targetPort": 80
            },
            {
                "name": "admin",
                "protocol": "TCP",
                "port": 8888,
                "targetPort": 8888,
                "nodePort": 30001
            }
        ]
    }
}

haproxy.cfg

global
    maxconn 51200
    chroot /usr/local/haproxy
    uid 99
    gid 99
    daemon
    nbproc 1
    pidfile /var/run/haproxy-private.pid
defaults
    mode http
    option redispatch
    option abortonclose
    timeout connect 5000ms
    timeout client 30000ms
    timeout server 30000ms
    log 127.0.0.1 local0 err
    balance roundrobin
listen admin_stats
    bind 0.0.0.0:8888
    option httplog
    stats refresh 30s
    stats uri /stats
    stats realm Haproxy Manager
    stats auth admin:1
frontend thrift-app
    bind *:80
    option forwardfor
    maxconn 1000
    acl dashboard hdr(host) -i dashboard.k8s.io
    acl scope hdr(host) -i scope.k8s.io
    acl thrift_test hdr(host) -i test.k8s.io
    use_backend dashboard_app if dashboard
    use_backend scope_app if scope
    use_backend thrift_app_1 if thrift_test
backend dashboard_app
    balance roundrobin
    option forwardfor
    option httpclose
    retries 3
    server s1 10.12.48.203:80
backend scope_app
    balance roundrobin
    option forwardfor
    option httpclose
    retries 3
    server s2 10.1.125.203:80

backend thrift_app_1
    balance roundrobin
    option forwardfor
    option httpclose
    retries 3
    server s3 10.0.100.1:9091

需要注意的是backend的server后面的ip可以是集群服务的cluster ip也可以通过dns来访问,如thrift-c-app,如果是跨namespace需要完整的domain,如:

thrift-c-app.thrift-demo.svc.cluster.local:9091

Haproxy运行在K8s集群,所以不用担心haproxy的压力,可以随时扩容Pods来解决。这里有一个问题是如何把 haproxy.cfg 配置文件做成动态的,不用每次修改后还要生成Image重新启动服务,解决办法可以参考https://hub.docker.com/_/haproxy/ 的 Reloading config.

我们来看一下Haproxy的管理界面,访问http://192.196.1.160:30267/stats

测试

先配置本地的Hosts,将所有的域名都指向负载的浮动IP上

192.196.1.156 dashboard.k8s.io
192.196.1.156 scope.k8s.io
192.196.1.156 test.k8s.io

然后访问域名,如dashboard.k8s.io

还有我们的测试服务

如预期一样,正常返回。这样所有要发布的WEB应用都通过一个端口来对外提供服务,所有集群里的云主机都可以做为负载资源,而且Haproxy本身可以扩容,目前来看不会有什么瓶颈而且用起来也比较顺手。

现在看起来一切都可以正常使用了,那还差什么呢? 想一想在并发压力大的情况下如何弹性扩容是个问题,这将在下文中讲解。

时间: 11-26

服务发布的相关文章

8. Dubbo原理解析-代理之服务发布

服务发布是服务提供方向注册中注册服务过程,以便服务消费者从注册中心查阅并调用服务. 服务发布方在spring的配置文件中配置如下: <bean id="demoService"class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" /> 上面是在spring中配置的服务的具体实现,是spring中的一个普通的bean <dubbo:serviceinterface="com.alib

arcgis server之路网服务发布

路网服务发布首先需要建立好道路的网络集,为了保证道路网络分析的准确性,建立网络集之前,要对道路图层进行拓扑差错,确保道路的连通性.具体操作流程为:道路拓扑差错-建立几何网络集-路网服务发布. 1.道路拓扑差错: (1)通过Arccatalog建立个人地理数据库以及要素集,如图: (2)    在要素集右键菜单,导入道路图层,如图: (3)    在要素集右键菜单 新建-拓扑,弹出界面: (4)最后把拓扑的道路图层拖拽进去ArcMap进行拓扑差错,利用ArcGIS拓扑工具消除线条错误之处. 2.建

多线程端点服务发布程序(摘)

多线程端点服务发布程序 摘自:JAVA WEB服务:构建与运行 任增刚 <Java Web服务:构建与运行>以示例驱动的方式详尽地介绍了XML Web服务和RESTful Web服务所涵盖的Java相关API,以清晰.务实的方法讲述Web服务相关技术,第1章讲述Java Web服务快速入门.本节说的是多线程端点服务发布程序. AD: 2014WOT全球软件技术峰会北京站 课程视频发布 1.10  多线程端点服务发布程序 Multithreading the Endpoint Publisher

arcgis server10.2.2之地理编码服务发布

1.地理编码工具(Geocoding Tools)locator制作     打开arcCatalog,找到工具箱ArcToolbox中的Geocoding Tools---Create Address Locator,界面如下: 2.locator已经制作完成,接下来就是发布地理编码服务 右键locator工具,选择Share as---Geocode Service,界面如下: 3.到这里,地理编码服务已经结束,最后是测试一下发布的服务是否成功 打开url:http://localhost:

简析GeoServer服务的内部文件组织以及GeoServer自动化服务发布工具的开发思路

1.前言 通过GeoServer发布的服务,在GeoServer内部有固定的文件组织和构造.如果对该文件组织和构造有足够的了解,可以通过此规则来自己开发GeoServer服务的发布工具,简化工程人员的操作流程.此篇文章将跟大家一起探讨其中规则. 2.了解GeoServer中与服务相关的基本文件 在GeoServer的Data文件夹中有如下文件: 其中,workspaces文件是图层服务相关的配置文件存放处. styles文件夹是style相关文件的默认存放处. 2.1workspaces文件夹

新加的服务发布成功,但是调用时找不到

日志:exception is java.lang.NoSuchMethodError: com.ejlerp.saleorder.api.SaleOrderWarehouseService.clearRetryNum(Lcom/ejlerp/common/vo/CallerInfo;Ljava/util/List;)V 问题描述: (1)在 SaleOrderWarehouseService 里面新增了方法 clearRetryNum,并在微服务项目中测试没有问题. (2)在 api项目中 

[数据共享(干货)] wcf rest 服务发布数据 以及获得数据

最近在做一个项目 ,需要我们做一个东西,我们姑且叫数据共享吧,我们公司叫A公司,对方公司叫B公司,就是A公司提供一个数据服务接口出去,B公司如果想拿我们数据的时候直接调用我们的服务接口就行了,我们同样要获取对方B方的数据,直接拿对方的数据,经过协商我们决定采用WCF服务的REST方式进行数据共享,数据格式采用json,POST 方式进行请求 1,首先就是我们要进行发布我们的数据,如何写一个WCF REST 服务呢,请看我的这篇文章http://www.cnblogs.com/huchaoheng

[系统集成] 用 Kubernetes Nginx Ingress 实现 HTTP 服务发布与负载均衡

用户在 Kubernetes 上部署的服务一般运行于私有网络,Pod和Service 提供了 hostPort,NodePort等参数用于暴露这些服务端口到K8S节点上,供使用者访问.这样的方法有明显缺点: 1)容易占用过多的主机端口: 2)服务端口暴露到多台主机会增加防火墙和安全配置的难度 3)默认的hostPort,NodePort方式没有负载均衡的作用 K8S的 Ingress 资源提供了另一种服务暴露的方法,它可以获取各个服务的状态,传递给nginx等工具进行配置修改.重新加载等工作,实

LBS(位置定位服务)发布小清新版本

web前端对我来说始终是一个短板,当然在不追求全栈的情况下,我也觉得没必要多精通,至少对于平常调整已经比较熟悉了.但是这次因为将lbs的页面外包给别人,而因为各种各样的原因导致交付时间一拖再拖,让人非常失望,大感掌握前端的必要性.总算在前几天交付了,使用的是bootstrap,虽然这个前端框架之前就又耳闻,但是因为公司一直使用ext,也没有涉略.这次没办法,已经答应了合作伙伴在4月份之前搞出来,所以上一周边学bootstrap边做,现在发现bootstrap就是我之前一直想找的框架.为什么这么说