Pod Operations
Execute commands, attach to containers, forward ports, copy files, and stream logs.
Prerequisites
Install the client: npm install @kubernetes/client-node. These examples require a valid kubeconfig (default: ~/.kube/config) or in-cluster service account. Run with Node.js 18+.
Exec into a Pod
examples/typescript/exec/exec-example.ts
import * as k8s from '@kubernetes/client-node';
import stream from 'node:stream';
const command = process.argv[2];
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const exec = new k8s.Exec(kc);
const namespace = 'default';
const pod = 'nginx-4217019353-9gl4s';
const container = 'nginx';
exec.exec(
namespace,
pod,
container,
command,
process.stdout as stream.Writable,
process.stderr as stream.Writable,
process.stdin as stream.Readable,
true /* tty */,
(status: k8s.V1Status) => {
console.log('Exited with status:');
console.log(JSON.stringify(status, null, 2));
},
);
Related: KubeConfig · Exec
Attach to a Container
examples/typescript/attach/attach-example.ts
import * as k8s from '@kubernetes/client-node';
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const attach = new k8s.Attach(kc);
const namespace = 'default';
const pod = 'nginx-4217019353-9gl4s';
const container = 'nginx';
await attach.attach(
namespace,
pod,
container,
process.stdout,
process.stderr,
null /* stdin */,
false /* tty */,
);
Related: KubeConfig · Attach
Port Forward (Pod)
examples/typescript/port-forward/port-forward.ts
import * as k8s from '@kubernetes/client-node';
import net from 'node:net';
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const forward = new k8s.PortForward(kc);
const namespace = 'default';
const pod = 'demo';
const port = 8080;
// This simple server just forwards traffic from itself to a service running in kubernetes
// -> localhost:8080 -> port-forward-tunnel -> kubernetes-pod
// This is basically equivalent to 'kubectl port-forward ...' but in TypeScript.
const server = net.createServer((socket) => {
forward.portForward(namespace, pod, [port], socket, null, socket);
});
server.listen(port, '127.0.0.1');
Related: KubeConfig · PortForward
Port Forward (Deployment)
examples/typescript/port-forward/port-forward-deployment.ts
import * as k8s from '@kubernetes/client-node';
import net from 'node:net';
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const forward = new k8s.PortForward(kc);
const namespace = process.argv[2] ?? 'default';
const deploymentName = process.argv[3] ?? 'demo-deployment';
const localPort = parseInt(process.argv[4] ?? '8080', 10);
const remotePort = parseInt(process.argv[5] ?? '8080', 10);
// This creates a local server that forwards traffic to a deployment in Kubernetes
// by resolving the deployment to its first ready pod and port-forwarding to that pod.
// Usage: node port-forward-deployment.ts [namespace] [deploymentName] [localPort] [remotePort]
// Example: node port-forward-deployment.ts default my-app 8080 3000
// This is equivalent to: kubectl port-forward deployment/my-app 8080:3000 -n default
const server = net.createServer(async (socket) => {
try {
await forward.portForwardDeployment(namespace, deploymentName, [remotePort], socket, null, socket);
} catch (error) {
console.error(
`Error port-forwarding to deployment ${namespace}/${deploymentName}:`,
(error as Error).message,
);
socket.destroy();
}
});
server.listen(localPort, '127.0.0.1', () => {
console.log(`Port forward server listening on http://127.0.0.1:${localPort}`);
console.log(`Forwarding to deployment: ${namespace}/${deploymentName}:${remotePort}`);
console.log(`Press Ctrl+C to stop`);
});
server.on('error', (error: NodeJS.ErrnoException) => {
console.error('Server error:', error);
});
process.on('SIGINT', () => {
console.log('\nShutting down port-forward server...');
server.close();
process.exit(0);
});
Related: KubeConfig · PortForward
Port Forward (Service)
examples/typescript/port-forward/port-forward-service.ts
import * as k8s from '@kubernetes/client-node';
import net from 'node:net';
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const forward = new k8s.PortForward(kc);
const namespace = process.argv[2] ?? 'default';
const serviceName = process.argv[3] ?? 'demo-service';
const localPort = parseInt(process.argv[4] ?? '8080', 10);
const remotePort = parseInt(process.argv[5] ?? '8080', 10);
// This creates a local server that forwards traffic to a service in Kubernetes
// by resolving the service to its first ready pod and port-forwarding to that pod.
// Usage: node port-forward-service.ts [namespace] [serviceName] [localPort] [remotePort]
// Example: node port-forward-service.ts default my-service 8080 80
// This is equivalent to: kubectl port-forward svc/my-service 8080:80 -n default
const server = net.createServer(async (socket) => {
try {
await forward.portForwardService(namespace, serviceName, [remotePort], socket, null, socket);
} catch (error) {
console.error(`Error port-forwarding to service ${namespace}/${serviceName}:`, error.message);
socket.destroy();
}
});
server.listen(localPort, '127.0.0.1', () => {
console.log(`Port forward server listening on http://127.0.0.1:${localPort}`);
console.log(`Forwarding to service: ${namespace}/${serviceName}:${remotePort}`);
console.log(`Press Ctrl+C to stop`);
});
server.on('error', (error: NodeJS.ErrnoException) => {
console.error('Server error:', error);
});
process.on('SIGINT', () => {
console.log('\nShutting down port-forward server...');
server.close();
process.exit(0);
});
Related: KubeConfig · PortForward
Copy Files
examples/typescript/cp/cp-example.ts
import * as k8s from '@kubernetes/client-node';
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const cp = new k8s.Cp(kc);
const namespace = 'default';
const pod = 'nginx-4217019353-9gl4s';
const container = 'nginx';
const srcPath = './test.txt';
const targetPath = '/tmp';
await cp.cpFromPod(namespace, pod, container, srcPath, targetPath);
Related: KubeConfig · Cp
Follow Logs
examples/follow-logs.js
import * as k8s from '@kubernetes/client-node';
import stream from 'node:stream';
const kc = new k8s.KubeConfig();
kc.loadFromDefault();
const log = new k8s.Log(kc);
const logStream = new stream.PassThrough();
const namespace = 'default';
const pod = 'pod1';
const container = 'container1';
logStream.on('data', (chunk) => {
// use write rather than console.log to prevent double line feed
process.stdout.write(chunk);
});
try {
const req = await log.log(namespace, pod, container, logStream, {
follow: true,
tailLines: 50,
pretty: false,
timestamps: false,
});
// disconnects after 5 seconds
setTimeout(() => {
// Note: You might have to install AbortController if you are using Node version < 15.0.0
req.abort();
}, 5000);
} catch (err) {
console.error(err);
}
Related: KubeConfig · Log