Commit 70b038ed authored by Bart's avatar Bart

Added Kubernetes

parent f62f7c3f
---
title: "Over de kennisbank"
title: "Kennisbank"
description: ""
weight: 10
menu:
docs:
---
Dit is de kennisbank van Delta10
\ No newline at end of file
Welkom op de kennisbank van Delta10. In deze kennisbank verzamelen we alle informatie over de onderwerpen waar we bij Delta10 mee bezig zijn.
#### Help mee
Heb je een fout gevonden in de documentatie, of zie je een verbetering of een aanvulling? Heb je vragen of opmerkingen? Maak dan [een issue aan](https://gitlab.com/delta10/kennisbank/issues) op onze Gitlab repository of dien een [merge request](https://gitlab.com/delta10/kennisbank/merge_requests) in.
\ No newline at end of file
......@@ -6,7 +6,7 @@ menu:
docs:
---
Kubernetes vereenvoudigt het ontwikkelen, uitrollen en onderhouden van schaalbare gedistribueerde applicaties enorm. Het systeem helpt organisaties om de betrouwbaarheid van applicaties te vergroten, maakt het zeer eenvoudig om nieuwe versies van de applicatie uit te rollen en vereenvoudigt de samenwerking tussen beheerders en ontwikkelaars. De grootste voordelen van Kubernetes zijn snelheid, betrouwbaarheid en doeltreffendheid (efficiency). Kubernetes is open source en heeft in de loop der tijd een enorme community aan zich weten te binden. Het is ontstaan vanuit Google, dat het project inmiddels heeft gedoneerd aan de onafhankelijke <a href="https://www.cncf.io/" target="_blank">Cloud Native Computing Foundation (CNCF)</a>.
Kubernetes is een hulpmiddel dat het ontwikkelen, uitrollen en onderhouden van schaalbare gedistribueerde applicaties vereenvoudigt. Het systeem helpt organisaties om de betrouwbaarheid van applicaties te vergroten, maakt het zeer eenvoudig om nieuwe versies van de applicatie uit te rollen en vereenvoudigt de samenwerking tussen beheerders en ontwikkelaars. Kubernetes is open source en heeft in de loop der tijd een enorme community aan zich weten te binden. Het is ontstaan vanuit Google, dat het project inmiddels heeft gedoneerd aan de onafhankelijke <a href="https://www.cncf.io/" target="_blank">Cloud Native Computing Foundation (CNCF)</a>.
### Gedistribueerde systemen
Diensten worden steeds vaker geleverd via gedistribueerde systemen. Een gedistribueerd systeem bestaat uit meerdere kleinere programma’s die op verschillende servers draaien en gelijktijdig uitgevoerd worden. Deze kleinere programma’s communiceren met elkaar via API’s, die altijd beschikbaar moeten zijn zodat het gehele systeem altijd blijft functioneren. Er worden dus hoge eisen gesteld aan de betrouwbaarheid van gedistribueerde systemen. Onderhoud, software-updates en het opschalen van het systeem mogen de beschikbaar niet aantasten.
......
......@@ -7,5 +7,123 @@ menu:
parent: "Kubernetes"
---
# Bla
Bla bla
\ No newline at end of file
#### Vereisten
Om aan de slag te gaan heb je toegang nodig tot een Kubernetes cluster. Dit kan een bestaand cluster zijn waar je toegang tot hebt. Heb je geen toegang tot een cluster, dan kun je zelf een cluster op je eigen computer opzetten door de handleiding [een lokaal cluster opzetten](een-lokaal-cluster-opzetten/) te volgen.
Zorg vervolgens dat het programma [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) op je lokale computer geïnstalleerd staat. Met dit programma kunnen we eenvoudig verbinding te leggen met het cluster. Wanneer je een bestaand cluster gebruikt dan kun je van de beheerder de installatieinstructies krijgen die je nodig hebt om kubectl te laten werken. Wanneer je een lokaal cluster opzet dan configureert Docker Desktop of minikube je lokale omgeving zodat kubectl direct werkt.
Om te kijken of kubectl goed werkt met het cluster voer het volgende commando uit:
```bash
kubectl cluster-info
Kubernetes master is running at https://35.204.252.212
GLBCDefaultBackend is running at https://35.204.252.212/api/v1/namespaces/kube-system/services/default-http-backend:http/proxy
Heapster is running at https://35.204.252.212/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at https://35.204.252.212/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
kubernetes-dashboard is running at https://35.204.252.212/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
Metrics-server is running at https://35.204.252.212/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
```
Ook kunnen we bekijken hoeveel nodes er in ons cluster actief zijn:
```bash
kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-k8s-delta10-default-pool-8fdf11d8-1c1b Ready <none> 111d v1.9.7-gke.11
gke-k8s-delta10-default-pool-a5eaece6-d0qv Ready <none> 111d v1.9.7-gke.11
```
Onze kubectl configuratie werkt en we in ons cluster twee nodes die klaar zijn om werk op te pakken.
#### Het dashboard
Het Kubernetes dashboard kan gebruikt worden om een overzicht te krijgen van het cluster, nieuwe applicaties uit te rollen en eventuele problemen op te sporen van draaiende applicaties. Ook het gebruikt worden om bestaande Kubernetes resources (zoals Deployments, Jobs en DaemonSets enz.) aan te passen.
Gebruik het volgende commando om de proxy naar het cluster op te zetten:
```bash
kubectl proxy
```
Gebruik vervolgens deze link om het dashboard te bekijken: [http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/cluster?namespace=default](http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/cluster?namespace=default).
![Een schermafbeelding van het Kubernetes dashboard](/kubernetes/images/dashboard.png)
Op deze overzichtspagina zie je weer een lijst van nodes die actief zijn in het cluster en de verschillende gescheiden omgevingen, ook wel namespaces genoemd.
#### Een nieuwe applicatie uitrollen
Via het dashboard is het eenvoudig om een nieuwe applicatie uit te rollen. We klikken op "Deployments" en vervolgens rechtsboven op "+ Create". Via het tabblad "Create an app" kunnen we heel snel een nieuwe container uitrollen. Als voorbeeld gebruiken we de image `bartjkdp/hello-world`, een applicatie die een "Hello world" bericht toont. Vul de volgende gegevens in:
- App name: **hello-world**
- Container image: **bartj/hello-world:1.0.0**
- Number of pods: **1**
- Service: Internal, port en target port **5000**, **TCP**
![Een schermafbeelding van het create an app scherm](/kubernetes/images/create-application.png)
De container image komt overeen met de naam van de image op [DockerHub](https://dockerhub.com). Met de waarde "number of pods" kan ingesteld worden hoeveel kopieën van de applicatie opgestart worden in het cluster. Deze waarde kun je hoger maken als de applicatie voldoet aan de eisen van "[The Twelve-Factor-App](https://12factor.net/)" en je veel verkeer verwacht of wanneer je een hoge beschikbaarheid eist van de applicatie.
Druk vervolgens op "deploy" om applicatie op te starten. Via het tabblad Deployments kun je de voortgang volgen. Op het moment dat de vinkje voor de deployment op groen staat is de applicatie gereed.
#### Een applicatie inspecteren
Via het tabblad "Pods" kom je op het overzicht van alle pods, dit zijn de kopieeën van de verschillende deployments in je applicatie. Een pod kan weer bestaan uit één of meerdere containers die altijd samen gebundeld worden op één node.
We klikken nu op de hello-world pod en zien in het overzicht op welke pod deze node is opgestart. Rechtsboven kan met het knopje "Exec" en "Logs" ingelogd worden op de container en kunnen de logs van de container ingezien worden.
#### Toegang binnen het cluster
Via het tabblad "Services" zien we alle services die binnen het cluster aangeboden worden.
![Een schermafbeelding van het tabblad services](/kubernetes/images/services.png)
Omdat we bij het aanmaken van de applicatie hebben aangegeven dat we poort 5000 TCP beschikbaar willen maken is er automatisch een service **hello-world** toegevoegd. Je ziet in het overzicht ook het Cluster IP van deze service. Onder dit IP is deze service beschikbaar in het hele cluster. Daarnaast heeft Kubernetes ook automatisch een DNS verwijzing aangemaakt die gekoppeld is aan het Cluster IP. De service is dus ook onder de naam `hello-world` beschikbaar.
Wanneer er meerdere pods opgestart zijn voor dezelfde service dan wordt verkeer via het Cluster IP automatisch verdeeld over de beschikbare pods.
#### Toegang buiten het cluster
**Let op: deze stap werkt alleen op een cluster waar een ingress controller ingesteld is. Als je een cluster hebt opgezet met minikube of Docker desktop, dan is er standaard geen ingress controller ingesteld.**
Om de applicatie ook toegankelijk te maken buiten het cluster kan er een ingress definitie aan te maken. Dat kan via het tabblad Ingresses. Druk vervolgens op Create in de rechterbovenhoek en vul de volgende yaml definitie in:
```
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-world
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: hello-world.k8s.delta10.nl
http:
paths:
- path: /
backend:
serviceName: hello-world
servicePort: 5000
```
In deze configuratie wordt de host `hello-world.k8s.delta10.nl` gekoppeld aan de service `hello-world` op poort `5000`. Pas de host aan voor jouw omgeving en controleer of de DNS verwijst naar de Ingress controller van het cluster. Druk vervolgens op "Upload".
Nu de ingress definitie is aangemaakt kan de applicatie ook van buiten benaderd worden via de ingress controller. Ga met je webbrowser naar [http://{ingestelde-host}](http://{ingestelde-host}) om het resultaat te bekijken.
![Een schermafbeelding van de hello world applicatie in de webbrowser](/kubernetes/images/in-browser.png)
#### De applicatie opschalen
Om de applicatie op te schalen ga je terug naar het tabblad Deployments. Klik vervolgens op de hello-world deployment en kies vervolgens in de rechterbovenhoek voor de optie Edit.
![Een schermafbeelding van het Edit a deployment scherm](/kubernetes/images/edit-deployment.png)
Vervolgens kun je het getal `1` bij replicas verhogen naar `4`. Druk op Update om de wijziging door te voeren. Ga naar pods om te kijken of er `4` replicas actief zijn.
![Een schermafbeelding van het de verschillende pods](/kubernetes/images/multiple-pods.png)
Het verkeer vanuit de ingress en de service wordt nu automatisch verdeeld over de vier beschikbare pods.
#### De versie van een applicatie vernieuwen
Het vernieuwen van de versie van een applicatie gaat op een soortgelijke manier door de deployment aan te passen. Nu passen we alleen onder de container spec de image aan van `bartj/hello-world:1.0.0` naar `bartj/hello-world:2.0.0`.
![Een schermafbeelding van het Edit a deployment scherm, het onderdeel image](/kubernetes/images/edit-deployment-image.png)
Druk op Update om de aanpassing te bevestigen. Kubernetes vernieuwd de applicatie standaard via de [Rolling Update](https://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-intro/) strategie waarbij de pods stapsgewijs vernieuwd worden zodat het productieverkeer niet verstoord wordt.
#### De applicatie verwijderen
Het verwijderen van een applicatie gaat op een soortgelijke manier. Ga naar Deployments en kies voor de hello-world applicatie. Druk vervolgens op het knopje Delete rechtsboven om de applicatie te verwijderen. Bevestig de actie. De deployment wordt nu verwijderd. Vergeet niet om daarna ook de service en eventueel de ingress definitie te verwijderen.
\ No newline at end of file
---
title: "Een cluster opzetten"
description: ""
weight: 10
menu:
docs:
parent: "Kubernetes"
---
# Bla
Bla bla
\ No newline at end of file
---
title: "Een lokaal cluster opzetten"
description: ""
weight: 10
menu:
docs:
parent: "Kubernetes"
---
Om aan de slag te gaan heb je toegang nodig tot een Kubernetes cluster. Als je geen toegang hebt tot een bestaand cluster dan is het mogelijk om op je eigen computer een lokaal cluster op te zetten. Dit kan met behulp van één van de onderstaande hulpmiddelen:
- [Docker Desktop](https://www.docker.com/products/docker-desktop) (Windows en macOS)
- [minikube](https://github.com/kubernetes/minikube) (Linux, Windows en macOS)
#### Docker Desktop for Windows / macOS
Installeer Docker [via deze site](https://www.docker.com/products/docker-desktop). Volg vervolgens deze installatie-instructies om Kubernetes te activeren:
- Windows: https://docs.docker.com/docker-for-windows/#kubernetes
- macOS: https://docs.docker.com/docker-for-mac/#kubernetes
#### Minikube
Minikube is meer geschikt voor gebruikers die gewend zijn om met de command line te werken. Op de website [kubernetes.io](https://kubernetes.io/docs/tasks/tools/install-minikube/) zijn uitgebreide installatieinstructies te vinden.
\ No newline at end of file
---
title: "Meer informatie"
description: ""
weight: 30
menu:
docs:
parent: "Kubernetes"
---
# Bla
Bla bla
\ No newline at end of file
---
title: "Meer informatie"
description: ""
weight: 30
menu:
docs:
parent: "Kubernetes"
---
Op internet zijn veel bronnen te vinden over Kubernetes. Hieronder een lijst:
- [De officiële Kubernetes documentatie](https://kubernetes.io/docs/home/). In de officiële documentatie worden alle mogelijkheden van Kubernetes belicht en kun je veel technische documentatie vinden over alle aspecten van Kubernetes.
- [Kubernetes basics](https://kubernetes.io/docs/tutorials/kubernetes-basics/). Een interactieve tutorial die ongeveer dezelfde onderwerpen behandelt als onze "Aan de slag".
- [Scalable Microservices with Kubernetes](https://eu.udacity.com/course/scalable-microservices-with-kubernetes--ud615). Een uitgebreide gratis cursus op Udacity over Kubernetes met uitleg over microservices, het bouwen van Docker containers, Kubenetes en het uitrollen van microservices.
- [Introduction to Kubernetes](https://www.edx.org/course/introduction-to-kubernetes). Een uitgebreide cursus op edX over de belangrijkste bouwblokken van Kubernetes.
- [An introduction to Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes). Een meer technische beschrijving van de architectuur achter Kubernetes.
Ook is het boek [Kubernetes Up & Running](https://www.goodreads.com/book/show/26759355-kubernetes) van Kelsey Hightower, Brendan Burns & Joe Beda een aanrader. Het boek geeft een vrij compleet overzicht van de mogelijkheden van Kubernetes.
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Categories on Knowledge base</title>
<link>/categories/</link>
<description>Recent content in Categories on Knowledge base</description>
<generator>Hugo -- gohugo.io</generator>
<language>en-us</language>
<atom:link href="/categories/index.xml" rel="self" type="application/rss+xml" />
</channel>
</rss>
\ No newline at end of file
<!DOCTYPE html><html><head><title>/categories/</title><link rel="canonical" href="/categories/"/><meta name="robots" content="noindex"><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="refresh" content="0; url=/categories/" /></head></html>
\ No newline at end of file
@font-face {
font-family: 'Lato';
src: url('../font/Lato-Light.woff') format('woff');
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'Lato';
src: url('../font/Lato-LightItalic.woff') format('woff');
font-weight: 300;
font-style: italic;
}
@font-face {
font-family: 'Lato';
src: url('../font/Lato-Black.woff') format('woff');
font-weight: 900;
font-style: normal;
}
@font-face {
font-family: 'Lato';
src: url('../font/Lato-BlackItalic.woff') format('woff');
font-weight: 900;
font-style: italic;
}
@font-face {
font-family: 'Lato';
src: url('../font/Lato-Bold.woff') format('woff');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'Lato';
src: url('../font/Lato-BoldItalic.woff') format('woff');
font-weight: bold;
font-style: italic;
}
@font-face {
font-family: 'Lato';
src: url('../font/Lato-Semibold.woff') format('woff');
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'Lato';
src: url('../font/Lato-SemiboldItalic.woff') format('woff');
font-weight: 500;
font-style: italic;
}
@font-face {
font-family: 'Lato';
src: url('../font/Lato-Italic.woff') format('woff');
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'Lato';
src: url('../font/Lato-Regular.woff') format('woff');
font-weight: normal;
font-style: normal;
}
\ No newline at end of file
.hljs{display:block;overflow-x:auto;padding:0.5em;background:#F0F0F0}.hljs,.hljs-subst{color:#444}.hljs-comment{color:#888888}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-selector-pseudo{color:#BC6060}.hljs-literal{color:#78A960}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta-string{color:#4d99bf}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold}
\ No newline at end of file
This diff is collapsed.
body {
font-family: Lato, sans-serif; }
h1.title, h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
font-family: Lato, sans-serif; }
button, .button {
font-family: Lato, sans-serif; }
.media {
padding: 24px;
border: 1px solid rgba(0, 0, 0, 0.07);
border-radius: 3px;
margin-bottom: 24px;
max-width: 400px;
display: flex;
align-items: flex-start; }
.media img {
margin: 4px 0; }
.media .media-body {
margin-left: 16px; }
.media .media-body h5 {
margin-bottom: 0; }
.media .media-body p {
margin-bottom: 0; }
.section-head {
font-size: 24px;
line-height: 32px;
margin-top: 48px;
font-weight: 900; }
.section-head:after {
content: '#';
font-size: 15px;
font-weight: normal;
line-height: 1;
color: rgba(0, 0, 0, 0.3);
margin-left: 8px;
position: relative;
top: -1px; }
.section-head a {
text-decoration: none; }
.section-item-desc {
font-family: Consolas, Monaco, "Courier New", monospace;
font-size: 12px;
color: rgba(0, 0, 0, 0.5); }
.example {
border: 1px solid rgba(0, 0, 0, 0.07);
padding: 32px;
margin-bottom: 16px; }
.example pre.code {
margin-top: 40px;
margin-bottom: 0;
background: none;
padding: 0; }
.example.bg-darkgray {
background: #313439; }
.example.bg-darkgray pre.code {
color: rgba(255, 255, 255, 0.85); }
.demo-muted-link,
.demo-muted-link:hover {
text-decoration: none;
color: rgba(0, 0, 0, 0.3); }
.demo-animation-wrap {
margin-bottom: 24px; }
.demo-animation-wrap:after {
content: '';
display: table;
clear: both; }
.demo-animation-box {
float: left;
margin-right: 16px;
width: 202px;
height: 82px;
border: 1px dashed rgba(0, 0, 0, 0.15); }
.demo-animation-box > div {
width: 200px;
height: 80px;
background: #f8f8f8;
text-align: center;
line-height: 80px;
color: rgba(0, 0, 0, 0.4);
font-size: 18px; }
.demo-animation-btn {
font-size: 13px;
text-transform: uppercase;
font-weight: bold;
display: inline-block;
width: 200px;
margin-right: 16px; }
.demo-sizing > div {
font-family: Consolas, Monaco, "Courier New", monospace;
font-size: 11px;
padding-left: 4px;
background: #d8e9fa;
margin-bottom: 4px; }
.demo-grid .row {
margin-bottom: 4px;
background: #ebf4fc; }
.demo-grid .row.gutters {
background: none; }
.demo-grid .col {
font-family: Consolas, Monaco, "Courier New", monospace;
font-size: 12px;
padding: 8px 12px;
background: #d8e9fa;
border-left: 1px solid rgba(0, 0, 0, 0.1); }
.demo-grid .demo-col-nested {
border-left: none;
padding: 0; }
.demo-grid .demo-col-nested .row {
margin-bottom: 0; }
#demo-container {
display: flex;
flex-direction: row;
flex-wrap: wrap; }
#demo-sidebar {
flex: 0 0 300px;
background: #c4def7; }
#demo-content {
flex: auto;
background: #ebf4fc; }
#demo-sidebar,
#demo-content {
font-family: Consolas, Monaco, "Courier New", monospace;
font-size: 12px;
padding: 8px 12px;
min-height: 80px; }
#demo-media-grid {
-webkit-column-count: 2;
-moz-column-count: 2;
column-count: 2;
-webkit-column-gap: 2%;
-moz-column-gap: 2%;
column-gap: 2%; }
#demo-media-grid > div {
display: inline-block;
width: 100%; }
@media (max-width: 768px) {
#demo-media-grid {
-webkit-column-count: 1;
-moz-column-count: 1;
column-count: 1; } }
#demo-media-grid > div {
font-family: Consolas, Monaco, "Courier New", monospace;
font-size: 12px;
padding: 8px 12px;
background: #eae2f2;
text-align: center;
margin-bottom: 20px;
height: 80px; }
#demo-media-grid > div:nth-child(2n) {
height: 200px; }
#demo-media-grid > div:nth-child(5n) {
height: 120px; }
.button.red {
color: #fff;
background-color: #27cf7a; }
.button.red:hover {
color: #fff;
background-color: #ff99b3; }
.button.red:disabled, .button.red.disabled {
color: rgba(255, 255, 255, 0.7);
background-color: rgba(255, 51, 102, 0.7); }
.button.red.outline {
background: none;
color: #27cf7a;
border-color: #27cf7a; }
.button.red.outline:hover {
color: rgba(255, 51, 102, 0.6);
border-color: rgba(255, 51, 102, 0.5); }
.button.red.outline:disabled, .button.red.outline.disabled {
background: none;
color: rgba(255, 51, 102, 0.7);
border-color: rgba(255, 51, 102, 0.5); }
.label.custom {
background: #ea48a7;
color: #fff; }
.label.custom.tag, .label.custom.outline {
background: none;
border-color: #ea48a7;
color: #ea48a7; }
#breadcrumbs-custom-separator li:after {
content: '>'; }
.demo-gradient {
height: 40px;
margin-bottom: 24px; }
.demo-gradient-vertical {
background-color: #5faac8;
background-image: linear-gradient(to bottom, #5faac8 0%, #65ccb8 100%); }
.demo-gradient-vertical-to-opacity {
background: linear-gradient(to bottom, #5faac8 0%, rgba(95, 170, 200, 0) 100%); }
.demo-gradient-horizontal {
background-color: #5faac8;
background: linear-gradient(to right, #5faac8 0%, #65ccb8 100%); }
.demo-gradient-horizontal-to-opacity {
background: linear-gradient(to right, #5faac8 0%, rgba(95, 170, 200, 0) 100%); }
.demo-gradient-radial {
background-image: radial-gradient(circle, #5faac8, #65ccb8); }
.example-inverted-box {
display: inline-block;
padding: 6px 8px 6px 8px;
line-height: 1;
vertical-align: middle;
background: #d4d4d4; }
#livetabs {
margin-bottom: 24px;
font-size: 14px; }
#livetabs ul {
display: flex; }
#livetabs a {
color: #000;
text-decoration: none;
background: #f4f4f4;
border-radius: 4px;
padding: 4px 12px;
border: 1px solid transparent; }
#livetabs a:hover {
opacity: .7; }
#livetabs li {
margin-right: 4px; }
#livetabs li.active a {
background: #fff;
border-color: #eee;
color: rgba(0, 0, 0, 0.5);
cursor: default; }
#livetabs li.active a:hover {
opacity: 1; }
.togglebox-box {
padding: 24px;
padding-bottom: 16px;
background: #f8f8f8;
margin-bottom: 24px; }
#navbar-demo {
display: flex;
align-items: center;
background: #f8f8f8;
padding: 24px 20px;
margin-bottom: 24px; }
#navbar-brand {
margin-right: 24px; }
#navbar-main ul:after {
content: '';
display: table;
clear: both; }
#navbar-main li {
float: left;
margin-right: 20px; }
#navbar-demo.fixed {
background: rgba(255, 255, 255, 0.98);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); }
#navbar-main li a {
color: #000;
text-decoration: none;
display: block; }
#navbar-main li a:hover {
-moz-transition: all linear 0.2s;
transition: all linear 0.2s;
color: rgba(0, 0, 0, 0.6);
text-decoration: underline; }
@media (max-width: 768px) {
#navbar-demo {
flex-direction: column;
text-align: center; }
#navbar-brand {
margin: 0;
margin-bottom: 20px; }
#navbar-main li {
float: none;
margin: 0;
margin-bottom: 20px; } }
#demo-nav-collapse,
#demo-nav-collapse ul {
margin-left: 0;
list-style: none; }
#demo-nav-collapse li {
line-height: 32px; }
#demo-nav-collapse ul {
margin-left: 20px;
font-size: 14px; }
#demo-nav-collapse a {
color: #000;
text-decoration: none;
display: block; }
#demo-nav-collapse a:hover {
-moz-transition: all linear 0.2s;
transition: all linear 0.2s;
color: rgba(0, 0, 0, 0.6);
text-decoration: underline; }
.my-collapse {
margin-bottom: 24px; }
.my-collapse h4 {
background: #f4f4f4;
padding: 8px 16px;
margin-bottom: 1px;
font-size: 15px;
line-height: 24px; }
.my-collapse h4 a {
text-decoration: none;
color: #000;
display: block; }
.my-collapse div {
border: 1px solid rgba(0, 0, 0, 0.1);
padding: 24px 32px 1px;
margin-bottom: 1px; }
.swatch-box {
text-align: center; }
.swatch-item {
display: inline-block;
margin: 24px; }
.swatch-item h5 {
font-family: Consolas, Monaco, "Courier New", monospace;
font-weight: bold;
font-size: 14px;
line-height: 24px;
margin-bottom: 0; }
.swatch-item p {
font-family: Consolas, Monaco, "Courier New", monospace;
font-size: 12px;
line-height: 20px;
color: rgba(46, 47, 51, 0.65); }
.swatch {
display: inline-block;
height: 120px;
width: 120px;