skip to Main Content

I have created a local Minikube cluster, then a deployment for a hello-world example. After it is active, a service is created at the same time.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      run: hello-world-example
  replicas: 2
  template:
    metadata:
      labels:
        run: hello-world-example
    spec:
      containers:
        - name: hello-world
          image: gcr.io/google-samples/hello-app:2.0 # Works
          ports:
            - containerPort: 8080
              protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: hello-app-service
spec:
  # type: NodePort
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: hello-world
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    # nodePort: 31579

I apply the deployment and service with kubectl apply-f hello-app.yaml
I end up with the following example services:

NAMESPACE NAME TARGET PORT URL
default hello-app-service 8080 http://IP:31813
default kubernetes No node port
kube-system kube-dns No node port

Note: My actual IP is not actually "IP"

When I curl the URL for the hello-app-service, I end up with this:

curl: (7) Failed to connect to IP port 31813 after 0 ms: Connection refused

However, when I expose the deployment service manually in CLI with
kubectl expose deployment hello-world --type=LoadBalancer --port=8080

I get the following result:

NAMESPACE NAME TARGET PORT URL
default hello-app-service 8080 http://IP:31813
default hello-world 8080 http://IP:32168
default kubernetes No node port
kube-system kube-dns No node port

And after I curl the URL for new service "hello-world", I end with the proper result:

Hello, world!
Version: 2.0.0
Hostname: hello-world-5bb7fff796-fmwl8

Can somebody please explain to me what I am doing wrong with the service? Why is the CLI service working, while the .yaml file service is not working, despite using the same configuration.
I have tested both with the same exact service settings as the CLI command (Using LoadBalancer type) and also with NodePort and setting the specific port.

Versions:
OS: Ubuntu 22.04.2 LTS
Docker version: 24.0.2
Kubectl version:
Client Version: v1.27.2
Kustomize Version: v5.0.1
Server Version: v1.26.3
Minikube version: v1.30.1

2

Answers


  1. I’d change the selector for your service so it maps correctly to your deployment. Also, you can manually assign an external IP in your manifest:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-world
    spec:
      selector:
        matchLabels:
          run: hello-world-example
      replicas: 2
      template:
        metadata:
          labels:
            run: hello-world-example
        spec:
          containers:
            - name: hello-world
              image: gcr.io/google-samples/hello-app:2.0 # Works
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: hello-app-service
    spec:
      # type: NodePort
      type: LoadBalancer
      selector:
        run: hello-world-example
      ports:
      - protocol: TCP
        port: 8080
        targetPort: 8080
      externalIPs:
      - 34.74.203.201
    

    EDIT
    Kubernetes service external ip pending
    You could always change your service to a NodePort or IngressController, but since you’re running minikube there’s a "magic command":

    minikube tunnel
    

    https://minikube.sigs.k8s.io/docs/handbook/accessing/

    Login or Signup to reply.
  2. Cloud Run

    Cloud Run is a managed serverless compute platform that lets you run containers directly on top of Google’s scalable infrastructure.

    In Cloud Run, each revision is automatically scaled to the number of instances needed to handle all incoming requests or events. When a revision does not receive any traffic, by default it is scaled in to zero instances.

    Scaling depends on below factors The CPU utilization of existing instances when they are processing requests or events over a one minute window, targeting to keep scheduled instances to a 60% CPU utilization.

    The current request concurrency, compared to the maximum concurrency over a one minute window.

    The maximum number of instances setting

    The minimum number of instances setting

    You can use the below commands to set maximum & minimum instances and concurrent requests

    gcloud run services update SERVICE –concurrency CONCURRENCY
    gcloud run services update SERVICE –min-instances MIN-VALUE –max-instances MAX-VALUE

    Cloud run processes the requests parallely, not per second processing. So when you set maximum instances to 2 and concurrency to 20 , you have to consider 1st instances handling 20 concurrent requests at a time , then upcoming 20 requests are processed by 2nd instance at the same time.

    Pricing: Pay-per-use, with an always-free tier, rounded up to the nearest 100 millisecond. Total cost is the sum of used CPU, Memory, Requests and Networking.

    | CPU | MEMORY | REQUESTS |
    |————-|——————————–|——————————-|——————————|
    | Price | $0.00002400 per vCPU-second | $0.00000250 per GiB-Second | $0.40 per million requests |
    | Always free | 180,000 vCPU-seconds per month | 360,000 GiB-seconds per month | 2 million requests per month |

    Firestore :

    Firestore


    Get all documents from a collection import { collection, query, where, getDocs } from "firebase/firestore";

    const q = query(collection(db, "cities"), where("capital", "==", true));

    const querySnapshot = await getDocs(q);
    querySnapshot.forEach((doc) => {
    // doc.data() is never undefined for query doc snapshots
    console.log(doc.id, " => ", doc.data());
    });

    Docs :

    | Parameter | Type | Description |
    |———–|———-|———————————-|
    | getDocs | method | Get documents from given query |

    ~~Deprecated: Do not use firebase 8 version~~

    Note: Always use firestore modular sdk

    https://firebase.google.com/docs/firestore

    To Do:

    • Write the Get method
    • Update the document
    • Display the result

    Cloud Functions:

    Google Cloud Functions is a serverless execution environment for building and connecting cloud services. With Cloud Functions you write simple, single-purpose functions that are attached to events emitted from your cloud infrastructure and services.

    A lean single purpose function means following a single responsibility principle (SRP). Your function does one thing only.

    What types of Cloud Functions exist?

    1. HTTP functions, which handle HTTP requests and use HTTP triggers. See Write HTTP functions for information about implementing HTTP functions.
    2. Event-driven functions, which handle events from your cloud environment and use event triggers as described in Cloud Functions triggers.

    Let’s check how to create a simple Hello world function through the console?

    1. Navigate to Google Cloud Console. In the console, click the Navigation menu and click on Cloud Functions.
    2. Click on Create Function.
    3. Enter the following values and click Save.
    • Function Name: GCPFunction
    • Region: us-central1
    • Trigger: HTTP
    1. Click Next. Select Inline editor in the source code.
    2. Keep the runtime as the default Node.js 18.
    3. Add the below index.js file which contains the simple Hello world code and package.json file which contains only a name attribute and a version attribute.

    index.js file:

    exports.helloWorld = (req, res) => {
    let message = req.query.message || req.body.message || ‘Hello World!’;
    res.status(200).send(message);
    };

    Package.json file:

    {
    "name": "sample-http",
    "version": "0.0.1"
    }

    1. Next step is to deploy the function. Click on Deploy.

    Reference: Google Cloud Functions

    Cloud Storage

    Cloud Storage


    Cloud Storage is a service for storing your objects in Google Cloud. An object is an immutable piece of data consisting of a file of any format. You store objects in containers called buckets. All buckets are associated with a project, and you can group your projects under an organization. Each project, bucket, and object in Google Cloud is a resource in Google Cloud, as are things such as Compute Engine instances.

    Buckets are the basic containers that hold your data. Everything that you store in Cloud Storage must be contained in a bucket. You can use buckets to organize your data and control access to your data, but unlike directories and folders, you cannot nest buckets.

    • There is no limit to the number of buckets you can have in a project or location
    • There are, however, limits to the rate you can create or delete buckets.
    • When you create a bucket, you give it a globally-unique name
    • You cannot change the name or location of an existing bucket.

    Create a new bucket using command line

    In your development environment, run the gcloud storage buckets create command:

    gcloud storage buckets create gs://BUCKET_NAME

    Create a new bucket using client libraries

    from google.cloud import storage

    def create_bucket_class_location(bucket_name):

    # bucket_name = "your-new-bucket-name"

    storage_client = storage.Client()

    bucket = storage_client.bucket(bucket_name)
    bucket.storage_class = "COLDLINE"
    new_bucket = storage_client.create_bucket(bucket, location="us")

    print(
    "Created bucket {} in {} with storage class {}".format(
    new_bucket.name, new_bucket.location, new_bucket.storage_class
    )
    )
    return new_bucket

    When you create a bucket, you can specify a default storage class for the bucket. When you add objects to the bucket, they inherit this storage class unless explicitly set otherwise.If you don’t specify a default storage class when you create a bucket, that bucket’s default storage class is set to Standard storage.

    1.Standard

    2.Nearline

    3.Coldline

    4.Archive

    For more information on Storage classes refer to this document

    newline edit answer

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search