精华内容
下载资源
问答
  • Kubernetes Istio微服务架构部署和使用

    千次阅读 2019-04-24 09:17:19
    该方案降低了与微服务架构相关的复杂性,并提供了负载均衡、服务发现、流量管理、断路器、监控、故障注入和智能路由等功能特性。 其中,Sidecar模式是一种将应用功能从应用本身剥离出来作为单独进程的方式。该模式...

    什么是Istio

    Istio是Service Mesh(服务网格)的主流实现方案。该方案降低了与微服务架构相关的复杂性,并提供了负载均衡、服务发现、流量管理、断路器、监控、故障注入和智能路由等功能特性。

    其中,Sidecar模式是一种将应用功能从应用本身剥离出来作为单独进程的方式。该模式允许我们向应用无侵入添加多种功能,避免了为满足第三方组件需求而向应用添加额外的配置代码。从某种意义上来说,服务对于网络是无感知的,只知道所附加的sidecar代理,它将网络依赖抽象成了Sidecar。

    在Service Mesh中,我们需要了解Data Plane和Control Plane两个概念:

    • Data Plane:作用是处理网格内服务间的通信,并完成服务发现、负载均衡、流量管理、健康检查等功能;
    • Control Plane:作用是管理和配置策略用于路由流量,同时也在运行期执行策略。

    Istio核心组件

    • Envoy:Istio 使用 Envoy调解服务网格中所有服务的入站和出站流量。属于数据平面。
    • Mixer:负责在服务网格上执行访问控制和使用策略,以及收集从Envoy和其他服务自动监控到的数据。
    • Pilot:为 Envoy sidecar 提供服务发现功能,为智能路由(例如 A/B 测试、金丝雀部署等)和弹性(超时、重试、熔断器等)提供流量管理功能。属于控制平面。
    • Citadel:提供访问控制和用户身份认证功能。

    Istio可视化管理组件

    其中,Kiali、Jaeger、prometheus、grafana管理工具,将和Istio一并部署。

    使用Helm部署Istio

    依赖环境
    Helm > 2.10
    Kubernetes > 1.9

    下载并解压缩istio的发布包

    1
    2
    3
    
    wget https://github.com/istio/istio/releases/download/1.0.6/istio-1.0.6-linux.tar.gz
    tar -zxvf istio-1.0.6-linux.tar.gz
    cd istio-1.0.6
    

     

    Istio的Chart在istio-1.0.6/install/kubernetes/helm目录中,这个Chart包含了下面的代码文件

    1
    2
    3
    4
    
    # tree install/kubernetes/helm/istio
    ......
    ......
    31 directories, 139 files
    

     

    如果安装的Helm版本高于2.10,就不再需要手动使用kubectl安装Istio的CRD。反之,则需要执行如下命令安装

    1
    
    kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
    

     

    查看安装的CRD

    1
    
    kubectl get CustomResourceDefinition
    

     

    通过各个组件在vaule file的enabled flag启用或禁用,下面创建名称为istio.yaml的vaule file,将几个默认禁用的组件也启用

    1
    2
    3
    4
    5
    6
    7
    8
    
    tracing:
      enabled: true
    servicegraph:
      enabled: true
    kiali:
      enabled: true
    grafana:
      enabled: true
    

     

    首先,创建名称为kiali的secret。

    1
    2
    
    # echo -n 'admin' | base64
    YWRtaW4=
    

     

    1
    2
    
    # echo -n '1f2d1e2e67df' | base64
    MWYyZDFlMmU2N2Rm
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    # cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: kiali
      namespace: istio-system
      labels:
        app: kiali
    type: Opaque
    data:
      username: YWRtaW4=
      passphrase: MWYyZDFlMmU2N2Rm
    EOF
    

    执行helm安装命令

    1
    
    helm install install/kubernetes/helm/istio --name istio --namespace istio-system -f istio.yaml
    

     

    安装完成后确认各个组件的Pod正常运行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    # kubectl get pod -n istio-system
    NAME                                      READY   STATUS      RESTARTS   AGE
    grafana-59b8896965-5f9j2                  1/1     Running     0          23m
    istio-citadel-6f444d9999-s9jrc            1/1     Running     0          23m
    istio-egressgateway-6d79447874-ssbc4      1/1     Running     0          23m
    istio-galley-685bb48846-mvf5w             1/1     Running     0          23m
    istio-grafana-post-install-6m256          0/1     Completed   0          23m
    istio-ingressgateway-5b64fffc9f-mrl9t     1/1     Running     0          23m
    istio-pilot-8645f5655b-k6fcz              2/2     Running     0          23m
    istio-policy-547d64b8d7-6dgkp             2/2     Running     0          23m
    istio-sidecar-injector-5d8dd9448d-zfdsb   1/1     Running     0          23m
    istio-telemetry-c5488fc49-qwwcv           2/2     Running     0          23m
    istio-tracing-6b994895fd-4vjfx            1/1     Running     0          23m
    kiali-5f9ffff7cf-jqk8p                    1/1     Running     0          23m
    prometheus-76b7745b64-xjzmm               1/1     Running     0          23m
    servicegraph-cb9b94c-mlhjm                1/1     Running     0          23m
    

     

    Istio 以一个项目的形式部署到 Kubernetes 集群中。我们可以看到,部署好的 pods 中,除了有 istio-citadel、istio-egressgateway、istio-ingressgateway、istio-pilot 等 Istio 本身的功能组件,还集成了微服务相关的监控工具,如:grafana、jaeger-agent、kiali、prometheus。正是这些功能丰富且强大的监控工具,帮助 Istio实现了微服务的可视化管理。

    运行示例Bookinfo

    您可以部署自己的应用或者示例应用程序如 Bookinfo。 注意:应用程序必须使用 HTTP/1.1 或 HTTP/2.0 协议来传递 HTTP 流量,因为 HTTP/1.0 已经不再支持。

    如果运行 Pod 的 namespace 被标记为 istio-injection=enabled 的话,Istio-Initializer 会向应用程序的 Pod 中自动注入 Envoy 容器:

    1
    2
    
    kubectl label namespace <namespace> istio-injection=enabled
    kubectl create -n <namespace> -f <your-app-spec>.yaml
    

     

    如果您没有安装 Istio-initializer-injector 的话,您必须使用 istioctl kube-inject 命令在部署应用之前向应用程序的 Pod 中手动注入 Envoy 容器:

    1
    
    kubectl create -f <(istioctl kube-inject -f <your-app-spec>.yaml)
    

     

    Bookinfo 应用由四个单独的微服务构成,用来演示多种 Istio 特性,包含:

    • productpage :productpage 微服务会调用 details 和 reviews 两个微服务,用来生成页面。
    • details :这个微服务包含了书籍的信息。
    • reviews :这个微服务包含了书籍相关的评论。它还会调用 ratings 微服务。
    • ratings :ratings 微服务中包含了由书籍评价组成的评级信息。

    reviews 微服务有 3 个版本:

    • v1 版本不会调用 ratings 服务。
    • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
    • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

    下图展示了这个应用的端到端架构。
    image

    运行示例bookinfo,并开启Sidecar自动注入。

    1
    2
    3
    4
    
    # kubectl label namespace default istio-injection=enabled
    # kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    # kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    # kubectl apply -f samples/bookinfo/platform/consul/destination-rule-all.yaml
    

     

    访问productpage
    http://172.16.0.180:31380/productpage
    image

    31380端口可以通过命令获取

    1
    
    kubectl -n istio-system get svc istio-ingressgateway -o jsonpath='{.spec.ports[0].nodePort}'
    

     

    使用Ingress暴露管理服务

    完成Istio的安装后,可以看到安装的组件除了Istio架构中的数据平面和控制平面的各个核心组件,还部署了Prometheus、Grafana、Jaeger、Kiali等辅助组件。 在云原生生态中,我们已经对这些组件很熟悉了。

    • Prometheus:监控系统,收集Istio的监控数据
    • Grafana:监控信息的图表展现,Istio部署的Grafana为我们内置了各个组件相关的Dashboard
    • Jaeger:分布式跟踪系统,Istio中集成Jaeger可以对基于Istio的微服务实现调用链跟踪、依赖分析,为性能优化和故障排查提供支持
    • kiali:kiali作为Istio的可视化管理工具,可以认为是Istio的UI,可以展现服务的网络拓扑、服务的容错情况(超时、重试、短路等)、分布式跟踪等

    这些辅助组件都有自己的web界面,这里我们使用ingress的方式将这些组件暴露到集群外,以便在集群外部访问。Istio支持使用自带的istio-ingressgateway将服务暴露到集群外部,这个和Kubernetes中暴露Ingress Controller类似,有很多种方式,如NodePort,LoadBalancer,或直接开启hostNetwork: true等等。为了便于统一管理K8s集群中的服务暴露,笔者更倾向使用Traefik Ingress。

    使用Ingress暴露istio服务
    编写ingress yaml文件,如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    
    # cat istio-ingress.yaml 
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: jaeger-query
      namespace: istio-system
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      rules:
      - host: istio.jaeger-query.com
        http:
          paths:
          - path: /
            backend:
              serviceName: jaeger-query
              servicePort: 16686
    
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: prometheus
      namespace: istio-system
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      rules:
      - host: istio.prometheus.com
        http:
          paths:
          - path: /
            backend:
              serviceName: prometheus
              servicePort: 9090
    
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: grafana
      namespace: istio-system
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      rules:
      - host: istio.grafana.com
        http:
          paths:
          - path: /
            backend:
              serviceName: grafana
              servicePort: 3000
    
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: kiali
      namespace: istio-system
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      rules:
      - host: istio.kiali.com
        http:
          paths:
          - path: /
            backend:
              serviceName: kiali
              servicePort: 20001
    

     

    执行部署命令

    1
    
    kubectl apply -f istio-ingress.yaml
    

     

    外部客户端,配置hosts地址解析,如下

    1
    2
    3
    4
    
    172.16.0.180 istio.prometheus.com
    172.16.0.180  istio.jaeger-query.com
    172.16.0.180  istio.grafana.com
    172.16.0.180  istio.kiali.com
    

     

    访问jaeger
    浏览器访问Jaeger之前可以多次刷新productpage页面以便产生访问请求等。选择productpage.default可以查看整个调用链。使用istio.jaeger-query.com域名访问,结果展示:
    image

    访问kiali
    使用域名istio.kiali.com访问kiali页面。用户名admin,密码1f2d1e2e67df。
    image

    访问prometheus
    使用域名istio.prometheus.com访问prometheus页面。
    image

    访问grafana
    使用域名istio.grafana.com访问prometheus页面。
    image

    Istio 对 Pod 和服务的要求

    要成为服务网格的一部分,Kubernetes 集群中的 Pod 和服务必须满足以下几个要求:

    • 需要给端口正确命名:服务端口必须进行命名。端口名称只允许是<协议>[-<后缀>-]模式;
    • Pod必须关联到 Kubernetes服务:如果一个 Pod 属于多个服务,这些服务不能再同一端口上使用不同协议,例如 HTTP 和 TCP。
    • Deployment应带有app以及version标签:每个 Deployment 都应该有一个有意义的 app 标签和一个用于标识 Deployment 版本的 version 标签。Istio 会用 app 和 version 标签来给监控指标数据加入上下文信息。

    总结

    本文实践了使用istio官方提供的helm chart在Kubernetes上部署Istio 1.0.6的过程,并使用traefik ingress将Istio集成的Prometheus、Grafana、Jaeger、Kiali等辅助组件暴露到集群外部,并对进入集群的流量进行管理。

    在生产环境中,如果是基于公有云,如阿里云、AWS等运行Istio,建议Ingress的IP地址使用ELB地址;如果是自建的平台,则建议使用HAproxy+Keepalived提供的VIP地址,作为Ingress的IP地址,实现高可用。

    如果Ingress服务,需要暴露在公网,应当使用CA认证机构颁发的证书https化(如使用cert-manager)。此外建议使用NFS、Ceph等方案实现Istio监控以及微服务应用的数据持久化存储。

    关注微信公众号,获取更多信息

    文章来源:https://xuchao918.github.io/2019/03/01/Kubernetes-Istio%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E9%83%A8%E7%BD%B2%E5%92%8C%E4%BD%BF%E7%94%A8/ 

    展开全文
  • 微服务架构的多种部署模式 声明:本文主要内容来自《微服务架构设计模式》 部署包含两个互相关联的概念:流程和架构。部署流程包括一些由开发人员和运维人员执行的过程,以便将软件发布到生产环境。部署架构定义了...

    微服务架构的多种部署模式

    声明:本文主要内容来自《微服务架构设计模式》

    部署包含两个互相关联的概念:流程和架构。部署流程包括一些由开发人员和运维人员执行的过程,以便将软件发布到生产环境。部署架构定义了该软件运行的环境结构。

    以微服务架构开发的程序,经常涉及到多个服务组成,后端的网关模块,用户模块,日志模块,业务模块等,还有前端Node.js模块。以笔者所在公司为例,每次部署服务时都要互相之间沟通协调好,方便服务之间的调用。一般在开发环境中多以jar形式部署,从本地直接打包发布到服务器,方便快捷,适合与其他业务调试时及时解决修复问题。但这样也存在一定的弊端,由于本地打包都是自己修改后的代码,如果没有及时将更改提交到git上,很容易遗漏其他协作开发的同事的代码,可能自己的代码调试完成,同事的却出现问题。
    image-20200321205118007

    ​ 图中抽象描述微服务架构中多种服务的组成和调用关系

    当涉及测试和生产环境的部署时,需要注意的地方更多,打包上传这种方式存在很大的漏洞,不够流程化,而且服务器上可能运行各种语言和框架编写的服务,每个服务都是一个小应用程序,这意味着你在生产环境中有数十或数百个应用程序。因此让系统管理员手动配置服务器和服务已不再可行。如果要大规模部署微服务,则需要高度自动化的部署流程和基础设施。

    生产环境必须实现四个关键功能:

    • 服务管理接口: 使开发人员能够创建、更新和配置服务。理想情况下,这个接口是一个可供命令行和图形部署工具调用的REST API。

    • 运行时服务管理:确保始终运行着所需数量的服务实例。如果服务实例崩溃或由于某种原因无法处理请求,则生产环境必须重新启动它。如果运行服务的主机发生崩溃,则必须在其他主机上重新启动这些服务实例。

    • 监控:让开发人员深入了解服务正在做什么,包括日志文件和各种应用指标。如果出现问题,必须提醒开发人员,也称为可观测性。

    • 请求路由:将用户的请求路由到服务。

    概述

    故本文将阐述三个关键部署模式,并分析它们的好处和弊端。

    1. 编程语言特定的发布包格式,例如Java JAR或WAR文件。我并不推荐这种做法,之所以介绍这个选项,是因为这个部署方法有各种显著的缺点,会促使你思考和选择其他更为合理和现代化的部署技术。
    2. 将服务部署为虚拟机,把服务打包为虚拟机镜像,这个镜像封装了服务的技术栈,这样可以简化部署。
    3. 将服务部署为容器,这些容器比虚拟机更轻量级。

    1 编程语言特定的发布包格式

    假设你要部署一个基于Spring Boot的Java应用程序。部署此服务的一种方法是使用特定于编程语言的软件包部署服务。使用此模式时,生产环境中部署的内容以及服务运行时管理的内容都是特定于语言的发布包中的服务。在Restaurant service的场景下,它是可执行的JAR文件或WAR文件。对于其他语言,例如Nodejs,服务是源代码和模块的目录。对于某些语言,例如GoLang,服务是特定于操作系统某个路径下的可执行文件。

    模式:编程语言特定的发布包格式,使用特定于编程语言的软件发布包将服务部署到生产环境。

    要在计算机上部署Java应用程序,首先要安装必要的运行时,在本例中为JDK。如果它是WAR文件,则还需要安装Web容器,例如Apache Tomcat。配置完计算机后,将程序发布包复制到计算机并启动该服务。每个服务实例都作为JVM进程运行。理想情况下,你已经设置好部署流水线,它会自动将服务部署到生产环境。部署流水线构建可执行的JAR文件或WAR文件,然后它们调用生产环境的服务管理接口来部署新版本。

    服务实例通常是单个进程,但有时可能是一组进程。例如,Java服务实例是运行JVM的进程。 Node js服务可能会生成多个工作进程,以便同时处理请求。某些语言支持在同一进程中部署多个服务实例。
    有时,可以在计算机上部署单个服务实例,同时保留在同一台计算机上部署多个服务实例的选项。例如,如图12-4所示,可以在一台计算机上运行多个JVM每个JVM都运行个服务实例。

    image-20200321213222442图中在同一台计算机上部署多个服务实例它们可能是相同服务的实例,也可能是不同服务的实例。操作系统的开销在服务实例之间共享。每个服务实例都是一个单独的进程,因此它们之间存在一些隔离。

    image-20200321213627616

    某些语言还允许在单个进程中运行多个服务实例。例如,如图所示,可以在单个 Apache Tomcat上运行多个Java服务。
    进程,在同一Web容器或应用程序服务器上部署多个服务实例。它们可能是相同服务的实例,也可能是不同服务的实例。操作系统和运行时的开销在所有服务实例之间共享。但是因为服务实例处于同一个进程中,所以它们之间没有隔离。

    将服务作为特定于语言的发布包进行部署的模式有好处也有弊端。我们先来看看好处。

    使用编程语言特定的发布包格式进行部署的好处

    将服务作为特定于编程语言的发布包进行部署有以下好处:

    • 快速部署。
    • 高效的资源利用,尤其是在同一台机器上或同一进程中运行多个实例时。

    我们来逐一分析。

    快速部署

    这种模式的一个主要好处是部署服务实例的速度相对较快:将服务复制到主机并启动它。如果服务是用Java编写的,则复制JAR或WAR文件。对于其他语言,例如js或Ruby,可以复制源代码。在任何一种情况下,需要通过网络复制的字节数相对较小。此外,启动服务耗时很短。如果服务运行于自己独占的进程,则启动它。否则,如果服务是在同一Web容器(例如Tomcat)进程中运行的多个实例之一,则可以将其动态部署到Web容器中,也可以重新启动Web容器。由于没有额外的开销,因此启动服务通常很快。

    高效的资源利用

    这种模式的另一个主要好处是它可以相对高效地使用资源。多个服务实例共享机器及其操作系统。如果多个服务实例在同一进程中运行,则效率更高。例如,多个Web应用程序可以共享相同的 Apache Tomcat服务器和JVM。

    使用编程语言特定的发布包格式进行部署的弊端

    尽管极具吸引力,但把服务作为特定于编程语言的发布包进行部署的模式有几个显著的

    • 缺乏对技术栈的封装。
    • 无法约束服务实例消耗的资源。
    • 在同一台计算机上运行多个服务实例时缺少隔离。
    • 很难自动判定放置服务实例的位置。

    我们来逐一分析。

    缺乏对技术栈的封装

    运维团队必须了解部署每个服务的具体细节每个服务都需要特定版本的运行时。例如, Java Web应用程序需要特定版本的 Apache Tomcat和JDK运维团队必须安装每个所需软件包的正确版本。
    更糟糕的是,服务可以用各种语言和框架编写。它们也可能用这些语言和框架的多个版本编写。因此,开发团队必须(以人工的方式)与运维团队分享许多细节。这种沟通的复杂性增加了部署期间出错的风险。例如,机器可能安装错误的语言运行时版本。

    无法约束服务实例消耗的资源

    另一个缺点是你无法约束服务实例所消耗的资源。一个进程可能会消耗机器的所有CPU或内存,争用其他服务实例和操作系统的资源。例如,出现某个错误,这种情况极有可能会发生。

    在同一台计算机上运行多个服务实例时缺少隔离

    在同一台计算机上运行多个实例时,问题更严重。缺乏隔离意味着行为不当的服务实例可能会影响其他服务实例。因此,应用程序存在不可靠的风险,尤其是在同一台计算机上运行多个服务实例时。

    很难自动判定放置服务实例的位置

    在同一台计算机上运行多个服务实例的另一个挑战是确定服务实例的位置。每台机器都有一组固定的资源、CPU、内存等,每个服务实例都需要一定的资源。以一种有效使用机器而不会使它们过载的方式将服务实例分配给机器非常重要。正如我稍后解释的那样,基于虚拟机的云主机和容器编排框架会自动处理这个问题。在本地部署服务时,你可能需要手动确定放置位置。

    正如你所看到的,服务作为特定于语言的发布包进行部署的模式具有一些显著的弊端。应该尽量避免使用这种方法,除非所获效率的价值远在其他所有考量之上。

    2 将服务部署为虚拟机

    模式:将服务部署为虚拟机,将作为虚拟机镜像打包的服务部署到生产环境中。每个服务实例都是一个虚拟机。虚拟机镜像由服务的部署流水线构建。部署流水线运行虚拟机镜像构建器,这个构建器创建包含服务代码和服务运行所需的任何软件的虚拟机镜像。例如,服务的安装JDK和服务的可执行JAR的虚拟机构建器。虚拟机镜像构建器使用 Linux的init系统(如 upstart)将虚拟机镜像配置成在虚拟机引导时运行该应用程序。

    部署流水线可以使用各种工具来构建虚拟机镜像。一个早期创建EC2AMI的工具是由 netflix aminator ( https://github. com/netflix/a ) Netflix AWS开发的Aminatorhtp:github.cm/netflix/aminator),netflix使用它在aws上部署其视频流服务 packer ( https://www.packer. io )是一个更现代的虚拟机镜像构建器,与 Aminator不同,它支持各种虚拟化技术,包括EC2 Digital Ocean、 Virtual Box和 VMware要使用 Packer创建AMI,你需要编写一个配置文件,用于指定基础镜像和一组安装软件并配置AMI的配置程序。

    关于它的好处和弊端

    将服务部署为虚拟机的好处

    • 虚拟机镜像封装了技术栈。
    • 隔离的服务实例。
    • 使用成熟的云计算基础设施。

    我们来逐一分析。

    虚拟机镜像封装了技术栈

    此模式的一个重要好处是虚拟机镜像包含服务及其所有依赖项。它消除了错误来源,确保正确安装和设置服务运行所需的软件。一旦服务被打包为虚拟机,它就会变成一个黑盒子,封装服务的技术栈。虚拟机镜像可以无须修改地部署在任何地方。用于部署服务的API成为虚拟机管理API。部署变得更加简单和可靠。

    隔离的服务实例

    虚拟机的另一个好处是每个服务实例都以完全隔离的方式运行。毕竟,这是虚拟机技术的主要目标之一。每台虚拟机都有固定数量的CPU和内存,不能从其他服务中窃取资源。

    使用成熟的云计算基础设施

    将微服务部署为虚拟机时,可以利用成熟且高度自动化的云计算基础设施。AWS等公共云试图以避免机器过载的方式在物理机上调度虚拟机。它们还提供有价值的功能,例如跨虚拟机的流量负载均衡和自动扩展。

    将服务部署为虚拟机的弊端

    • 资源利用效率较低。
    • 部署速度相对较慢。
    • 系统管理的额外开销。
    资源利用效率较低。

    每个服务实例拥有一整台虚拟机的开销,包括其操作系统。此外,典型的公共IaaS虚拟机提供有限的虚拟机配置组合,因此虚拟机可能未得到充分利用。这不太可能成为基于Java的服务的问题,因为它们一般都相对较重。但这种模式可能是部署轻量级 Nodejs和 GoLang服务的低效方式。

    部署速度相对较慢

    由于虚拟机的大小,构建虚拟机镜像通常需要几分钟。有很多内容要通过网络传输。此外,由于必须通过网络传输完整的虚拟机镜像文件,从镜像实例化虚拟机是非常耗时的。在虚拟机内部运行的操作系统也需要一些时间来启动,尽管慢速是一个相对的术语。这个过程可能需要几分钟,比传统的部署过程要快得多。但它比你即将学习的更轻量级的部署模式要慢得多。

    系统管理的额外开销

    你不得不担负起给操作系统和运行时打补丁的责任。这对于部署软件时的系统管理似乎是不可避免的,但在后面的12.5节中,我Serverless将描述部署,它消除了这种系统管理的方式。

    现在让我们看一下部署微服务更加轻量但仍每一个容器都是隔离进程的沙箱具有虚拟机诸多优点的替代方法。

    3 将服务部署为容器

    容器是一种更现代、更轻量级的部署机制,是一种操作系统级的虚拟化机制。容器通常包含一个或多个在沙箱中运行的进程,这个沙箱将它们与其他容器隔离。例如,运行Java服务的容器通常由JVM进程组成。
    从在容器中运行的进程的角度来看,它就好像在自己的机器上运行一样。它通常有自己的机器IP地址,可以消除端口冲突。例如,所有Java由所有容器共享进程都可以侦听端口8080。每个容器也有自己的根文件系统。容器运行时使用操作系统机制将容器彼此隔离。

    image-20200321215531191

    模式:将服务部署为容器将作为容器镜像打包的服务部署到生产环境中每个服务实例都是一个容器。

    创建容器时,可以指定它的CPU和内存资源,以及依赖于容器实现的I/O资源等。容器运行时强制执行这些限制,并防止容器占用其机器的资源。使用 Docker编排框架(如 Kubernetes)时,指定容器的资源尤为重要。这是因为编排框架使用容器请求的资源来选择运行容器的底层机器,从而确保机器不会过载。
    在构建服务时,部署流水线使用容器镜像构建工具,该工具读取服务代码和镜像描述,以创建容器镜像并将其存储在镜像仓库中。在运行时,从镜像仓库中拉取容器镜像,并用于创建容器。

    使Docker用部署服务

    要将服务部署为容器,必须将其打包为容器镜像。容器镜像是由应用程序和运行服务所需的依赖软件组成的文件系统镜像。它通常是一个完整的 Linux根文件系统,但更轻量级的镜像也可以使用。例如,要部署基于 Spring Boot的服务,需要构建一个容器镜像,其中包含服务的可执行JAR和正确的JDK版本。同样,部署 Java Web应用程序,需要构建一个包含WAR文件 Apache、 Tomcat和JDK的容器镜像。主要分为以下步骤。

    1. 构建 Docker镜像
    2. 将Docker镜像推送到镜像仓库
    3. 运行Docker容器

    将服务部署为容器的好处

    将服务部署为容器有几个好处。首先,容器具有虚拟机的许多好处:

    • 封装技术栈,可以用容器的API实现对服务的管理。
      服务实例是隔离的。
    • 服务实例的资源受到限制。

    但与虚拟机不同,容器是一种轻量级技术容器镜像通常可以很快构建。例如,只需几秒就可以将 Spring Boot应用程序打包为容器镜像。通过网络传输容器镜像也相对较快主要是因为仅传输所需要的镜像层的子集。(这是因为 Docker镜像具有所谓的分层文件系统,使得 Docker只需要通过网络传输部分镜像。镜像的操作系统、Java运行时和应用程序位于不同的层中。 Docker只需要传输镜像仓库中不存在的那些层。因此,当 Docker只需移动应用程序层时,通过网络传输镜像特别快)。容器也可以很快启动,因为没有冗长的操作系统启动过程。当容器启动时,所运行的就是服务。

    将服务部署为容器的弊端

    容器的一个显著弊端是,你需要承担大量的容器镜像管理工作。你必须负责给操作系统和运行时打补丁。此外,除非使用托管容器解决方案(如 Google Container Engine或awsECS),否则你必须管理容器基础设施以及容器运行可能需要的虚拟机基础设施。

    展开全文
  • 10 maxOpenConns: 10 logMode: true ... 4 uploaddir: 5 domainName: 6 ssl: 7 注意请将配置文件放置在根目录 golang gin框架微服务一键搭建,为您很好的服务 文章来源 :http://blog.zngue.com/post/59bd5a2b26.html
    mysql:
        username: root #用户名
        password: root #密码
        path: 127.0.0.1:3306 #数据库配置
        host: 127.0.0.1 #地址
        port: 3306 #端口
        dbName: gin #数据库
        config: charset=utf8&parseTime=True&loc=Local #配置
        maxIdleConns: 10
        maxOpenConns: 10
        logMode: true
        charset: utf8
        timeStamp: false #是否使用时间戳自动维护 false  false  使用 GormModel  true 使用 TimeStampModel
    jwt: #jwt配置项
        secret: zngue
        expireTime: 3600 #有效期  以秒为单位计算
        issuer:  zngue.com #发行人
        subject: zngue.com #主题
    defaultLoad:
        mysql: true #是否默认启动mysql
        redis: true #是否默认启动redis
    redis:
        host: 127.0.0.1
        password:
        port: 6379
        dbNum: 10
        poolSize: 10000
    log:
        path: log
    system:
        port: 8899
        sysName: 系统名称
    httpRequest:
        serviceMode: true
        redisDbNum: 11
    serviceList:
        - name: sy:composition
          url: 192.168.184.7:8022
        - name: sy:go:integral_mall
          url: 192.168.184.7:6766
        - name: trest
          url:  192.168.184.7:8001
        - name: trest
          url: 192.168.184.7:8008
        - name: sy:dazzle
          url:  192.168.184.7:8003
        - name: trest
          url: 127.0.0.1:7895
    aliyunoss:
        accessid: 1
        accesskey: 2
        endpoint: 3
        bucket: 4
        uploaddir: 5
        domainName: 6
        ssl: 7

    注意请将配置文件放置在根目录

    golang gin框架微服务一键搭建,为您很好的服务 

     

    文章来源 :http://blog.zngue.com/post/59bd5a2b26.html

    展开全文
  • 原文:微服务架构 - CentOS7离线部署docker1、环境准备系统环境为:CentOS Linux release 7.5.1804 (Core)安装docker版本为:17.12.0-ce2、准备部署文件在http://mirrors.163.com/centos/7/os/x86_64/Packages/中下载...

    原文:微服务架构 - CentOS7离线部署docker

    1、环境准备

    系统环境为:

    CentOS Linux release 7.5.1804 (Core)

    安装docker版本为:

    17.12.0-ce

    2、准备部署文件

    在http://mirrors.163.com/centos/7/os/x86_64/Packages/中下载如下rpm安装包:

    audit-2.8.4-4.el7.x86_64.rpm

    audit-libs-2.8.4-4.el7.x86_64.rpm

    libselinux-2.5-14.1.el7.x86_64.rpm

    libselinux-python-2.5-14.1.el7.x86_64.rpm

    libselinux-utils-2.5-14.1.el7.x86_64.rpm

    libsemanage-2.5-14.el7.x86_64.rpm

    libsepol-2.5-10.el7.x86_64.rpm

    policycoreutils-2.5-29.el7.x86_64.rpm

    audit-libs-python-2.8.4-4.el7.x86_64.rpm

    checkpolicy-2.5-8.el7.x86_64.rpm

    libcgroup-0.41-20.el7.x86_64.rpm

    libsemanage-python-2.5-14.el7.x86_64.rpm

    libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm

    policycoreutils-python-2.5-29.el7.x86_64.rpm

    python-IPy-0.75-6.el7.noarch.rpm

    setools-libs-3.3.8-4.el7.x86_64.rpm

    在https://download.docker.com/linux/centos/7/x86_64/stable/Packages/中下载docker的安装包:

    docker-ce-17.12.0.ce-1.el7.centos.x86_64.rpm

    在http://rpm.pbone.net/index.php3/stat/4/idpl/36266349/dir/scientific_linux_7/com/container-selinux-2.9-4.el7.noarch.rpm.html中下载container-selinux安装包:

    container-selinux-2.9-4.el7.noarch.rpm

    经测试本系统中有些rpm安装包是需要update,有些是要install,为此将上述的rpm包分成update_rpm和install_rpm,其中:

    update_rpm中的rpm有:

    audit-2.8.4-4.el7.x86_64.rpm

    audit-libs-2.8.4-4.el7.x86_64.rpm

    libselinux-2.5-14.1.el7.x86_64.rpm

    libselinux-python-2.5-14.1.el7.x86_64.rpm

    libselinux-utils-2.5-14.1.el7.x86_64.rpm

    libsemanage-2.5-14.el7.x86_64.rpm

    libsepol-2.5-10.el7.x86_64.rpm

    policycoreutils-2.5-29.el7.x86_64.rpm

    install_rpm中的rpm有:

    audit-libs-python-2.8.4-4.el7.x86_64.rpm

    checkpolicy-2.5-8.el7.x86_64.rpm

    container-selinux-2.9-4.el7.noarch.rpm

    docker-ce-17.12.0.ce-1.el7.centos.x86_64.rpm

    libcgroup-0.41-20.el7.x86_64.rpm

    libsemanage-python-2.5-14.el7.x86_64.rpm

    libtool-ltdl-2.4.2-22.el7_3.x86_64.rpm

    policycoreutils-python-2.5-29.el7.x86_64.rpm

    python-IPy-0.75-6.el7.noarch.rpm

    setools-libs-3.3.8-4.el7.x86_64.rpm

    3、安装docker

    首先更新需要更新rpm,即执行如下命令:

    rpm -Uvh update_rpm/*.rpm

    安装需要安装的rpm,即执行如下命令:

    rpm -ivh install_rpm/*.rpm

    启动docker:

    systemctl start docker

    设置docker开机自启动:

    systemctl enable docker

    验证是否安装成功,直接输入如下命令:

    docker version

    如果出现下面页面,则表示安装成功了!

    20190322165033955817.png

    关注我

    以你最方便的方式关注我:

    微信公众号:

    20190322165034302474.jpg

    展开全文
  • .NET Core 微服务架构-Docker部署¶ 本文主要介绍通过Docker来部署通过.NET Core开发的微服务架构部署的微服务主要包括统一网关(使用Ocelot开发)、统一认证(IdentityServer4)、应用服务(ASP.NET Core WebAPI...
  • 微服务架构 面向服务型架构 我不了解面向服务的体系结构。 我认为这只是那些高度理论化和非常不切实际的软件体系结构模式之一。 换句话说,我认为这是建筑狂热者的梦想。 然后,我读了Martin Fowler的标题为...
  • 微服务架构

    2019-05-17 00:56:00
    微服务架构 原文:微服务架构net core 微服务架构-docker的部署-包括...本文主要介绍通过Docker来部署通过.Net Core开发的微服务架构部署的微服务主要包括统一网关(使用Ocelot开发)、统一认证(...
  • 深度理解微服务架构

    2020-12-09 22:43:26
    .Net Core下的GC(微服务架构微服务架构单体架构Monolithic垂直拆分分布式服务微服务架构SOA面向服务架构微服务架构基础微服务架构核心服务网格-Service MeshMicroservice 发展网关Gateway服务治理践行微服务架构-...
  • 微服务 & 微服务架构

    2021-04-11 18:05:02
    微服务架构 单体架构 VS 微服务架构 单体架构 一个工程对应一个归档包(war),这个war包 包含了该工程的所有功 能。我们成为这种应用为单体应用,也就是我们常说的单体架构(一个 war包打天下)。 具体描述: 就是在...
  • 上次我们说到 微服务架构的前世今生(七):微服务架构生态体系 ,这次我们在说说微服务架构的技术支持。作者 哈喽沃德先生,欢迎关注。 一、Spring Cloud Spring Cloud Netflix Eureka:服务注册中心。 Spring ...
  • 导入数据库 连接远程数据库 ...由于可能存在上传文件的问题,所以不部署 war 包,直接部署文件夹,把文件夹添加压缩包 上传到服务器 将压缩包放到 tomcat/webapps/Root 目录下,unzip 解压 启动 tomcat...
  • 微服务架构 - CentOS7离线部署docker 原文:微服务架构 - CentOS7离线部署docker1、环境准备 系统环境为: CentOS Linux release 7.5.1804 (Core) 安装docker版本为: 17.12.0-ce 2、准备部署文件...
  • Java微服务架构

    2021-06-09 19:57:50
    本课程从单体应用模型的问题为切入点,以理论配合实战的方式带领大家了解微服务架构的魅力。通过本课程您可以掌握从基本的Linux服务器架设到容器化引擎的自动化部署以及以Spring Boot为核心开发框架的全栈式分布式...
  • 微服务架构学习文档

    2020-10-23 22:10:44
    微服务架构学习文档 Netflix流媒体播放平台微服务架构: oes目前设想: 微服务架构特性: 单一职责 轻量级通信(通过http、rpc协议下的xml、json格式,无关语言、平台) 独立开发、测试、部署(并行工程) ...
  • 在J2EE开发中,通常将应用部署到Tomcat或者Jetty等Servlet容器中。...因为在微服务架构中,会涉及大量服务的部署,这种轻量级方案无疑会简化部署,并且极大提高微服务的部署效率。 1 可执行的jar包 make Jar, not W...
  • 目录文章总览微服务架构单体应用架构什么是单体应用架构微服务架构微服务什么是微服务架构使用微服务架构的优势和劣势优势劣势微服务架构的四个核心问题微服务的技术栈当前各大IT公司用的微服务架构有哪些?...
  • 实施微服务架构的关键技术

    千次阅读 2019-09-09 14:57:52
    大家都在提微服务架构微服务架构到底是什么?它有哪些特点和设计模式?我们在打造微服务架构过程中,这些设计模式在实战当中如何应用?数据的一致性应该如何保证?今天我将针对上述疑问分享一下我的思考。微服务...
  • 微服务架构详解

    2020-04-07 10:31:21
    本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节。 要理解微服务,首先要先理解不是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,684
精华内容 7,873
关键字:

linux微服务架构部署

linux 订阅