Lee Calcote
March 16th, 2017
clouds, containers, infrastructure, applications and their management
have evolved.
EventBus Handler
Persistence Verticle
Vert.x
SockJS
Analytics
Analytics UI
Hazelcast
GridConnection
Telemetry
Telemetry Analysis
Projects, Streams,
Users, Sessions, Tenants
Kafka Producer
Platform Client Producer
Spark, R
GCE Network
Load Balancer
Kafka
Rendering Engines
Platform Publishing Tool
Game Analysis
Single instance
beloved
Faster delivery, rolling updates
Horizontal scale out on-demand;
on an individual service basis
Modular architecture
Easy integration and deployments
Service isolation, resilience and fail-safe recovery
Democratization of language and technology choice
a quick review
it's an excellent time to be a developer
The promise of...
how small is small?
Who has a system that is too big and that you’d like to break down?
Can a small team manage it?
More moving parts increases complexity.
Can you make a change to a service and deploy it by itself without changing anything else?
small, autonomous services that work together.
self-contained functional unit
App is Reactive
Leverages sockets
Limited resources
Culture (DevOps / Cloud maturity)
Support containers AND VMs
Propagation of huge data sets
On-the-fly intelligent rendering
Distribution of content
Extremely low latency for Reactive services
Blocking vs non-blocking
On-premises telemetry collection and analytics
Analytics UI
Authentication
Telemetry
Telemetry Analysis
Spark, R
Kafka
Rendering Engines
Platform Publishing Tool
Game Analysis
Master
etcd
Locking
Projects
Authorization
kube-proxy
kube-proxy
SockJS
Authorization
kube-proxy
DaemonSet
Node
Node
kube-api, etc.
Node
Pod
Pod
Deployment
Authorization
DaemonSet
Service
Kubernetes 1.5 | No |
---|---|
Swarm 1.13 | No |
Mesos+Marathon | Yes |
ELB Classic |
Yes |
---|---|
ELB L7 |
Yes |
Beanstalk |
Yes (EC2) |
IOT |
Yes |
ECS | Yes (EC2) |
Load-Balancer | No |
App Gateway | Yes |
Container Service | ? |
Cloud LB (HTTP) | Yes |
Cloud LB (Network) | Yes |
GKE | No |
AWS
Azure
GCP
SSL Proxy
SSL Proxy
Kubernetes 1.5 |
No |
---|---|
Swarm 1.13 |
No |
Mesos+Marathon | Yes |
AWS
Azure
GCP
ELB Classic |
Yes |
---|---|
ELB L7 |
Yes |
Beanstalk | Yes |
IOT | Yes |
ECS | Yes |
|
|
Load-Balancer | No |
App Gateway | Yes |
Container Service | ? |
Cloud LB (HTTP) | No |
Cloud LB (Network) | Yes |
GKE | No |
There are soooo many ways to skin this cat.
Going deeper with Nginx & Kubernetes
As an ingress controller in Kubernetes
SSL termination
Path-based rules
Web socket support
Service Discovery with Nginx Plus
Need for locating service instances instantly without reconfiguring
On-the-fly Reconfiguration API
Work with etcd
a brief Kubernetes construct review
ClusterIP -
service to be reachable only from inside of the cluster.
ExternalName -
It serves as a way to return an alias to an external service residing outside the cluster.
NodePort -
exposes service on a port on each node of the cluster.
LoadBalancer - cluster-internal IP and exposing service on a NodePort, also ask the cloud provider for a load balancer which forwards requests to the Service exposed as a <NodeIP>:NodePort for each Node.
no·men·cla·ture
kube-proxy
iptables
Container AA
Container A
kube-proxy
kube-proxy
Node A
Node B
Client
Pod A
Service A
iptables
Inbound
Outbound
NodePort
Container BB
Container B
Pod B
Service B
no·men·cla·ture
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: projects
spec:
tls:
- hosts:
- api.maxplay.io
secretName: api-secret
rules:
- host: api.maxplay.io
http:
paths:
- path: /projects
backend:
serviceName: tenant-svc
servicePort: 80
- path: /tenants
backend:
serviceName: user-svc
servicePort: 80
- path: /users
backend:
serviceName: user-svc
servicePort: 80
$ kubectl create secret generic api-secret --from-file nginx.conf
An Ingress Controller is a control loop that manages rules enabling inbound traffic to applications.
specification
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-dp
labels:
app: nginx-ingress
spec:
replicas: 1
selector:
app: nginx-ingress
template:
metadata:
labels:
app: nginx-ingress
spec:
containers:
- image: maxplay/nginx-ingress:latest
imagePullPolicy: Always
name: nginx-ingress
ports:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
args:
- /nginx-ingress-controller
- --default-backend-service= \
$(POD_NAMESPACE)/nginx-default-backend
Make sure you review controller specific docs so you understand the caveats of each one.
iptables
Container AA
Container A
Ingress
Controller
kube-proxy
kube-proxy
Node A
Node B
Client
Pod A
Ingress B
Service A
iptables
Inbound
Outbound
Annotation in the Ingress resource definition specifies which services are web socket services -
"socks-svc"
Ingress Resource Annotation
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: api-ingress
annotations:
nginx.org/websocket-services: "sockjs-svc"
spec:
tls:
- hosts:
- api.maxplay.io
secretName: api-secret
rules:
- host: api.maxplay.io
http:
paths:
- path: /sockjs
backend:
serviceName: sockjs-svc
servicePort: 8181
Hybrid needs
On-premises and Google Cloud Platform
Consistent administration and capabilities
central load balancing and proxy platform
Support for VM and container-based technologies
with minimal configuration change
Deeper feature set available as services/team matures
use as an Application Delivery Controller
Platform independence
App
App
App
Ingress Controller and Deployments
Requests
App v0.1
App v0.2
90% of requests go to v0.1
10% of requests go to v0.2
App
App
App
GeoDNS
US Regions
Session Persistence and Sticky Routing help in performance of request routing and localized content
Content Caching provides faster retrieval of data
Performance, reliability and availability
Global Regions
clouds, containers, infrastructure,
applications and their management