kubernetes云原生应用 (kubernetes和springcloud区别)

一、概述

1、什么是 SkyWalking?

分布式系统的应用程序性能监视工具,专为基于容器(Docker、K8s、Mesos)架构而设计。方案。

官网地址:http://skywalking.apache.org/

2、SkyWalking特性

  • 各种监控手段,语言和服务网格
  • 多语言自动探针,Java,.NET Core和Node.JS
  • 轻量高效,无需大数据
  • ,当UI、存储、集群管理多种机制选择
  • 支持支持
  • 优秀的视野化方案

3、整体结构

kubernetesspring,kubernetes云计算自动化运维

整个框架,上、下、左、右四部分:

考虑到让描述更简单,我们舍弃掉指标相关指标,而在追踪相关功能。

SkyWalking追踪
空中漫步
空中漫步用户界面

简单的概况原理为下图:

kubernetesspring,kubernetes云计算自动化运维

二、搭建空中漫步

1、环境准备

  • Mkubernetes 版本:1.18.5
  • Nginx Ingress 版本:2.2.8
  • 头盔版本:3.2.4
  • 持久化存储驱动:NFS

2、使用图表部署

本文主要是讲述如何使用 Helm Charts 将 SkyWalk 部署到 Kubernetes 中,相关文档可以参考skywalking-kubernetes

目前推荐的四种方式:

  • 使用 helm 3 提供的 helm serve 启动本地 helm repo
  • 使用本地图表文件部署
  • 使用harbor提供的repo功能
  • 直接从官方 repo 进行部署(暂不满足)

注意:当前天行图还没有提交到官方仓库,请先参照前三种方式进行部署

2.1、*载下**图表文件

可以直接使用本地文件部署skywalking,按照上面的步骤将 skywalking chart *载下**完成之后,直接使用下面的命令进行部署:

混帐克隆的https://github.com/apache/skywalking-kubernetes
cd skywalking-kubernetes/图表
掌舵回购加弹性的https://helm.elastic.co
掌舵空中漫步
export  SKYWALKING_RELEASE_NAME =skywalking   #定义自己的
名字export  SKYWALKING_RELEASE_NAMESPACE = default   #定义自己的自定义空间

2.2、定义已存在的参数文件

修改 values-my-es.yaml

OAP:
  图片:
    标签: 8.1 0.0 -es7       #设置根据现有Elasticsearch版本的权利标签
  storageType: elasticsearch7

用户界面:
  图像:
    标签: 8.1 .0

elasticsearch: 
  enabled:  false 
  config:                # 对于现有elasticsearch集群的用户,当`elasticsearch.enabled`为false时生效
    host: elasticsearch-client
     port: 
      http:  9200 
    user:  "elastic"          # [optional] 
    password:  "admin@ 123"      # [可选]

2.3、舵机安装

helm install " ${SKYWALKING_RELEASE_NAME} " skywalking -n " ${SKYWALKING_RELEASE_NAMESPACE} " \
  -f ./skywalking/ values -我的-es.yaml

安装完成后,我们核实下安装情况:

$ kubectl get deployment -n skywalking
NAME READY UP- TO - DATE   可用AGE
my-skywalking-oap    2 / 2      2             2            9 m
我的天空行走-ui     1 / 1      1             1            9 m

三、使用天行代理

Java中使用代理,提供以下三种方式供你选择

  • 使用官方提供的基础镜像
  • 将代理包构建到已经存在的基础镜像中
  • 边车模式挂载代理(推荐)

1、使用官方提供的镜像

查看官方 docker hub 提供的镜像基础,只需要在你构建服务镜像是从这个镜像本质,直接集成到 Jenkins 中就更容易了

2、将代理构建到已经存在的基础镜像中

提供这种方式的原因是:官方的镜像属于自己的镜像,并且是openjdk,可能有很多命令没有,需要二次安装,这里略过。

3、边车模式挂载代理

因为服务是在 Kubernetes 中部署的,使用这种方式来使用 Skywalking Agent,这种方式的好处在不需要修改原来的基础镜像,更不用重新构建新的服务镜像,涡轮以边车模式,通过共享卷的方式将代理需要的相关文件挂载到已经存在的服务镜像中。

3.1、构建skywalking代理镜像

自己构建,参考:https://hub.docker.com/r/prophet/skywalking-agent

通过以下dockerfile进行构建:

来自高山:3.8

LABEL维护者 = "zuozewei@hotmail.com"

 ENV SKYWALKING_VERSION= 8.1。0

添加http://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/ ${SKYWALKING_VERSION} /apache-skywalking-apm- ${SKYWALKING_VERSION} .tar.gz /
 
RUN tar -zxvf /apache-skywalking-apm- ${SKYWALKING_VERSION} .tar.gz && \
    mv apache-skywalking-apm-bin skywalking && \
    mv /skywalking/agent/optional-plugins/apm-trace-ignore-plugin* /skywalking/agent/plugins/ && \
    echo  -e  "\n# 忽略路径" >> /skywalking/agent/config/agent.config && \
     echo  "# 见 https://github.com/apache/skywalking/blob/v8.1.0/docs/en/ setup/service-agent/java-agent/agent-optional-plugins/trace-ignore-plugin.md" >> /skywalking/agent/config/agent.config && \
     echo  'trace.ignore_path=${SW_IGNORE_PATH:/health }' >> /skywalking/agent/config/agent.config

搬运工构建-t 172.16.106.237 /监视器/天空漫步剂:8。1 . 0 .

待docker建造完毕后,推到消毒杀菌。

3.2、使用sidecar挂载

示例配置文件如下:

apiVersion:apps/v1
 kind:部署
元数据:
  名称:demo-skywalking
规范:
   replicas:1
  选择器:
     matchLabels:
       app:demo-skywalking
  策略:
     rollingUpdate:
       maxSurge:1 
      maxUnavailable:0
    类型:RollingUpdate
  模板:
    元数据:
      标签:
         app:演示天行
    规范:
      初始化容器:
        -名称:init-skywalking-agent
          图像:172.16。106.237 /monitor/天行代理:8.1。0
          命令:
            - 'sh' 
            - '-c' 
            - 'set -ex;mkdir -p /vmskywalking/agent;cp -r /skywalking/agent/* /vmskywalking/agent;' 
          卷挂载:
            - mountPath : /vmskywalking/agent
               name : skywalking-agent
      容器:
        -图像:nginx:1.7。9 
          imagePullPolicy:始终
          名称:nginx
          端口:
            - containerPort:80
              协议:TCP
           volumeMounts:
            - mountPath : /opt/skywalking/agent
               name : skywalking-agent
      卷:
        -名称:skywalking-agent
           emptyDir:{}

以上是挂载 sidecar 的 deployment.yaml 文件,主要以 nginx 作为服务为例,是通过共享卷的方式挂载 agent,首先 initContainers 通过 skywalking-agent 卷挂载了 sw-agent-sidecar 中的 /vmskywalking/agent ,并且将构建好的镜像中的agent目录cp到了 /vmskywalking/agent 目录,完成之后nginx启动时也挂载了 skywalking-agent 卷,将其挂载到了容器的 /opt/skywalking/agent 目录,这样就完成了共享过程。

四、改造春云应用

1、docker打包并发送到仓库

修改下dockerfile配置,集成skywalking代理:

FROM insideo/centos7-java8-build
 VOLUME /tmp
 ADD mall-admin.jar app.jar
 RUN bash -c 'touch /app.jar'
 RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
 ENTRYPOINT [ "java" , "-Dapp.id=svc-mall-admin" , "-javaagent:/opt/skywalking/agent/skywalking-agent.jar" , "-Dskywalking. agent.service_name=svc-mall-admin" , "-Dskywalking.collector.backend_service=my-skywalking-oap.skywalking.svc.cluster.local:11800" , "-jar" , "-Dspring.profiles.active=prod" ,"-Djava.security.egd=file:/dev/./urandom" , "/app.jar" ]

maven package 结局了,直接运行将这个项目打包成镜像。

注意:

k8s创建服务时,它会创建相应的DNS入口。此入口的格式为 <service-name>.<namespace-name>.svc.cluster.local ,如果容器只使用文件 <service-name> ,这解析为本地服务到内部空间。如果要跨入口访问,则需要使用完全定义的域名。

2、写k8s的yaml版本的脚本脚本

这里我以其中某某服务为例:

--- 
apiVersion: apps/v1
 kind:部署
元数据:
  名称: svc-mall-admin
规范:
  replicas: 1
  选择器:
    matchLabels:
      app: svc-mall-admin
  策略:
    rollingUpdate:
      maxSurge: 1 
      maxUnavailable: 0
    类型: RollingUpdate
  模板:
    元数据:
      标签:
        应用程序: svc-mall-admin
    规范:
 initContainers       :
        -名称: init-skywalking-agent
          图像: 172.16 .106.237 /monitor/skywalking-agent: 8.1 .0
          命令:
            -  'sh' 
            -  '-c' 
            -  'set -ex;mkdir -p /vmskywalking/agent;cp -r /skywalking/agent/* /vmskywalking/agent ;' 
          volumeMounts: 
            - mountPath: /vmskywalking/agent
               name: skywalking-agent
      容器: 
        - image:  172.16 .106 .237 /mall_repo/mall-admin: 1.0 
          imagePullPolicy: Always
           name: mall-admin
           ports: 
            - containerPort: 8180
              协议: TCP
           volumeMounts: 
            - mountPath: /opt/skywalking/agent
               name: skywalking-agent
       volumes: 
        - name: skywalking-agent
           emptyDir: {}
 --- 
apiVersion: v1
 kind: Service
 metadata: 
  name: svc-mall-admin
规格:
  端口:
    -名称: http
      端口: 8180
      协议: TCP
      目标 端口:8180
  选择器:
    应用程序: svc-mall-admin

然后就可以直接运行了,它就可以将的项目全部跑起来了。

五、测试验证

事毕,可以去SkyWalking UI 查看是否恢复成功。

1、测试应用API

首先,请求下 Spring Cloud 应用程序提供的 API。因为,我们要追踪下该请求。

kubernetesspring,kubernetes云计算自动化运维

2、查看SkyWalking UI界面

kubernetesspring,kubernetes云计算自动化运维

插入图片描述

这里,我们会看到 SkyWalking 中非常重要的三个概念:

  • 服务(Service):表示对请求提供相同行为的单一或一组工作负载。在使用代理或 SDK 的时候,你可以服务的名字。如果没有定义的话,SkyWalking 将使用你在平台(例如说) Istio)上定义的名字。在这里,我们可以看到 Spring Cloud 应用的服务为 svc-mall-admin ,就是我们在 agent 环境变量 service_name 中定义的。
  • 服务实例(服务实例):上述的一组工作负载中的每一个工作负载但一个实例。就像 Kubernetes 中的 pod 一样,服务实例真实就是程序上的进程。当你在使用代理的时候那时,一个服务实例实际就是操作系统上的一个真实的过程。这里,我们可以看到云应用的服务为 UUID@hostname ,由Agent自动生成。
  • 填充(Endpoint):对于特定的服务所接收的请求路径,如HTTP的URI路径和gRPC服务的类名+方法签名。

,我们可以看到Spring Cloud应用的一个入口,这里为API接口 /mall-admin/admin/login

更多代理参数介绍参考:https://github.com/apache/skywalking/blob/v8.1.0/docs/en/setup/service-agent/java-agent/README.md

点击「拓扑图」菜单,进入拓扑图的界面:

kubernetesspring,kubernetes云计算自动化运维

点击「追踪」菜单,进入查看数据的界面:

kubernetesspring,kubernetes云计算自动化运维

六、小结

本文介绍了如何使用 Kubernetes + Spring Cloud 集成 SkyWalking,云说下调用链监控在现有的微服务系统里面是有源的组件,真实的追踪、服务有线遥测分析、天气和可视化或者生产用的,这里我们选择了Skywalking,具体原因和细节的玩法在此详述了。