云原生应用管理:原理与实践
上QQ阅读APP看书,第一时间看更新

4.1.6 Helm Client install Function

下面再回到前面的install函数中,这个函数会直接将拼装好的信息调用grpc接口发送给Tiller,先看一下函数的实现。


func (h *Client) install(ctx context.Context, req *rls.InstallReleaseRequest) (*rls.InstallReleaseResponse, error) {
  c, err := h.connect(ctx)
  if err != nil {
    return nil, err
  }
  defer c.Close()

  rlc := rls.NewReleaseServiceClient(c)
  return rlc.InstallRelease(ctx, req)
}

install函数首先建立一个grpc连接,我们来看一下具体的实现。


func (h *Client) connect(ctx context.Context) (conn *grpc.ClientConn, err error) {
  opts := []grpc.DialOption{
    grpc.WithBlock(),
    grpc.WithKeepaliveParams(keepalive.ClientParameters{
      // 每30s发送一次心跳,以此来保证连接不中断
      Time: time.Duration(30) * time.Second,
    }),
    grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxMsgSize)),
  }
  switch {
  case h.opts.useTLS:
    opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(h.opts.tlsConfig)))
  default:
    opts = append(opts, grpc.WithInsecure())
  }
  ctx, cancel := context.WithTimeout(ctx, h.opts.connectTimeout)
  defer cancel()
  if conn, err = grpc.DialContext(ctx, h.opts.host, opts...); err != nil {
    return nil, err
  }
  return conn, nil
}

·设置grpc的参数,grpc.DialOption这里主要是默认30s超时时间。

·然后设置最大消息大小,默认20MB。

·根据是否启用tls选择对应的证书信息。

·grpc.DialContext(ctx,h.opts.host,opts...)非常重要,前面介绍了port-forward会建立一个本地和远程之间的连接,h.opts.host就是本地的连接端口,也就是说,建立与这个地址的连接,发送的数据就会直接送达远端的Tiller Pod。


func (c *releaseServiceClient) InstallRelease(ctx context.Context, in *InstallReleaseRequest, opts ...grpc.CallOption) (*InstallReleaseResponse, error) {
  out := new(InstallReleaseResponse)
  err := c.cc.Invoke(ctx, "/hapi.services.Tiller.ReleaseService/InstallRelease", in, out, opts...)
  if err != nil {
    return nil, err
  }
  return out, nil
}

最后将信息发送出去。这里调用的grpc接口名称为/hapi.services.Tiller.ReleaseService/InstallRelease,也就是远程的Tiller Server接口名称,后面我们会介绍服务端的实现。然后将拼装好的InstallReleaseRequest发送出去,这个对象里面含有Chart的全部信息,最后等待服务端的返回,这样就实现了安装命令的最终发送。