Well, you would be correct to say that Kube-DNS is a "cluster add-on." However, something being a cluster add-on doesn't make it not part of Kubernetes. It is no less a part of Kubernetes than kube-proxy. As far as I can tell, the difference is that cluster add-ons run _within_ the cluster, alongside other services. With no cherry picking, here is a quick excerpt from the Kubernetes README about cluster add-ons:
> Cluster add-ons are resources like Services and Deployments (with pods) that are shipped with the Kubernetes binaries and are considered an inherent part of the Kubernetes clusters.
I do not think there's a standard set of cluster add-ons that are guaranteed to be installed in any given setup, but thus far I've done a few Kubernetes deployments and it seems the following come by default anywhere:
- fluentd for logging (w/ StackDriver on GCE and ELK elsewhere) - kube-dns for dns - grafana + heapster for container metrics - dashboard (of course)
Re: load balancing. Calling Kubernetes Services poor man's load balancing seems rather disingenuous. Sure, it's layer 4 load balancing and it is round robin. However, being lower level does not make it useless. In fact, I have some production deployments that are not HTTP. Kubernetes does have a primitive for layer 7 load balancing and routing for HTTP, in the Ingress resource, which admittedly is not complete yet, but I'm grateful that they support layer 4 natively. It does just fine with our production deployments even though it's "purely round robin." Most of the time, pods under the same service will have roughly equal capacity containers, so round robin is usually fine. And as far as "poor man's load balancing" goes, it provides liveness and readiness checking, something that I'd consider to be useful alone, versus say DNS-based load balancing.
I think in some ways your line of thinking punishes Kubernetes for having a somewhat modular architecture and that sucks. If you have a setup that actually does lack ELK or Kube DNS by default with modern versions, then sorry for misjudging. However, I have not seen this yet and haven't seen anyone use Kubernetes without Kube DNS since I started.
Kubernetes doesn't have DNS built in, but it comes with an add-on you can install, KubeDNS, which allows internal DNS queries to resolve service names.
Kubernetes doesn't aggregate logs, either. Kubelet knows how to get at Docker logs, but they're still just sitting in /var/lib/containers somewhere. To aggregate them, you need to run Fluent or Logspout or similar. If you run Kubernetes via Google Container Engine, Fluent set up for you (though it will collect everything into StackDriver Logging, which is not great) through a daemonset, but it's not built in.
Kubernetes doesn't really have load balancing. You can have it allocate a cloud LB if you're on GCP or AWS, or you can set up your own Nginx ingress controller, or some other LB such as Traefik, which integrates nicely with K8s. For services you get a poor man's load balancing through iptables and kube-proxy, but it's purely round-robin.