850 karma · joined November 13, 2009
I previously worked for Google in Seattle. I started Google Compute Engine and helped start Kubernetes/Google Container Engine. At Google I've worked on Google Talk, VoIP, and ad suggestion systems. Before that I worked at Microsoft on IE and WPF/Avalon.
I'm a dad of two and my wife is a doc.
Blog: https://www.eightypercent.net
[ my public key: https://keybase.io/jbeda; my proof: https://keybase.io/jbeda/sigs/kYkVr97UkWrL9KyWVJPi74ElW-neJn5vPgm8YW0qeGY ]
This is just untrue. I haven't looked closely at Facebook recently (beyond watching the [office in Seattle](http://www.geekwire.com/2015/sneak-peek-facebook-plans-epic-...) grow quickly) but traditionally Google has had ~50% eng in MTV and the rest spread out. NY is the second largest office but Seattle and Bangalore are pretty big. Seattle (and Kirkland) are now at ~2000 people (https://twitter.com/juberti/status/675022362438316032).
It recently hit GA and is super fast. You can use it from anywhere -- not just GCE.
(Disclaimer: I used to work at Google on GCE/GKE/Kubernetes).
This is all rare, but it does happen. This is why the GCS team wants to know if you are seeing corruption on file upload as it might be some bad hardware failing in a non-obvious way.
But there is no call for a cryptographic hash here. This isn't being used as any sort of ID or to verify integrity outside of corruption.
It is surprising that they didn't make it compatible with the S3 API -- at least for common object/bucket create/delete. This will require more code to be written and it will be harder to adapt client libraries.
The API documentation is here: https://www.backblaze.com/b2/docs/
Other notes:
* The lack of scalable front-end load balancing is shown by the fact that they require users to first make an API call to get an upload URL followed by doing the actual upload.
* They require a SHA1 hash when uploading objects. This is probably overkill over a cheaper CRC. In addition, it means that users have to make 2 passes to upload -- first to compute the hash and then another to upload. This can slow uploads of large objects dramatically. A better method is to allow users to omit the hash and return it in the upload response. Then compare that response with a hash computed while uploading. In the rare case that the object was corrupted in transit, delete/retry. GCS docs here: https://cloud.google.com/storage/docs/gsutil/commands/cp#che...
This was as also part of the strategy when we decided to open source kubernetes. Having an open alternative made the commercial offering (Google Container Engine -- GKE) much stronger because of the reduced dev lock-in.
I'd love to see a decentralized image naming and distribution system. I'm pushing hard for this to happen as part of the OCI. See https://groups.google.com/a/opencontainers.org/forum/#!topic....
Lots of comments on the term "modern" and the fact that this is container based.
While there are obviously other ways to skin this cat, for me, I want the following out of my production stack:
* Self healing and self managing. If a machine fails, I don't want to have to think about it. The system should just work.
* Supports microservices. The idea of breaking your app into smaller components (regardless of the name) can help you to scale your engineering organization by keeping the dev team for each µs small enough that a 2 pizza team can own it.
* Efficient. I want a stack that doesn't require a lot of hand holding to make sure I'm not wasting a ton of resources.
* Debuggable. Complex applications can be hard to debug. Having good strategies for application specific monitoring and log collection/aggregation can really help to provide insights into the stack.
Also, up until now most PaaSes were vertically integrated and opaque. I imagine that the PaaS of the future will look more like OpenShift where it is a curated set of components in this stack instead of an opaque stack.
A lot of the extra components allow for dynamic placement and management of workloads. This allows for the system to be self healing and self managed in the face of hardware failure.
In addition, much of this automatic management (once set up) can allow for you to run more different things. It can reduce the operations cost of microservices and let you factor your app in a way where you can scale the development team.
Hopefully, over time, this stack will come pre-tested and pre-packaged. Things look super complex now because of the abundance of options. As things settle, it'll get easier to reap the benefits without taking on the cognitive burden.
I was also considering using the term "cloud native" over "modern" but didn't want to bring definition of that term into the discussion.
My bar for modern is that it should be self healing -- hardware/VMs should fail and the system should be able to recover without missing a beat. That requires a level of management and dynamism that is hard to get without containers. (Burning AMIs w/ autoscaling groups is a good alternative).
My guess is that the MSR set up is a pretty large array of kinect like cameras. Pretty cool how they clean things up and connect through time to drive compression. Also think it is cool that they detect where hands and faces are and make the mesh more dense there.
But, the 8i folks have a demo on the web and MSR has a pre-canned video.
But, since it is still using an OS based package manager (Ubuntu, for example) it doesn't address all of the issues that I outlined. Specifically packages can't be cached across different images by the host. It also isn't obvious which packages are included in which image without cracking the image open.
Thanks for the pointer!
In addition -- I'd consider the "rerun the config tool on a pre-existing container" to be an anti-pattern. This creates more and more layers to the Docker file that have to be downloaded every time that container is run. I'd much rather build each container from a bedrock up with well versioned dependencies (not as easy as it should be with many package managers).
Quick -- what version of OpenSSL is in the golang Docker images? (https://registry.hub.docker.com/_/golang/). Short of downloading them and poking around the file system, I can't tell.
There is still a need for an improved tool set to build the containers and use this package manager. Perhaps these tools could expand into that area.
As for long-running processes -- I'd consider that an anti-pattern. If there is a critical bug, the correct thing to do would be to build a new (versioned) image and restart (either blue/green or a rolling update) to that new image. This also enables rollback if your fix breaks things further.
Also agree that config-as-package is part of this too.
As for statically linked binaries -- this solves some of it but not all. Still hard to figure out which version of openssl is actually running in production. Also falls down in the world of dynamic languages where you app is a bunch of rb/php/py files.
Any sort of orchestration system will help to run containers and will know what images you are running but not which packages you are running inside those images.
With something like this a cluster admin could find all the containers across a 10k node cluster are running an unpatched version of openssl. Or could block running containers that are using unapproved packages.
"Order dependence" is the fact that Dockerfile is stictly linnear -- even when 2 steps won't interact in any way. It makes caching and reuse more difficult.
Example: http://sandervanderburg.blogspot.com/2014/07/managing-privat...
A lesson from Docker is that we have to make this dead simple. It has to be something you can grok in 15-60m.
Also, you can get equivalent "IP per container" using advanced routing with GCE. Flannel has a GCE specific back end where it inserts routes for each subnet assigned to each range. That will eliminate the extra level of encap.
(Disclaimer: I started GCE but am no longer at Google.)
You may run O(10) containers on a single machine. When you run O(10k)+ containers in a cluster you need new tools to manage things.
Long time ago...
I've recently been through this for my own personal email. I have a domain with some interesting rewrites to the address that I forward to GMail. I put together my set up into a Docker container:
https://github.com/jbeda/docker-postfix-forwarder
It is worth breaking this down into each direction -- sending and receiving.
Sending
This is the easy side. You simply run an SMTP server and have GMail use this to send. If you want others to not mark you as spam you'll want to look at setting up SPF (publishing which IPs are allowed to send from your domain) and perhaps DKIM (digitally sign your email).
GMail used to allow sending from aliases directly without an external SMTP server but that is disabled. Old accounts are grandfathered in.
Receiving
This is where things get complicated. Essentially, you are having folks send mail to your server and you are turning around and relaying that email to GMail. GMail has a hard job here. It doesn't know if it should trust you and that you are acting on behalf of the user or if you are an open relay sending spam. I've found after I change my forwarding set up I have to police my spam folder for a couple of days to retrain GMail.
The real complication here is SPF. Sending domains will publish their own SPF records. When doing this they can either specify a soft or hard fail. If they specify a soft fail (`~all`) then there is a chance that GMail won't mark it as spam. But if they use soft fail (`-all`) then it will go to spam all the time. The problem is that the sending domain (say evite.com) doesn't list your relay IP as having permission to send that mail and so GMail respects that.
Having GMail pull the mail via POP is one solution here but that introduces latency.
Or you can rewrite the "envelope sender" so that you are honest about the mail coming through your server. The accepted scheme to do this is SRS. This is not a silver bullet though. If you are forwarding a lot of spam, GMail may decide that your SRS domain is spammy and penalize all incoming mail.
Also, if you are forwarding a lot of spam, GMail will throttle you. It'll have you back off and wait to forward more mail. Your best bet is to find ways to eliminate obvious spam before you forward to GMail.
My solution seems to be working okay for now, but it is a pain the ass and I'm honestly not sure it is worth it.
EDIT: Here is a tutorial that I used to inform my approach. It is worth digging in to. http://seasonofcode.com/posts/setting-up-dkim-and-srs-in-pos...
(I'm the original TL for GCE)
I'm glad to see the new projects (swarm, at least) layered on top of Docker. It is good to see those sink/swim on their own. I was uncomfortable when Docker was (last week) going down the path of building everything into their existing binary.
It is worth reading through the notes from the last/only meeting: https://docs.google.com/document/d/1JfWNzfwptsMgSx82QyWH_Aj0...
Examples:
* The docker hub gets special privileges in the image namespace. It isn't built on DNS but instead rooted in a namespace owned by Docker, Inc.
* The newly announced swarm depends on a discovery endpoint that (as far as I've seen) is closed source and undocumented.
I'd love to see the online parts of the OSS docker project have the same "firewall" as Solomon believe he holds for the OSS components.