diff --git a/.gitignore b/.gitignore index 69b85cc..e3a86f4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ __pycache__/ .terraform *.tfstate *.tfstate.* -security/letsencrypt/introduction/certs/** \ No newline at end of file +security/letsencrypt/introduction/certs/** +kubernetes/shipa/installs/shipa-helm-chart-1.1.1/ diff --git a/kubernetes/shipa/README.md b/kubernetes/shipa/README.md index c2d4c35..3a6883c 100644 --- a/kubernetes/shipa/README.md +++ b/kubernetes/shipa/README.md @@ -6,6 +6,8 @@ To get the most out of Shipa, I'll be using real Cloud Provider Kubernetes as we `minikube` cluster.
To create a Kubernetes cluster, you can follow my guides on each Cloud provider below:
+## Kubernetes in the Cloud + |Cloud | Kubernetes | Video | Source Code | | |---|---|---|---|---| |Azure | AKS |[Source Code](../cloud/azure/getting-started.md) | AKS Guide | @@ -15,6 +17,8 @@ To create a Kubernetes cluster, you can follow my guides on each Cloud provider |Linode | LKE |[Source Code](../cloud/linode/getting-started.md) | LKE Guide | +## Minikube + I will start with a local minikube cluster to get Shipa running:
``` @@ -125,52 +129,44 @@ helm install shipa . ` kubectl get pods NAME READY STATUS RESTARTS AGE -dashboard-web-1-6f8b58fb89-bjf7c 1/1 Running 0 3h12m -node-container-busybody-theonepool-zz7sw 1/1 Running 0 3h15m -node-container-netdata-theonepool-kqb5z 1/1 Running 0 3h15m -shipa-api-57b69645d9-rd2bz 1/1 Running 0 3h21m -shipa-clair-d7554fc6f-8nqgz 1/1 Running 1 3h21m -shipa-docker-registry-5885d6f467-dvkjb 1/1 Running 0 3h18m -shipa-etcd-85cc6c6458-6cgx6 1/1 Running 1 3h21m -shipa-guardian-5466f58668-25zkf 1/1 Running 0 3h16m -shipa-init-job-1-9xdgw 0/1 Completed 0 3h21m -shipa-metrics-786468c5cc-h7zfb 1/1 Running 0 3h21m -shipa-mongodb-replicaset-0 1/1 Running 0 3h21m -shipa-nginx-ingress-75dccdb4fb-nq7xq 1/1 Running 0 3h21m -shipa-postgres-7c55df4758-7s64w 1/1 Running 0 3h21m +dashboard-web-1-6f8b58fb89-bjf7c 1/1 Running 0 12m +node-container-busybody-theonepool-zz7sw 1/1 Running 0 15m +node-container-netdata-theonepool-kqb5z 1/1 Running 0 15m +shipa-api-57b69645d9-rd2bz 1/1 Running 0 21m +shipa-clair-d7554fc6f-8nqgz 1/1 Running 1 21m +shipa-docker-registry-5885d6f467-dvkjb 1/1 Running 0 18m +shipa-etcd-85cc6c6458-6cgx6 1/1 Running 1 21m +shipa-guardian-5466f58668-25zkf 1/1 Running 0 16m +shipa-init-job-1-9xdgw 0/1 Completed 0 21m +shipa-metrics-786468c5cc-h7zfb 1/1 Running 0 21m +shipa-mongodb-replicaset-0 1/1 Running 0 21m +shipa-nginx-ingress-75dccdb4fb-nq7xq 1/1 Running 0 21m +shipa-postgres-7c55df4758-7s64w 1/1 Running 0 21m kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -dashboard-web-1 ClusterIP 10.96.3.55 8888/TCP 3h12m -dashboard-web-1-units ClusterIP None 8888/TCP 3h12m -kubernetes ClusterIP 10.96.0.1 443/TCP 3h46m -shipa-api ClusterIP 10.100.120.116 8080/TCP,8081/TCP 3h21m -shipa-clair ClusterIP 10.111.91.38 6060/TCP,6061/TCP 3h21m -shipa-docker-registry ClusterIP 10.104.180.204 5000/TCP 3h21m -shipa-etcd ClusterIP 10.110.16.90 2379/TCP 3h21m -shipa-guardian ClusterIP 10.97.114.38 8000/TCP,22/TCP 3h21m -shipa-ingress-nginx ClusterIP 10.100.10.10 22/TCP,5000/TCP,8081/TCP,8080/TCP,2379/TCP 3h21m -shipa-metrics ClusterIP 10.108.223.229 9090/TCP,9091/TCP 3h21m -shipa-mongodb-replicaset ClusterIP None 27017/TCP 3h21m -shipa-mongodb-replicaset-client ClusterIP None 27017/TCP 3h21m -shipa-postgres ClusterIP 10.104.18.123 5432/TCP 3h21m - - -# access the dashboard - -kubectl port-forward svc/dashboard-web-1 8888 - +dashboard-web-1 ClusterIP 10.96.3.55 8888/TCP 12m +dashboard-web-1-units ClusterIP None 8888/TCP 12m +kubernetes ClusterIP 10.96.0.1 443/TCP 6m +shipa-api ClusterIP 10.100.120.116 8080/TCP,8081/TCP 21m +shipa-clair ClusterIP 10.111.91.38 6060/TCP,6061/TCP 21m +shipa-docker-registry ClusterIP 10.104.180.204 5000/TCP 21m +shipa-etcd ClusterIP 10.110.16.90 2379/TCP 21m +shipa-guardian ClusterIP 10.97.114.38 8000/TCP,22/TCP 21m +shipa-ingress-nginx ClusterIP 10.100.10.10 22/TCP,5000/TCP,8081/TCP,8080/TCP,2379/TCP 21m +shipa-metrics ClusterIP 10.108.223.229 9090/TCP,9091/TCP 21m +shipa-mongodb-replicaset ClusterIP None 27017/TCP 21m +shipa-mongodb-replicaset-client ClusterIP None 27017/TCP 21m +shipa-postgres ClusterIP 10.104.18.123 5432/TCP 21m ``` -We should now be able to access the dashboard on `http://localhost:8888` - ## Targets ``` -# add a route for NGINX +# add a route for accessing Shipa API route add 10.100.10.10/32 MASK 255.255.255.255 $(minikube ip) -# add a route for Traefik +# add a route for accessing our Applications route add 10.100.10.20/32 MASK 255.255.255.255 $(minikube ip) shipa target-add dev 10.100.10.10 @@ -183,7 +179,7 @@ shipa target-set dev https://learn.shipa.io/docs/pool-management ``` -shipa pool-add dev --public --kube-namespace blue-team --provisioner kubernetes +shipa pool-add prod --public --kube-namespace blue-team --provisioner kubernetes shipa pool-list ``` @@ -209,14 +205,46 @@ shipa app-create go-helloworld static -t admin -o theonepool cd kubernetes\shipa\developers -docker build aimvector/shipa-golang:v1 +docker build .-t aimvector/shipa-golang:v1 docker push aimvector/shipa-golang:v1 shipa app-deploy -i aimvector/shipa-golang:v1 -a go-helloworld + +cd .\kubernetes\shipa\developers\docker\python\ + +docker build . -t aimvector/shipa-python:v1 +docker push aimvector/shipa-python:v1 + +shipa app-create python-helloworld static -t admin -o theonepool +shipa env set FLASK_APP=/app/server.py -a python-helloworld +shipa app-deploy -i aimvector/shipa-python:v1 -a python-helloworld + + + +# deploy to prod + +shipa app-create python-helloworld-prod static -t admin -o prod +shipa env set FLASK_APP=/app/server.py -a python-helloworld-prod +shipa app-deploy -i aimvector/shipa-python:v1 -a python-helloworld-prod + + +shipa app-create go-helloworld-prod static -t admin -o prod +shipa app-deploy -i aimvector/shipa-golang:v1 -a go-helloworld-prod + ``` +``` +kubectl apply -f shipa-admin-service-account.yaml + +# get the sa token +kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep shipa-admin | awk '{print $1}') +# get the k8s CA + +kubectl get secret $(kubectl get secret | grep default-token | awk '{print $1}') -o jsonpath='{.data.ca\.crt}' | base64 -d + +``` diff --git a/kubernetes/shipa/developers/dockerfile b/kubernetes/shipa/developers/docker/golang/dockerfile similarity index 100% rename from kubernetes/shipa/developers/dockerfile rename to kubernetes/shipa/developers/docker/golang/dockerfile diff --git a/kubernetes/shipa/developers/main.go b/kubernetes/shipa/developers/docker/golang/main.go similarity index 100% rename from kubernetes/shipa/developers/main.go rename to kubernetes/shipa/developers/docker/golang/main.go diff --git a/kubernetes/shipa/developers/docker/python/dockerfile b/kubernetes/shipa/developers/docker/python/dockerfile new file mode 100644 index 0000000..f1a685b --- /dev/null +++ b/kubernetes/shipa/developers/docker/python/dockerfile @@ -0,0 +1,10 @@ +FROM python:3.7.3-alpine3.9 +RUN mkdir /app +WORKDIR /app +COPY ./requirements.txt /app/requirements.txt +RUN pip install -r requirements.txt +ADD . /app/ +ENV FLASK_APP=/app/server.py +RUN chmod +x entrypoint.sh +ENTRYPOINT ./entrypoint.sh +EXPOSE 5000 \ No newline at end of file diff --git a/kubernetes/shipa/developers/docker/python/entrypoint.sh b/kubernetes/shipa/developers/docker/python/entrypoint.sh new file mode 100644 index 0000000..bd60eef --- /dev/null +++ b/kubernetes/shipa/developers/docker/python/entrypoint.sh @@ -0,0 +1 @@ +flask run -h 0.0.0 -p 5000 \ No newline at end of file diff --git a/kubernetes/shipa/developers/docker/python/requirements.txt b/kubernetes/shipa/developers/docker/python/requirements.txt new file mode 100644 index 0000000..9614ae3 --- /dev/null +++ b/kubernetes/shipa/developers/docker/python/requirements.txt @@ -0,0 +1 @@ +Flask == 1.0.3 \ No newline at end of file diff --git a/kubernetes/shipa/developers/docker/python/server.py b/kubernetes/shipa/developers/docker/python/server.py new file mode 100644 index 0000000..6c8be82 --- /dev/null +++ b/kubernetes/shipa/developers/docker/python/server.py @@ -0,0 +1,6 @@ +from flask import Flask +app = Flask(__name__) + +@app.route("/") +def hello(): + return "Hello World!" \ No newline at end of file diff --git a/kubernetes/shipa/devops/shipa-admin-service-account.yaml b/kubernetes/shipa/devops/shipa-admin-service-account.yaml new file mode 100644 index 0000000..4379b61 --- /dev/null +++ b/kubernetes/shipa/devops/shipa-admin-service-account.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: shipa-admin + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1beta1 +kind: ClusterRoleBinding +metadata: + name: shipa-admin +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + name: shipa-admin + namespace: kube-system \ No newline at end of file