上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的全部信息,最后等待服务端的返回,这样就实现了安装命令的最终发送。