Upload
pehapkari
View
129
Download
1
Embed Size (px)
Citation preview
commit => #GitHub => #CircleCI => #Docker =>
#Kubernetes #AWS cluster6. sraz přátel Symfony v Praze
31.3.2016
continuous integration … deployment
… delivery
Kouzelná Almara
1 Java aplikace v Tomcatu (RESTful API + Wicket UI)
Tomcat…?
hot deploy 🤘 PermGen 💩
fuck it! 🐙
#BitBucket => #Bamboo => SSH upload WARka => jetty-runner.jar + automatický reload
po uploadu nového WARu (Node.JS skript)
Skrz
3 frontend PHP(-FPM) aplikace, 2 3 ReactPHP aplikace, ~30 RabbitMQ consumers,
1 Go aplikace
SVN 👹
fuck it! 🐙
#BitBucket => BB hook => checkout git do ~/commits/<commit> => hook.sh => (na stagingu automaticky) swap.sh
hitserver, adserver, ranking, RabbitMQ consumers
supervisord 🤘 porty 💩
hitserver, adserver, ranking, RabbitMQ consumers
supervisord 💩 porty 💩
Liftago
7 Java aplikací, 2 Node.JS aplikace, Python skripty v crontabu
💩 Jelastic 💩 💩 Dogado 💩
fuck! fuck fuck! 🐙
❓ Java/PHP/Go/Node/… ❓ Java 7 vs. 8, PHP 5.3 vs. 7.0, … ❓ supervisor/autorestart ❓ rolling deployment ❓ porty ❓ nezávislé na hostingu
❓ Java/PHP/Go/Node/… ✅ Docker ❓ Java 7 vs. 8, PHP 5.3 vs. 7.0, … ✅ Docker ❓ supervisor/autorestart ✅ Kubernetes ❓ rolling deployment ✅ Kubernetes ❓ porty ✅ Kubernetes ❓ nezávislé na providerovi ✅ Kubernetes
Kubernetes
Pods
Docker container
billing:2016-03-31.345
Label app=billing
Label env=prod
Docker container
logrotate:latest
Volume
/var/lib/invoices
Volume
/var/log
10.0.0.348080
Reconciliation loop
Observed state Desired state
Reconciliation loop
Observed state Desired statecreate
Reconciliation loop
Observed state Desired statescale
Reconciliation loop
Observed state Desired statehealth check
Replication controllerPod
billing 10.0.0.34Replication controller
billing-prod
app=billing env=prod replicas=3
app=billing
env=prod
Pod
billing 10.0.0.35
app=billing
env=prod
Pod
billing 10.0.0.36
app=billing
env=prod
Replication controllerPod
billing 10.0.0.34Replication controller
billing-prod
app=billing env=prod
replicas=1
app=billing
env=prod
Service
Pod
billing 10.0.0.34
Replication controller
billing-prod
app=billing
env=prodPod
billing 10.0.0.35
app=billing
env=prod
Pod
api 10.0.0.14
app=api
env=prod
??? ???
Service
Pod
billing 10.0.0.34
Replication controller
billing-prod
app=billing
env=prod
Pod
api 10.0.0.14
app=api
env=prod
??? !!!
Service
Pod
billing 10.0.0.34
Replication controller
billing-prod
app=billing
env=prodPod
billing 10.0.0.35
app=billing
env=prod
Pod
api 10.0.0.14
app=api
env=prod
Service billing-prod 10.1.0.1
Service
Pod
billing 10.0.0.34
Replication controller
billing-prod
app=billing
env=prod
Pod
api 10.0.0.14
app=api
env=prod
Service billing-prod 10.1.0.1
Service
Replication controller
billing-prod
Pod
billing 10.0.0.66
app=billing
env=prod
Pod
api 10.0.0.14
app=api
env=prod
Service billing-prod 10.1.0.1
…a více• Job (cron scheduler plánovaný na 1.3)
• DaemonSet
• Horizontal Pod Autoscaler
• Secret
• Ingress
$ kubectl create -f - <<EOF > apiVersion: v1 > kind: ReplicationController > metadata: > name: billing-prod > spec: > replicas: 3 > template: > metadata: > labels: > app: billing > env: prod > spec: > containers: > - name: billing > image: docker-registry.liftago.com/billing:latest > imagePullPolicy: Always …
… > env: > - name: SPRING_PROFILES_ACTIVE > value: prod > ports: > - containerPort: 8080 > livenessProbe: > httpGet: > path: /health > port: 8080 > initialDelaySeconds: 60 > timeoutSeconds: 5 > readinessProbe: > httpGet: > path: /health > port: 8080 > initialDelaySeconds: 1 > timeoutSeconds: 1 > imagePullSecrets: > - name: docker-repository.liftago.com > EOF
$ kubectl create -f <<EOF > apiVersion: v1 > kind: Service > metadata: > name: billing-prod > labels: > app: billing > env: prod > spec: > clusterIP: 10.1.0.1 > ports: > - port: 80 > targetPort: 8080 > protocol: TCP > selector: > app: billing > env: prod > EOF
$ kubectl get po -l app=billing,env=prod NAME READY STATUS RESTARTS AGE billing-prod-e3jcm 1/1 Running 0 1m billing-prod-4sdfb 1/1 Running 0 1m billing-prod-sd134 1/1 Running 0 1m
$ kubectl get rc -l app=billing,env=prod NAME DESIRED CURRENT AGE billing-prod 3 3 1m
$ kubectl get svc -l app=billing,env=prod NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE billing-prod 10.1.0.1 <none> 80/TCP 1m
$ kubectl exec -it billing-prod-e3jcm bash $ cat /etc/hosts 127.0.0.1 billing-prod-e3jcm …
kubernetes.io
github.com/jakubkulhan/kube-jessie-ansible github.com/jakubkulhan/dockerfiles
A co ty commity/#GitHub/#CircleCI?
🤔
machine: java: version: oraclejdk8 environment: DOCKER_TAG: $(date +%Y-%m-%d).$CIRCLE_BUILD_NUM services: - docker post: - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS $DOCKER_REGISTRY
dependencies: post: - sudo wget 'http://storage.googleapis.com/kubernetes-release/release/v1.2.0/bin/linux/amd64/kubectl' -O /usr/local/bin/kubectl - sudo chmod 755 /usr/local/bin/kubectl # docker pull suggested by https://discuss.circleci.com/t/caching-docker-image-with-docker-hub/1784 - docker pull $DOCKER_REGISTRY/$CIRCLE_PROJECT_REPONAME:latest || true
test: …
deployment: kubernetes: branch: master commands: - docker build -t $DOCKER_REGISTRY/$CIRCLE_PROJECT_REPONAME:$DOCKER_TAG . - docker push $DOCKER_REGISTRY/$CIRCLE_PROJECT_REPONAME:$DOCKER_TAG
- docker tag -f $DOCKER_REGISTRY/$CIRCLE_PROJECT_REPONAME:$DOCKER_TAG $DOCKER_REGISTRY/$CIRCLE_PROJECT_REPONAME:latest - docker push $DOCKER_REGISTRY/$CIRCLE_PROJECT_REPONAME:latest
- > kubectl config set-cluster kubernetes --server=$KUBERNETES_MASTER && kubectl config set-credentials circleci --token=$KUBERNETES_TOKEN && kubectl config set-context kubernetes --cluster=kubernetes --user=circleci && kubectl config use-context kubernetes
- kubectl rolling-update billing-prod --image=$DOCKER_REGISTRY/$CIRCLE_PROJECT_REPONAME:$DOCKER_TAG --update-period=10s
Díky!Otázky?
twitter.com/jakubkulhan medium.com/@jakubkulhan
github.com/jakubkulhan