diff --git a/kubernetes-example/kubectl-intro.md b/kubernetes-example/kubectl-intro.md new file mode 100644 index 0000000..268500e --- /dev/null +++ b/kubernetes-example/kubectl-intro.md @@ -0,0 +1,168 @@ +# Introduction to kubectl + +## Prerequisites + +For using this you must install the following tools: + +- Python +- Pip +- Kubectl +- Openstack-Client + +### Python + +Install python and pip for your OS, if it is not installed. This is already done at the NetLab PCs. + +### Installing kubectl and arkade + +Run this in a **bash** terminal to download arkade and install kubectl: + +For windows you can use e.g. the **Git Bash** terminal. + +```bash +curl -sLS https://dl.get-arkade.dev | sh +arkade get kubectl +# To load the path to the binary +export PATH=$PATH:$HOME/.arkade/bin/ +``` + +With arkade you can also install other tools: ```arkade get``` to see all possibilities. + +### Openstack Client + +To install the Openstack client and the magnum package: + +If you are using Windows, you must start the bash terminal with **Administrator** privileges! + +```bash +pip3 install openstackclient python-magnumclient +# Download the Openstack RC File from your Openstack account +# Load the file +source {USERNAME}-openrc.sh +``` + +### Download the kubeconfig + +Download the kubeconfig file for your cluster from OpenStack. + +```bash +# Before using this, check if Openstack RC File is loaded! +openstack coe cluster config {CLUSTER_NAME} +# Then run the given command in terminal +export ... +# Now you are able to run kubectl commands at your Kubernetes cluster +``` + +## Deployment of the needed description in kubernetes + +These are two approaches to create the description in Kubernetes: + +```bash +# create a namespace +kubectl create namespace web-test + +# Then choose one of the following ways: +# (1) Create the description +kubectl create -f nginx.yml -f service.yml + +# (2) Create or update descriptions if existing +kubectl apply -f nginx.yml -f service.yml +``` + +## To show it is working + +Here are some useful commands: + +```bash +# show nodes +kubectl get nodes + +# show pods for our namespace +kubectl get -n web-test pods + +# show deployments for our namespace +kubectl get -n web-test deployment + +# show services for our namespace +kubectl get -n web-test service + +# show logs of deployed nginx instances +kubectl logs -n web-test deployment/nginx-deployment +``` + +## Scaling up and down + +```bash +# scale up instances to 5 +kubectl scale -n web-test deployment/nginx-deployment --replicas=5 + +# scale down instances again to 3 +kubectl scale -n web-test deployment/nginx-deployment --replicas=3 + +``` + + +## To see it is working in the browser ;) + +The nginx instances are reachable at the floating ips of the **node**-instances at port **30007** in our case. + + +## Many other things can be done ;) + +- Autoscaling +- Detailled Service functions (LoadBalancer, ...) +- Dashboard +- FaaS Setup ;) +- ... + + +## Appendix + +### Nginx description + +*nginx.yml:* +```yml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + namespace: web-test +spec: + selector: + matchLabels: + app: nginx-deployment + replicas: 3 # tells deployment to run 3 pods matching the template + template: + metadata: + labels: + app: nginx-deployment + spec: + containers: + - name: nginx + image: nginx:latest + ports: + - containerPort: 80 + +``` + +### Nginx service description + +*service.yml:* +```yml +apiVersion: v1 +kind: Service +metadata: + name: nginx-service + namespace: web-test +spec: + type: NodePort + selector: + app: nginx-deployment + ports: + # By default and for convenience, the `targetPort` is set to the same value as the `port` field. + - port: 80 + targetPort: 80 + # Optional field + # By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767) + nodePort: 30007 +``` \ No newline at end of file diff --git a/kubernetes-example/nginx.yml b/kubernetes-example/nginx.yml new file mode 100644 index 0000000..e14fd3b --- /dev/null +++ b/kubernetes-example/nginx.yml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + namespace: web-test +spec: + selector: + matchLabels: + app: nginx-deployment + replicas: 3 # tells deployment to run 3 pods matching the template + template: + metadata: + labels: + app: nginx-deployment + spec: + containers: + - name: nginx + image: nginx:latest + ports: + - containerPort: 80 \ No newline at end of file diff --git a/kubernetes-example/service.yml b/kubernetes-example/service.yml new file mode 100644 index 0000000..1638a45 --- /dev/null +++ b/kubernetes-example/service.yml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: nginx-service + namespace: web-test +spec: + type: NodePort + selector: + app: nginx-deployment + ports: + # By default and for convenience, the `targetPort` is set to the same value as the `port` field. + - port: 80 + targetPort: 80 + # Optional field + # By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767) + nodePort: 30007 \ No newline at end of file