ruk·si

Kubernetes
Multi-container Example

Updated at 2016-02-26 01:25

Google Container Registry (GCR) is a great service to host your private Docker images when hosting your Kubernetes cluster in Google Cloud Platform. Container engine seems to create a Docker registry automatically when you push images in.

1. Choose region: us.gcr.io / eu.gcr.io / asia.gcr.io
2. Decide image and tag: us.gcr.io/your-project-id/image-name:tag

gcloud docker push us.gcr.io/your-project-id/example-image:your-tag
gcloud docker pull us.gcr.io/your-project-id/example-image:your-tag

# You can find container clusters and registry at:
# https://console.cloud.google.com/kubernetes/list?project=your-project-id
# Define files below this section...

cd greetings
CGO_ENABLED=0 GOOS=linux go build -o greetings -a -tags netgo -ldflags '-w' .
docker build -t us.gcr.io/gobernetes/greetings:v1 .
docker run --rm -p 4000:4000 us.gcr.io/gobernetes/greetings:v1
# http://dockerhost:4000/
gcloud docker push us.gcr.io/gobernetes/greetings:v1

cd ../hello
CGO_ENABLED=0 GOOS=linux go build -o hello -a -tags netgo -ldflags '-w' .
docker build -t us.gcr.io/gobernetes/hello:v1 .
docker run --rm -p 3000:3000 us.gcr.io/gobernetes/hello:v1
# http://dockerhost:3000/
gcloud docker push us.gcr.io/gobernetes/hello:v1

cd ..
gcloud container clusters create production
kubectl create -f rc.yaml
kubectl get rc
kubectl get pods

kubectl create -f greetings-lb.yaml
kubectl create -f hello-lb.yaml
kubectl get service
kubectl describe services greetings-lb
kubectl describe services hello-lb
# Get "LoadBalancer Ingress" IP from both and you can access the containers.

# Releases are done by pushing new images, editing rc.yaml and submitting it.
kubectl rolling-update gobernetes-rc-v1 -f rc.yaml
kubectl rolling-update gobernetes-rc-v2 -f rc.yaml
kubectl rolling-update gobernetes-rc-v3 -f rc.yaml

# To tear down everything:
gcloud container clusters delete production

rc.yaml:

apiVersion: "v1"
kind: "ReplicationController"
metadata:
  name: "gobernetes-rc-v1"
  labels:
    name: "gobernetes-rc-v1"
spec:
  replicas: 3
  selector:
    name: "gobernetes"
    version: "v1"
  template:
    metadata:
      labels:
        name: "gobernetes"
        version: "v1"
    spec:
      containers:
        - name: "greetings"
          image: "us.gcr.io/gobernetes/greetings:v1"
          ports:
            - name: "http"
              containerPort: 4000
              protocol: "TCP"
        - name: "hello"
          image: "us.gcr.io/gobernetes/hello:v1"
          ports:
            - name: "http"
              containerPort: 3000
              protocol: "TCP"

greetings-lb.yaml:

apiVersion: "v1"
kind: "Service"
metadata:
  name: "greetings-lb"
  labels:
    name: "greetings-lb"
spec:
  type: "LoadBalancer"
  ports:
    - name: "http"
      port: 80
      targetPort: 4000
  selector:
    name: "gobernetes"

hello-lb.yaml:

apiVersion: "v1"
kind: "Service"
metadata:
  name: "hello-lb"
  labels:
    name: "hello-lb"
spec:
  type: "LoadBalancer"
  ports:
    - name: "http"
      port: 80
      targetPort: 3000
  selector:
    name: "gobernetes"

greetings/greetings.go:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":4000", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Greetings from Go!")
}

hello/hello.go:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":3000", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello from Go!")
}

greetings/Dockerfile:

FROM scratch
ADD greetings /
CMD ["/greetings"]

hello/Dockerfile:

FROM scratch
ADD hello /
CMD ["/hello"]

Source