# Deploying an application

This page shows how to deploy an application in your user cluster.

# Connect to your admin workstation

ssh -i /root/anthos_secrets/vsphere_workstation ubuntu@10.15.155.200

# Configure KUBECONFIG

Configure KUBECONFIG, using the appropriate user cluster name, for example:

export KUBECONFIG=~/kubeconfigs/gmcg-gke-usercluster-1-kubeconfig

# Create a deployment

Create a manifest file named my-deployment.yaml with the following content:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: metrics
      department: sales
  replicas: 3
  template:
    metadata:
      labels:
        app: metrics
        department: sales
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"

Create the deployment using the manifest:

kubectl  apply -f my-deployment.yaml

deployment.apps/my-deployment created

Get basic information about your deployment:

kubectl  get deployment my-deployment

NAME            READY   UP-TO-DATE   AVAILABLE   AGE
my-deployment   3/3     3            3           11s

List the pods in your deployment:

kubectl get pods

NAME                             READY   STATUS    RESTARTS   AGE
my-deployment-78ff9649f5-mjjqc   1/1     Running   0          25s
my-deployment-78ff9649f5-rxnvr   1/1     Running   0          25s
my-deployment-78ff9649f5-xdx7p   1/1     Running   0          25s

# Create a service

One way to expose your deployment to clients outside your cluster is to create a Kubernetes service of type LoadBalancer.

Create a manifest named my-service.yaml with content similar to the example below. The loadBalancerIP in the example is an IP address on the network configured in F5 with external_vlan_name set to external. The IP address you choose must not already be in use and must be routable from the location of any client that sends requests to the Service.

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: metrics
    department: sales
  type: LoadBalancer
  loadBalancerIP: 10.15.158.88
  ports:
  - port: 80
    targetPort: 8080

When you create the Service, GKE on-prem automatically configures the loadBalancerIP address on your F5 BIG-IP load balancer.

kubectl  apply -f my-service.yaml

service/my-service created

View your service:

kubectl  get svc my-service

NAME         TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1     <none>         443/TCP        175m
my-service   LoadBalancer   10.101.9.20   10.15.158.88   80:32392/TCP   11s

For more detailed output, generate yaml output:

kubectl  get svc my-service -o yaml

apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"my-service","namespace":"default"},"spec":{"loadBalancerIP":"10.15.158.88","ports":[{"port":80,"targetPort":8080}],"selector":{"app":"metrics","department":"sales"},"type":"LoadBalancer"}}
  creationTimestamp: "2020-06-15T20:26:29Z"
  name: my-service
  namespace: default
  resourceVersion: "40311"
  selfLink: /api/v1/namespaces/default/services/my-service
  uid: e1b2655e-d352-44fe-be0e-cd65382e0a55
spec:
  clusterIP: 10.101.9.20
  externalTrafficPolicy: Cluster
  loadBalancerIP: 10.15.158.88
  ports:
  - nodePort: 32392
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: metrics
    department: sales
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 10.15.158.88

# Access the service

In this scenario, a client sends a request to the loadBalancerIP address 10.15.158.88 on TCP port 80. The request gets routed to your F5 BIG-IP load balancer. The load balancer chooses one of your user cluster nodes, and forwards the request to the node address on TCP port 32392. The iptables rules on the node forward the request to a member pod on TCP port 8080.

curl 10.15.158.88

Hello, world!
Version: 2.0.0

# Teardown

Remove the deployed application using the following commands:

kubectl delete svc my-service
kubectl delete deployment my-deployment