HowTo:CS Launch Terminal

From Computer Science Wiki
Jump to navigation Jump to search

Introduction

This is a companion guide to HowTo:CS Launch. This guide goes through the same steps as the web interface version, but is done through a command line. All operations except project creation and namespace creation can be done using a command line -- reference HowTo:CS Launch for creating a project and namespace. This guide will walk you through the steps via a command line on rlogin.cs.vt.edu and applies to any other workstation you have access to. You will need to use a text editor to create configuration files. For rlogin.cs.vt.edu can use vi, nano, or VS Code to create text files.

  • This guide uses the namespace my-test-namespace You will need to substitute your own namespace name wherever this is used.

Create a Project and Namespace

Install Command Line Tools

There are two commands used to interact with kubernetes cluster: kubectl and helm. Both use the same configuration file to access to the cluster.

  • Install kubectl locally using instructions at https://kubernetes.io/docs/tasks/tools/ Generally it just involves downloading a binary release and copying the binary somewhere convenient to run.
    • Example: Install into your account on rlogin.cs.vt.edu
    • SSH into rlogin.cs.vt.edu
    • Run the following commands:
cd ~/bin
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
    • kubectl is used to view, edit, and create kubernetes resources
  • Install helm locally using instructions at https://helm.sh/docs/intro/install/ Generally it just involves downloading a binary release and copying the binary somewhere convenient to run.
    • Example: Install into your account on rlogin.cs.vt.edu
    • SSH into rlogin.cs.vt.edu
    • Run the following commands:
cd ~/bin
curl -L https://get.helm.sh/helm-v3.13.1-linux-amd64.tar.gz | tar zx --strip-components 1 linux-amd64/helm

Create Kubernetes Configuration File

The Kubernetes command line tools both use the same configuration file that tells them how to connect to the kubernetes cluster. The CS Launch system makes this easy by giving you a link on the website with the contents of the configuration file.

  • Navigate to your Cluster Dashboard
  • Click on the Copy KubeConfig to Clipboard button in the top right corner. It looks like two squares.
  • Use a text editor to create a file named config
    • The config file needs to be located in your home directory.
    • For Linux or Mac the full path to the file should be ~/.kube/config
    • For Windows the path is %USERPROFILE%\.kube\config
  • Paste the contents into the config file.
  • Example using rlogin.cs.vt.edu:
    • SSH into rlogin.cs.vt.edu
    • Run command: mkdir -p ~/.kube
    • Run command: vi ~/.kube/config
    • Hit the i key to enter insert mode
    • Paste contents of the KubeConfig file
    • Hit the ESC key to exit insert mode
    • Type the following to save the file: :wq<enter>
    • Run command: chmod 600 ~/.kube/config
  • Once you have the configuration file created and in the right place you should be able to run kubectl and access the cluster.
  • Test your cluster access by running the command kubectl get nodes

Launching a Database Using Helm

Kubernetes supports Helm charts to automate deployment of software. There are existing Helm charts for many popular software projects, such as databases. Using a Helm chart can make setting up and updating complex software much easier. This guide will walk you through deploying MariaDB using a Helm chart using a command line terminal. Helm uses repositories to store the charts that you can install. You will need to install a helm repository before you can install a chart.

  • Log into your kubectl enabled terminal.
  • Install the CS Launch Partners repo by running the following commands:
helm repo add partners https://raw.githubusercontent.com/rancher/partner-charts/main-source
helm repo update
helm search repo
  • Make a directory to store your database deployment files
mkdir mariadb-deployment
cd mariadb-deployment
  • Download the deployment Yaml configuration file
helm show values partners/mariadb > values.yaml
  • Use a text editor to edit the values.yaml file
    • Make the following changes to the file:
auth:
  database: test-db
  username: test
  password: Insecure
primary:
  persistence:
    size: 1Gi
  • Launch your database using your configuration file
helm install -f values.yaml -n my-test-namespace mariadb partners/mariadb
  • You can get a list of deployed applications with the command: helm list -n my-test-namespace
  • You can get the status of a deployed application with the command: helm status -n my-test-namespace <NAME>
  • You can run the mysql command inside of the mariadb deployment with the following commands:
DBPASS=$(kubectl get secret --namespace my-test-namespace mariadb -o jsonpath="{.data.mariadb-root-password}" | base64 --decode)
kubectl exec mariadb-0 -n my-test-namespace -it -- mariadb -h mariadb -u root --password=$DBPASS

Launch an App Using a Public Image

Next we will launch a web app called Adminer that will allow us to interact with our running database, and assign it a URL.

  • Log into your kubectl enabled terminal.
  • Create a new text file named test-adminer.yml. This file will describe your application as code.
  • Use the following code:
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
  labels:
    deployment: test-adminer
  name: test-adminer
  namespace: my-test-namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      deployment: test-adminer
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        deployment: test-adminer
      namespace: my-test-namespace
    spec:
      containers:
        - env:
            - name: ADMINER_DEFAULT_SERVER
              value: mariadb
          image: adminer:latest
          imagePullPolicy: Always
          name: container-0
          ports:
            - containerPort: 8080
              name: tcp8080
              protocol: TCP
          securityContext:
            allowPrivilegeEscalation: false
            privileged: false
            readOnlyRootFilesystem: false
            runAsNonRoot: false
      restartPolicy: Always
  • Launch your app using the following command:
    • kubectl apply -f test-adminer.yml

Create a Cluster Service

Creating a ClusterIP service for your deployment will allow other pods in your namespace to be able to access your deployment through the cluster network. The name of your service will become the DNS name that other pods use to access, in this example: test-adminer-service. If you scale your deployment up, then the service will load balance network traffic to all of your pods. A cluster service is required to map an ingress to your deployment.

  • Log into your kubectl enabled terminal.
  • Create a new text file named test-adminer-service.yml. This file will describe your service as code.
  • Use the following code:
apiVersion: v1
kind: Service
metadata:
  name: test-adminer-service
  namespace: my-test-namespace
spec:
  ports:
    - name: tcp8080
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    deployment: test-adminer
  type: ClusterIP
  • Create your service using the following command:
    • kubectl apply -f test-adminer-service.yml
  • You can now access this service from other pods in the same namespace, for example: curl -V http://test-adminer-service:8080

Create Ingress to Service

To expose your cluster service out to the Internet you create an Ingress that maps a public URL to your existing cluster service. This example is one just a basic map of an entire URL (path /). CS launch has a wildcard DNS entry for *.endeavour.cs.vt.edu so you can use any sub domain for your ingress that is not already in use. This example uses test-adminer.endeavour.cs.vt.edu. CS launch uses nginx reverse proxy, there lots of ways to customize your ingress. See: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

  • Log into your kubectl enabled terminal.
  • Create a new text file named test-adminer-ingress.yml. This file will describe your ingress as code.
  • Use the following code:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-adminer-ingress
  namespace: my-test-namespace
spec:
  rules:
    - host: test-adminer.endeavour.cs.vt.edu
      http:
        paths:
          - backend:
              service:
                name: test-adminer-service
                port:
                  number: 8080                                                                                                                          
            path: /                                                                                                                                     
            pathType: Prefix