Caching in Drupal 8 has had a radical overhaul. To the point that every developer now needs to have some understanding of how caching works. This adds some complexity when writing code for Drupal 8, but gives much more flexibility when caching objects and invalidating caches. These extra features can be used to selectively clear Varnish caches without the ofthen complex rules required in Drupal 7.
It has been said there are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors [1]. When a node is updated it is necessary to invalidate the cache for that node's page, but it is also necessary to invalidate the cache for any pages that depend on it. If the node is used in a view then the view's listing page must also be invalidated. This was hard in Drupal 7 because there was no simple way to know which pages depended on a particular node (or taxonomy or block or any other entity). The Drupal 7 Varnish module enabled the purging of individual pages when that pages it updated, but To invalidate URLs in a Varnish cache in Drupal 7 as it was necessary to provide rules using the Cache Expiration module to clear any dependant pages; these can be inprecise so that more ends up bing removed form the cache then necesary. The alternative is to wait for all dependant pages to expire from the cache, this means setting a suitably low cached page expiration time, which may or may not be suitable for the site and server setup.
Drupal 8 uses the concept of cache-tags and cache-contexts to help when invaildating the cache.
[Add details on cache tags an contexts]
Using the concept of cache-tags it is possible to have Drupal selectively clear Varnish's cache when something is updated. The Drupal 8 Purge module adds extra HTTP headers to each page listing the cache tags and cache context fo that page. Using these it is possible to use the Varnish BAN methodo to clear pages that match a particular regex.
This blog post was greatly helped by Jeff Geerling's post on using Drupal 8 Cache Tags with Purge and Varnish. Although his post was written 6 months ago and things have changes slightly; he talks about the Purge-Cache-Tags HTTP header, which has since been renamed to Cache-Tags.
[1] Originally attributed to Phil Hardman with some modification; https://twitter.com/timbray/status/506146595650699264