Skip to main content

Connect a VM to a managed Kubernetes cluster

When you create a managed Kubernetes cluster, the network choice determines the exposure of the API server: Public network ("visibility": "EXTERNAL") or Private network ("visibility": "INTERNAL"). With a Private network, the API server is only reachable from Numspot's internal network: to administer it with kubectl from a VM (Virtual Machine), connect the VM to the cluster network through a private connection.

This guide describes the complete path from a VM located in a VPC (Virtual Private Cloud): creation of the Hybrid Bridge, routing update, traffic opening, kubeconfig file deployment and connection with kubectl.

Prerequisites​

Procedure​

Step 1: Create the bridge between the VPC and the space​

A bridge connects a VPC to all the managed services of the space. Hybrid Bridges are managed through the API only: follow the Create a Hybrid Bridge ↗ procedure.

The POST /connectivity/spaces/{spaceId}/bridges command creates the bridge: left targets the VPC, right targets the space.

Creation is asynchronous: the API returns a 202 Accepted code and the bridge then reaches a READY state. Wait for this state before continuing.

Step 2: Add the routes towards the managed services​

Once the bridge is created, read its configuration: each entry of the routes table of the bridge contains the ipRange of the network to reach and the vpcPeeringId identifier to use as a route target.

Create one route for each entry, in the route table associated with the VM subnet (subnetwork):

  • the ipRange of the bridge as destination;
  • the vpcPeeringId of the bridge as a VPC peering target.

Follow the Create a route ↗ procedure in the console or through the POST /compute/spaces/{spaceId}/routeTables/{id}/routes API command.

Step 3: Allow the flow towards the API server​

In the security group associated with the VM, add an outbound rule allowing the ipRange of the control plane towards port 443. Follow the Add a rule to a security group ↗ procedure.

Traffic is bidirectional: the containers of the worker nodes of the cluster can reach the VM. If the VM must receive traffic from the cluster, add a dedicated inbound rule with the appropriate sources.

Step 4: Deploy the kubeconfig on the VM​

Download the kubeconfig file from the console then transfer it to the VM:

scp kubeconfig-<cluster-id>.yaml outscale@<vm-ip>:~

On the VM, place the file at the default location and restrict its permissions:

mkdir -p ~/.kube
mv kubeconfig-<cluster-id>.yaml ~/.kube/config
chmod 600 ~/.kube/config

Step 5: Connect to the cluster​

From the VM, check the connection to the cluster:

kubectl get nodes
warning

The API server URL in the kubeconfig file must be kept as is: it designates a fully qualified domain name that carries the TLS (Transport Layer Security) [SNI (Server Name Indication)] extension required by the platform. Replacing this URL with the IP address of the API server results in a connection reset.

Verification​

The kubectl get nodes command returns the worker nodes of the cluster with the Ready status:

NAME STATUS ROLES AGE VERSION
nodepool-1-8f4f9cabc-12xyz Ready worker 10m v1.30.4
nodepool-1-8f4f9cabc-34xyz Ready worker 10m v1.30.4

You can then deploy your workloads and reach them from the VM through their private IP addresses in the cluster network.

Troubleshooting​

The connection stays pending or expires​

Cause: routing or filtering blocks the traffic between the VM and the API server.

Solution: check in order:

  1. the state of the bridge, which must be READY;
  2. the existence of one route per entry of the routes table of the bridge, in the route table associated with the VM subnet;
  3. the outbound rule of the VM security group, which allows the ipRange of the control plane towards port 443.

The TLS connection is reset​

Cause: the API server URL has been replaced with an IP address — the SNI extension is then not transmitted.

Solution: keep the URL of the kubeconfig file as is and run the command again.

The API server rejects the request​

Cause: the kubeconfig file is expired or no longer matches the cluster.

Solution: download the kubeconfig file again from the console then replace the file on the VM.