Is there a way to edit codes in kubernetes pods using VS Code?

10/29/2019

Typically, if I have a remote server, I could access it using ssh, and VS Code gives a beautiful extension for editing and debugging codes for the remote server. But when I create pods in Kuberneters, I can't really ssh into the container and so I cannot edit the code inside the pod or machine. And the kuberneters plugin in VSCode does not really help because the plugin is used to deploy the code. So, I was wondering whether there is a way edit codes inside a pod using VSCode.

P.S. Alternatively if there is a way to ssh into a pod in a kuberneters, that will do too.

-- user3086871
kubernetes
visual-studio-code

4 Answers

5/13/2020

As mentioned in some of the other answers, you can do this although it is fraught with danger as the cluster can/will replace pods regularly and when it does, it starts a new pod idempotently from the configuration which will not have your changes.

The command below will get you a shell session in your pod , which can sometimes be helpful for debugging if you don't have adequate monitoring/local testing facilities to recreate an issue.

kubectl --namespace=exmaple exec -it my-cool-pod-here -- /bin/bash 

Note You can replace the command with any tool that is installed in your container (python3, sh, bash, etc). Also know that that some base images like alpine wont have bash/shell installed be default.

This will open a bash session in the running container on the cluster, assuming you have the correct k8s RBAC permissions.

-- Jaboy
Source: StackOverflow

10/29/2019

There is an Cloud Code extension available for VS Code that will serve your purpose.

You can install it in your Visual Studio Code to interact with your Kubernetes cluster.

It allows you to create minikube cluster, Google GKE, Amazon EKS or Azure AKS and manage it from VS Code (you can access cluster information, stream/view logs from pods and open interactive terminal to the container). You can also enable continuous deployment so it will continuously watch for changes in your files, rebuild the container and redeploy application to the cluster.

It is well explained in Documentation

Hope it will be useful for your use case.

-- KFC_
Source: StackOverflow

5/13/2020

If your requirement is "kubectl edit xxx" to use VSCode.

solution is:

  1. for linux:

    export EDITOR=code --wait

  2. for windows:

    set EDITOR=code --wait

  3. for macos:

    export EDITOR='open -a "Visual Studio Code" --wait'

-- Hlex
Source: StackOverflow

10/29/2019

Well a pod is just a unit of deployment in kubernetes which means you can tune the containers inside it to receive an ssh connection.

Let's start by getting a docker image that allows ssh connections. rastasheep/ubuntu-sshd:18.04 image is quite nice for this. Create a deployment with it.

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: debugger
  name: debugger
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: debugger
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: debugger
    spec:
      containers:
      - name: debugger
        image: rastasheep/ubuntu-sshd:18.04
        imagePullPolicy: "Always"
      hostname: debugger
      restartPolicy: Always

Now let's create a service of type LoadBalancer such that we can access the pod remotely.

---
apiVersion: v1
kind: Service
metadata:
  namespace: default
  labels:
    app: debugger
  name: debugger
spec:
  type: LoadBalancer
  ports:
  - name: "22"
    port: 22
    targetPort: 22
  selector:
    app: debugger
status:
  loadBalancer: {}

Finally, get the external ip address by running kubectl get svc | grep debugger and use it to test the ssh connection ssh root@external_ip_address

Note the user / pass of this docker image is root / root respectively.

UPDATE Nodeport example. I tested this and it worked running ssh -p30036@ipBUT I had to enable a firewall rule to make it work. So, the nmap command that I gave you has the answer. Obviously the machines that run kubernetes don't allow inbound traffic on weird ports. Talk to them such that they can give you an external ip address or at least a port in a node.

---
apiVersion: v1
kind: Service
metadata:
  name: debugger
  namespace: default
  labels:
    app: debugger
spec:
  type: NodePort
  ports:
  - name: "ssh"
    port: 22
    nodePort: 30036
  selector:
    app: debugger
status:
  loadBalancer: {}
-- Rodrigo Loza
Source: StackOverflow