baremetal-final-minikube

This commit is contained in:
D4rk4 2020-08-02 19:08:42 +02:00
parent 0cde91ff1d
commit b4adf19dbc
19 changed files with 540 additions and 0 deletions

13
Chart.yaml Normal file
View file

@ -0,0 +1,13 @@
apiVersion: v2
name: todo
description: Django-ToDo App
type: application
version: 0.1.0
appVersion: latest
dependencies:
- name: postgresql
version: 9.1.2
appVersion: 11.8.0
repository: https://charts.bitnami.com/bitnami

10
Dockerfile Normal file
View file

@ -0,0 +1,10 @@
FROM python:3.6-alpine
WORKDIR /app
RUN apk add gcc postgresql-dev openssl-dev musl-dev git && \
git clone https://github.com/shacker/gtd.git . && \
pip install pipenv && \
pipenv --python 3.6 && \
pipenv install --dev
ADD local.py project/.
ADD init.sh .
CMD [ "./init.sh" ]

10
ansible.cfg Normal file
View file

@ -0,0 +1,10 @@
[defaults]
allow_world_readable_tmpfiles=True
pipelining=True
retry_files_enabled = False
inventory = inventory
roles_path = roles
library = library
remote_tmp = /root/.ansible/tmp
[connection]
pipelining=True

6
bootstrap.yml Normal file
View file

@ -0,0 +1,6 @@
---
- name: bootstrap playbook for any k8s machine
hosts: k8s
become: yes
roles:
- bootstrap

3
init.sh Executable file
View file

@ -0,0 +1,3 @@
#!/bin/sh
pipenv run python manage.py migrate todo
pipenv run python manage.py runserver 0.0.0.0:8080

2
inventory/hosts Normal file
View file

@ -0,0 +1,2 @@
[k8s]
kubetest ansible_connection=local

32
local.py Normal file
View file

@ -0,0 +1,32 @@
# Overrides
from .settings import * # noqa: F401
import os
ALLOWED_HOSTS = ['*']
DEBUG = True
SECRET_KEY = os.environ['SECRET_KEY']
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ['DATABASE_NAME'],
'HOST': os.environ['DATABASE_HOST'],
'USER': os.environ['DATABASE_USER'],
'PASSWORD': os.environ['DATABASE_PASSWORD'],
# 'PORT': int(os.environ['DATABASE_PORT']),
# 'USER': 'django',
# 'PASSWORD': '123Asd123',
'PORT': '',
},
}
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
# TODO-specific settings
TODO_STAFF_ONLY = False
TODO_DEFAULT_LIST_SLUG = 'tickets'
TODO_DEFAULT_ASSIGNEE = None
TODO_PUBLIC_SUBMIT_REDIRECT = '/'

View file

@ -0,0 +1,5 @@
k8s_version: '1.17.5'
kubernetes_apt_release_channel: main
kubernetes_apt_repository: "deb http://apt.kubernetes.io/ kubernetes-xenial {{ kubernetes_apt_release_channel }}"
helm_apt_repository: "deb https://baltocdn.com/helm/stable/debian/ all main"
docker_apt_repository: "deb [arch=amd64] https://download.docker.com/linux/debian/ stretch stable"

View file

@ -0,0 +1,90 @@
---
- name: Ensure dependencies are installed.
apt:
name:
- apt-transport-https
- ca-certificates
- qemu-kvm
- libvirt-clients
- libvirt-daemon-system
state: present
- name: Add Docker apt key.
apt_key:
url: https://download.docker.com/linux/debian/gpg
state: present
- name: Add Helm apt key.
apt_key:
url: https://helm.baltorepo.com/organization/signing.asc
state: present
- name: Add Kubernetes apt key.
apt_key:
url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
state: present
- name: Add Kubernetes repository.
apt_repository:
repo: "{{ kubernetes_apt_repository }}"
state: present
update_cache: true
- name: Add Helm repository.
apt_repository:
repo: "{{ helm_apt_repository }}"
state: present
update_cache: true
- name: Add Docker repository.
apt_repository:
repo: "{{ docker_apt_repository }}"
state: present
update_cache: true
- name: Installing kubectl, docker.
apt:
pkg:
- kubectl={{ k8s_version }}-00
- docker-ce-cli
update_cache: yes
- name: Add Kubernetes apt preferences file to pin a version.
template:
src: apt-preferences-kubernetes.j2
dest: /etc/apt/preferences.d/kubernetes
- name: Downloading Minikube.
get_url:
url: https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
dest: /usr/local/bin/minikube
- name: Fix permissions for Minicube binary.
shell: chmod +x /usr/local/bin/minikube
- name: Installing Docker Machine KVM driver.
get_url:
url: https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2
dest: /usr/local/bin/docker-machine-driver-kvm2
- name: Fix permissions for KVM driver.
shell: chmod +x /usr/local/bin/docker-machine-driver-kvm2
- name: Configuring Minikube default driver
shell: minikube config set vm-driver kvm2
- name: Installing Helm.
apt:
name:
- helm
state: present
#- name: Installing Werf.
# get_url:
# url: https://dl.bintray.com/flant/werf/v1.1.19+fix10/werf-linux-amd64-v1.1.19+fix10
# dest: /usr/local/bin/werf
#
#- name: Fix permissions for Werf.io.
# shell: chmod +x /usr/local/bin/werf

View file

@ -0,0 +1,3 @@
Package: kubectl
Pin: version {{ k8s_version }}.*
Pin-Priority: 1000

30
runme.sh Executable file
View file

@ -0,0 +1,30 @@
#!/bin/sh
cuser=`whoami`
helm='/usr/sbin/helm'
# Installing minikube
sudo ansible-playbook bootstrap.yml
sudo adduser ${cuser} libvirt
# Init minikube
minikube start --vm-driver kvm2
# Time to Deploy something into our cluster
eval $(minikube docker-env)
docker build -t todo . && \
kubectl create secret generic todo-secrets \
--from-literal=SECRET_KEY='It5R3411iR4nd0M5tr1Ng' \
--from-literal=DATABASE_NAME='django' \
--from-literal=DATABASE_HOST='todo-postgresql.default.svc.cluster.local' \
--from-literal=DATABASE_USER='postgres'
${helm} repo add stable https://kubernetes-charts.storage.googleapis.com
${helm} repo add bitnami https://charts.bitnami.com/bitnami
#${helm} install postgres --set postgresqlDatabase=django bitnami/postgresql
${helm} dependency build
${helm} upgrade -i todo --set postgresql.postgresqlDatabase=django . -f values.yaml
while true ; do
echo "Waiting for pods..."
result=$(kubectl get pods | grep -cv Running)
if [ $result -le 1 ] ; then
minikube service todo
break
fi
sleep 10
done

21
templates/NOTES.txt Normal file
View file

@ -0,0 +1,21 @@
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "todo.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "todo.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "todo.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "todo.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80
{{- end }}

63
templates/_helpers.tpl Normal file
View file

@ -0,0 +1,63 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "todo.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "todo.fullname" -}}
{{- if .Values.fullnameOverride -}}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- if contains $name .Release.Name -}}
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "todo.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Common labels
*/}}
{{- define "todo.labels" -}}
helm.sh/chart: {{ include "todo.chart" . }}
{{ include "todo.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end -}}
{{/*
Selector labels
*/}}
{{- define "todo.selectorLabels" -}}
app.kubernetes.io/name: {{ include "todo.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end -}}
{{/*
Create the name of the service account to use
*/}}
{{- define "todo.serviceAccountName" -}}
{{- if .Values.serviceAccount.create -}}
{{ default (include "todo.fullname" .) .Values.serviceAccount.name }}
{{- else -}}
{{ default "default" .Values.serviceAccount.name }}
{{- end -}}
{{- end -}}

94
templates/deployment.yaml Normal file
View file

@ -0,0 +1,94 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "todo.fullname" . }}
labels:
{{- include "todo.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "todo.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "todo.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "todo.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
initContainers:
- args:
- -wait
- tcp://todo-postgresql.default.svc.cluster.local:5432
- -timeout
- 600s
image: jwilder/dockerize
imagePullPolicy: Always
name: waitfor
resources:
limits:
cpu: 100m
memory: 64Mi
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: todo-secrets
key: SECRET_KEY
- name: DATABASE_NAME
valueFrom:
secretKeyRef:
name: todo-secrets
key: DATABASE_NAME
- name: DATABASE_HOST
valueFrom:
secretKeyRef:
name: todo-secrets
key: DATABASE_HOST
- name: DATABASE_USER
valueFrom:
secretKeyRef:
name: todo-secrets
key: DATABASE_USER
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: todo-postgresql
key: postgresql-password
ports:
- name: http
containerPort: 8080
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}

41
templates/ingress.yaml Normal file
View file

@ -0,0 +1,41 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "todo.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "todo.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ . }}
backend:
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}

15
templates/service.yaml Normal file
View file

@ -0,0 +1,15 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "todo.fullname" . }}
labels:
{{- include "todo.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "todo.selectorLabels" . | nindent 4 }}

View file

@ -0,0 +1,8 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "todo.serviceAccountName" . }}
labels:
{{ include "todo.labels" . | nindent 4 }}
{{- end -}}

View file

@ -0,0 +1,15 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "todo.fullname" . }}-test-connection"
labels:
{{ include "todo.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test-success
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "todo.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never

79
values.yaml Normal file
View file

@ -0,0 +1,79 @@
replicaCount: 1
image:
repository: todo
pullPolicy: Never
serviceAccount:
create: true
service:
type: NodePort
port: 80
ingress:
enabled: false
postgresql:
# postgresqlPassword: postgres
global:
postgresql: {}
image:
registry: docker.io
repository: bitnami/postgresql
tag: 12.3.0-debian-10-r74
pullPolicy: IfNotPresent
debug: false
volumePermissions:
enabled: true
image:
registry: docker.io
repository: bitnami/minideb
tag: stretch
pullPolicy: IfNotPresent
securityContext:
runAsUser: 0
securityContext:
enabled: true
fsGroup: 1001
runAsUser: 1001
serviceAccount:
enabled: true
replication:
enabled: false
postgresqlDataDir: /bitnami/postgresql/data
ldap:
enabled: false
service:
type: ClusterIP
port: 5432
shmVolume:
enabled: true
persistence:
enabled: true
mountPath: /bitnami/postgresql
subPath: ""
accessModes:
- ReadWriteOnce
size: 4Gi
annotations: {}
updateStrategy:
type: RollingUpdate
resources:
requests:
memory: 256Mi
cpu: 250m
networkPolicy:
enabled: false
allowExternal: true
livenessProbe:
enabled: true
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
successThreshold: 1
readinessProbe:
enabled: true
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
successThreshold: 1
metrics:
enabled: false