教程|构建生产就绪的Istio Adapter

栏目: 编程工具 · 发布时间: 7年前

内容简介:你已经浏览了Istio Mixer Adapter的根据你对

构建生产就绪的Istio Adapter

你已经浏览了Istio Mixer Adapter的 指南 ,现在想要发布自己的Adapter?这篇文章将教你创建自己的Adapter,在生产环境的海洋中扬帆起航。

教程|构建生产就绪的Istio Adapter

介绍

根据你对 GoProtobufsgRPCIstioDockerKubernetes 知识有所了解,你可能会发现发布Istio Mixer Adapter的过程很容易。本文假设你对这些技术有一些经验,并且根据Istio的Wiki已经能够完成至少一个演练。

就本文的目的而言,我将讨论如何构建一个消费 Metrics 的Istio Mixer Adapter。下面是简要步骤:

  1. Istio Mixer - Adapter接口架构
  2. 创建一个简单的Mixer Adapter
  3. 将Adapter发布到Docker Hub
  4. 为Adapter编写Kubernetes Config
  5. 在Istio上部署和测试Adapter

再次强调,我将尽最大努力在这篇文章里呈现所有重要的细节,让你的Adapter运行起来。

Istio Mixer - Adapter接口架构

让我们首先看看Adapter如何与Istio Mixer结合。Kubernetes在一定程度上抽象了接口;了解这一点对我们来说很重要。

教程|构建生产就绪的Istio Adapter

下面是对上述架构中的每个元素的简要描述。

  • Microservice 是在Istio上部署的用户应用程序
  • Proxy 是Istio组件,例如 Envoy Proxy ,控制 Service Mesh 中的网络通信
  • Mixer 是Istio组件,它从Proxy接收指标(和其他)数据,并转发给其他组件(在本例中是Adapter)
  • Adapter 是我们正在构建的应用程序,通过gRPC消费来自Mixer的Metrics
  • Operator 扮演负责配置和部署的角色,在本例中是Istio和Adapter

需要注意的一点,每个组件都作为独立的进程运行,并且可能分布在网络上。此外,Mixer还与Adapter建立了一个gRPC通道,以便为其提供用户的配置和Metrics。

创建一个简单的Mixer Adapter

简单起见,我将按照 Mixer Out of Tree Adapter Walkthrough 这篇文章建立一个简单的Mixer Adapter。下面是概要,列出了创建消费Metrics的Istio Mixer Adapter的步骤:

  1. 创建Adapter的配置文件 config.proto
  2. 创建 mygrpcadapter.go 文件,实现 HandleMetric(context.Context, *metric.HandleMetricRequest) (*v1beta11.ReportResult, error) 这个gRPC API的调用
  3. 通过 go generate ./... 生成配置文件
  4. 创建 main.go 文件作为gRPC的服务端,并监听API调用
  5. 为Adapter编写配置文件 sample_operator_config.yaml
  6. 启动本地Mixer进程来测试和验证Adapter
  7. 配置项目
  8. 添加必要的依赖包(使用 Go ModulesGlideDep 等)
  9. 通过启动本地Mixer进程来构建和测试Adapter

发布Adapter到Docker Hub

在本地安装和测试了 myootadapter 项目后,就可以构建并发布Adapter到 Docker Hub 库了。在继续前请执行以下步骤:

  1. 移动 mygrpcadapter/testdata/ 目录下的内容到 operatorconfig
  2. 创建 Dockerfile 文件来保存创建 Docker 镜像的步骤
  3. 最后,在 operatorconfig/ 目录下创建一个名为 mygrpcadapter-k8s 的文件,稍后将使用它部署到Kubernetes

完成了这些步骤后,你的项目结构会如下所示。

── myootadapter
   ├── Dockerfile
   ├── glide.lock # 是否出现此类文件取决于你使用的依赖包管理工具
   ├── glide.yaml
   ├── mygrpcadapter
   │   ├── cmd
   │   │   └── main.go
   │   ├── config
   │   │   ├── config.pb.go
   │   │   ├── config.proto
   │   │   ├── config.proto_descriptor
   │   │   ├── mygrpcadapter.config.pb.html
   │   │   └── mygrpcadapter.yaml
   │   └── mygrpcadapter.go
   └── operatorconfig
       ├── attributes.yaml
       ├── metrictemplate.yaml
       ├── sample_operator_config.yaml
       ├── mygrpcadapter-k8s.yaml
       └── mygrpcadapter.yaml

现在来构建Docker镜像并发布到Docker Hub。

构建Docker镜像

多阶段构建(multi-stage builds) 模式可以被用来构建Docker镜像。将以下内容复制到 Dockerfile 中:

FROM golang:1.11 as builder
WORKDIR /go/src/github.com/username/myootadapter/
COPY ./ .
RUN CGO_ENABLED=0 GOOS=linux \
    go build -a -installsuffix cgo -v -o bin/mygrpcadapter ./mygrpcadapter/cmd/

FROM alpine:3.8
RUN apk --no-cache add ca-certificates
WORKDIR /bin/
COPY --from=builder /go/src/github.com/username/myootadapter/bin/mygrpcadapter .
ENTRYPOINT [ "/bin/mygrpcadapter" ]
CMD [ "8000" ]
EXPOSE 8000

CMD [ "8000" ] 告诉Docker,将 8000 作为参数,传递给定义在行 ENTRYPOINT [ "/bin/mygrpcadapter" ] 的入口。 因为我们在这里把gRPC的监听端口改为了 8000 ,所以必须更新文件 sample_operator_config.yaml 使其一致。把原来的配置 address: "{ADDRESS}"address: mygrpcadapter:8000 替换。

还需要更新 file_path ,在稍后创建的Volume中去存储输出数据。更新 file_path: "out.txt"file_path: "/volume/out.txt" 。然后将得到如下所示的配置:

apiVersion: "config.istio.io/v1alpha2"
kind: handler
metadata:
 name: h1
 namespace: istio-system
spec:
 adapter: mygrpcadapter
 connection:
   address: "mygrpcadapter:8000"
 params:
   file_path: "/volume/out.txt"

现在,在 myootadapter 目录下运行命令来构建和标记Docker镜像:

docker build -t dockerhub-username/mygrpcadapter:latest .

发布镜像到Docker Hub

首先,通过终端登录到Docker Hub:

docker login

接下来,使用下面的命令发布镜像:

docker push dockerhub-username/mygrpcadapter:latest

为Adapter编写Kubernetes配置

现在让我们填写部署到Kubernetes的Adapter配置。将以下配置复制到我们之前创建的yaml文件 mygrpcadapter-k8s 中:

apiVersion: v1
kind: Service
metadata:
  name: mygrpcadapter
  namespace: istio-system
  labels:
    app: mygrpcadapter
spec:
  type: ClusterIP
  ports:
  - name: grpc
    protocol: TCP
    port: 8000
    targetPort: 8000
  selector:
    app: mygrpcadapter
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mygrpcadapter
  namespace: istio-system
  labels:
    app: mygrpcadapter
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mygrpcadapter
      annotations:
        sidecar.istio.io/inject: "false"
        scheduler.alpha.kubernetes.io/critical-pod: ""
    spec:
      containers:
      - name: mygrpcadapter
        image: dockerhub-username/mygrpcadapter:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8000
        volumeMounts:
        - name: transient-storage
          mountPath: /volume
      volumes:
      - name: transient-storage
        emptyDir: {}

上面的配置定义了一个简单的服务,只有一个从 dockerhub-username/mygrpcadapter:latest 的镜像创建的副本。该服务可以被命名为 mygrpcadapter ,并通过端口 8000 访问。这就是如何让配置在 sample_operator_config.yaml 文件的 address: "mygrpcadapter:8000" 指向这个特殊的deployment的方法。

同时,注意这些特殊的标记:

annotations:
  sidecar.istio.io/inject: "false"
  scheduler.alpha.kubernetes.io/critical-pod: ""

它告诉Kubernetes调度器,不要自动注入Istio的sidecar。这是因为我们并不需要在Adapter前面挂一个Proxy。另外,第二个标注将这个pod标记为系统critical级别。

我们还创建了一个名为 transient-storage 的临时volume,用于存储Adapter的输出,例如 out.txt 文件。配置如下所示:

volumeMounts:
    - name: transient-storage
      mountPath: /volume
  volumes:
  - name: transient-storage
    emptyDir: {}

通过Istio部署和测试Adapter

为了简洁起见,我将依赖于项目文档 部署 IstioBookinfo 应用确定 ingress IP 和端口 进行演示。

部署Adapter

现在可以通过Kubernetes部署Adapter:

kubectl apply -f operatorconfig/

mygrpcadapter 服务会部署在 istio-system 的命名空间下。你可以执行下面的命令验证:

kubectl get pods -n istio-system

打印的日志如下:

NAME                                       READY     STATUS        RESTARTS   AGE
istio-citadel-75c88f897f-zfw8b             1/1       Running       0          1m
istio-egressgateway-7d8479c7-khjvk         1/1       Running       0          1m
.
.
mygrpcadapter-86cb6dd77c-hwvqd             1/1       Running       0          1m

也可以执行下面的命令查看Adapter的日志:

kubectl logs mygrpcadapter-86cb6dd77c-hwvqd -n istio-system

它应该打印下面的日志:

listening on "[::]:8000"

测试Adapter

在终端执行下面的命令,或者在浏览器输入URL http://${GATEWAY_URL}/productpage 发送请求到部署的Bookinfo应用:

curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage

通过访问Adapter容器验证在 /volume/out.txt 文件中的输出:

kubectl exec mygrpcadapter-86cb6dd77c-hwvqd cat /volume/out.txt

你会看到如下的输出:

HandleMetric invoked with:
  Adapter config: &Params{FilePath:/volume/out.txt,}
  Instances: 'i1metric.instance.istio-system':
  {
		Value = 1235
		Dimensions = map[response_code:200]
  }

结论

Istio提供了一种标准机制来管理和观测云环境下的微服务。Mixer让开发人员能够轻松地将Istio扩展到自定义平台。我希望这篇指南让你对Istio Mixer - Adapter结合有一个初步了解,以及如何自己构建一个生产就绪的Adapter!

去发布你自己的Istio Mixer Adapter! 可以用 Wavefront by VMware Adapter for Istio 这篇文章做参考。

如果你希望在 Istio 适配器 页面上发布你的Adapter,请参考这个 Wiki

免责声明:本文仅属于作者本人,并不代表VMware的立场、策略或观点。

Venil Noronha开源软件爱好者


以上所述就是小编给大家介绍的《教程|构建生产就绪的Istio Adapter》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Rework

Rework

Jason Fried、David Heinemeier Hansson / Crown Business / 2010-3-9 / USD 22.00

"Jason Fried and David Hansson follow their own advice in REWORK, laying bare the surprising philosophies at the core of 37signals' success and inspiring us to put them into practice. There's no jarg......一起来看看 《Rework》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器