KBNodes, KBObjects ( The use of the name KBObject is rather unfortunate, but its much too late to do anything about it. ) and KBItem never exist in their own right, rather they only exist as part of some other real object such as a KBButton. However, they contain information which is mostly common to the real objects.
KBNodeA KBNode is at the bottom of the hierarchy of classes. Nothing of it is visible to the outside world except for the Notes property (which can be used to annotate a node, for instance for documentation, but is otherwise ignored by Rekall).
KBObjectA KBObject occupies some area of the display, and hence has properties like position and size. It can also have a name which can be used in scripts to identify and manipulate a particular object. In practice, names should be unique amongst objects at a given level in the form or report hierarchy (for instance, amongst all the objects which are children of a particular block), although Rekall makes no attempt to enforce this.
KBItemA KBItem (think data item) is an object that occupies display area, and contains data which generally (though not neccessarily) comes from the server database. As such it has properties like an expression which is used to specify the required data; it also has event properties which are trigged when, for example, a data value is set.
Note that a KBItem may actually hold several data values. This occurs when the KBItem is embedded in a block which is displaying more than one row from the server database (so an item may be instantiated as one or more data controls).