Lab 1.3 - Deploy Hello-World Using ConfigMap w/ AS3

Just like the previous lab we’ll deploy the f5-hello-world docker container. But instead of using the Ingress resource we’ll use ConfigMap.

To deploy our application, we will need the following definitions:

  • Define the Deployment resource: this will launch our application running in a container.
  • Define the Service resource: this is an abstraction which defines a logical set of pods and a policy by which to access them, and exposes the service on a port on each node of the cluster (the same port on each node). You’ll be able to contact the service on any <NodeIP>:NodePort address. When you set the type field to “NodePort”, the master will allocate a port from a flag-configured range (default: 30000-32767), and each Node will proxy that port (the same port number on every Node) for your Service.
  • Define the ConfigMap resource: this can be used to store fine-grained information like individual properties or coarse-grained information like entire config files or JSON blobs. It will contain the BIG-IP configuration we need to push.

Attention

The steps are generally the same as the previous lab, the big difference is the two resource types. Your Deployment and Service definitions are the same file.

App Deployment

We will use the command line on kube-master1 to create all the required files and launch them.

  1. Go back to the Web Shell session you opened in the previous task. If you need to open a new session go back to the Deployment tab of your UDF lab session at https://udf.f5.com to connect to kube-master1 using the Web Shell access method, then switch to the ubuntu user account using the “su” command:

    ../../_images/WEBSHELL.png ../../_images/WEBSHELLroot.png
    su ubuntu
    
  2. Create a file called deployment-hello-world.yaml

    Tip

    Use the file in ~/agilitydocs/docs/class1/kubernetes

    deployment-hello-world.yaml
     1apiVersion: apps/v1
     2kind: Deployment
     3metadata:
     4  name: f5-hello-world-web
     5  namespace: default
     6spec:
     7  replicas: 2
     8  selector:
     9    matchLabels:
    10      app: f5-hello-world-web
    11  template:
    12    metadata:
    13      labels:
    14        app: f5-hello-world-web
    15    spec:
    16      containers:
    17      - env:
    18        - name: service_name
    19          value: f5-hello-world-web
    20        image: f5devcentral/f5-hello-world:latest
    21        imagePullPolicy: IfNotPresent
    22        name: f5-hello-world-web
    23        ports:
    24        - containerPort: 8080
    25          protocol: TCP
    
  3. Create a file called nodeport-service-hello-world.yaml

    Tip

    Use the file in ~/agilitydocs/docs/class1/kubernetes

    nodeport-service-hello-world.yaml
     1apiVersion: v1
     2kind: Service
     3metadata:
     4  name: f5-hello-world-web
     5  namespace: default
     6  labels:
     7    app: f5-hello-world-web
     8    cis.f5.com/as3-tenant: AS3
     9    cis.f5.com/as3-app: A1
    10    cis.f5.com/as3-pool: web_pool
    11spec:
    12  ports:
    13  - name: f5-hello-world-web
    14    port: 8080
    15    protocol: TCP
    16    targetPort: 8080
    17  type: NodePort
    18  selector:
    19    app: f5-hello-world-web
    
  4. Create a file called configmap-hello-world.yaml

    Tip

    Use the file in ~/agilitydocs/docs/class1/kubernetes

    configmap-hello-world.yaml
     1apiVersion: v1
     2kind: ConfigMap
     3metadata:
     4  name: f5-as3-declaration
     5  namespace: default
     6  labels:
     7    f5type: virtual-server
     8    as3: "true"
     9data:
    10  template: |
    11    {
    12        "class": "AS3",
    13        "declaration": {
    14            "class": "ADC",
    15            "schemaVersion": "3.10.0",
    16            "id": "urn:uuid:33045210-3ab8-4636-9b2a-c98d22ab915d",
    17            "label": "http",
    18            "remark": "A1 example",
    19            "AS3": {
    20                "class": "Tenant",
    21                "A1": {
    22                    "class": "Application",
    23                    "template": "http",
    24                    "serviceMain": {
    25                        "class": "Service_HTTP",
    26                        "virtualAddresses": [
    27                            "10.1.1.4"
    28                        ],
    29                        "pool": "web_pool",
    30                        "virtualPort": 80
    31                    },
    32                    "web_pool": {
    33                        "class": "Pool",
    34                        "monitors": [
    35                            "http"
    36                        ],
    37                        "members": [
    38                            {
    39                                "servicePort": 8080,
    40                                "serverAddresses": []
    41                            }
    42                        ]
    43                    }
    44                }
    45            }
    46        }
    47    }
    
  5. We can now launch our application:

    kubectl create -f deployment-hello-world.yaml
    kubectl create -f nodeport-service-hello-world.yaml
    kubectl create -f configmap-hello-world.yaml
    
    ../../_images/f5-container-connector-launch-configmap-app.png
  6. To check the status of our deployment, you can run the following commands:

    Note

    This can take a few seconds to a minute to create these hello-world containers to running state.

    kubectl get pods -o wide
    
    ../../_images/f5-hello-world-pods2.png
    kubectl describe svc f5-hello-world
    
    ../../_images/f5-container-connector-check-app-definition-configmap.png

    Attention

    To understand and test the new app pay attention to the NodePort value, that’s the port used to give you access to the app from the outside. Here it’s “32734”, highlighted above.

  7. Now that we have deployed our application sucessfully, we can check the configuration on BIG-IP1. Switch back to the open management session on firefox.

    Warning

    Don’t forget to select the proper partition. Previously we checked the “kubernetes” partition. In this case we need to look at the “AS3” partition. This partition was auto created by AS3 and named after the Tenant which happens to be “AS3”.

    Browse to Local Traffic ‣ Virtual Servers

    Here you can see a new Virtual Server, “serviceMain” was created, listening on 10.1.1.4:80 in partition “AS3”.

    ../../_images/f5-container-connector-check-app-bigipconfig-as3.png
  8. Check the Pools to see a new pool and the associated pool members.

    Browse to: Local Traffic ‣ Pools and select the “web_pool” pool. Click the Members tab.

    ../../_images/f5-container-connector-check-app-pool-as3.png

    Note

    You can see that the pool members listed are all the cluster node IPs on port 32734. (NodePort mode)

  9. Access your web application via Firefox on the superjump.

    Note

    Select the “Hello, World” shortcut or type http://10.1.1.4 in the URL field.

    ../../_images/f5-container-connector-access-app.png
  10. Hit Refresh many times and go back to your BIG-IP TMUI window

    Browse to: Local Traffic ‣ Pools ‣ Pool list ‣ “web_pool” ‣ Statistics to see that traffic is distributed as expected.

    ../../_images/f5-container-connector-check-app-bigip-stats-as3.png

    Note

    Why is all the traffic directed to one pool member? The answer can be found by instpecting the “serviceMain” virtual service…

  11. Scale the f5-hello-world app

    kubectl scale --replicas=10 deployment/f5-hello-world-web -n default
    
  12. Check that the pods were created

    kubectl get pods
    
    ../../_images/f5-hello-world-pods-scale10.png
  13. Check the pool was updated on BIG-IP1. Browse to: Local Traffic ‣ Pools and select the “web_pool” pool. Click the Members tab.

    ../../_images/f5-hello-world-pool-scale10-as3.png

    Attention

    Why do we still only show 3 pool members?

  14. Remove Hello-World from BIG-IP.

    Attention

    In older versions of AS3 a “blank AS3 declaration” was required to completely remove the application/declaration from BIG-IP. In AS3 v2.20 and newer this is no longer a requirement.

    kubectl delete -f configmap-hello-world.yaml
    kubectl delete -f nodeport-service-hello-world.yaml
    kubectl delete -f deployment-hello-world.yaml
    

    Note

    Be sure to verify the virtual server and “AS3” partition were removed from BIG-IP. This can take up to 30s.

  15. Remove CIS:

    Important

    Verify the AS3 partition is removed before running the following command.

    kubectl delete -f nodeport-deployment.yaml
    

Important

Do not skip these clean-up steps. Instead of reusing these objects, the next lab we will re-deploy them to avoid conflicts and errors.