Building from source ¶
Installation from a binary is recommended for normal kOps operation. However, if you want to build from source, it is straightforward:
If you don't have a GOPATH:
mkdir ~/kops
cd ~/kops
export GOPATH=`pwd`
Check out and build the code:
go get -d k8s.io/kops
cd ${GOPATH}/src/k8s.io/kops/
git checkout release
make
- The
releasebranch is where releases are taken from. This is the stable code branch. - The
masterbranch should also be functional, but is where active development happens, so may be less stable.
Cross Compiling ¶
Cross compiling for things like nodeup are now done automatically via make nodeup. make push-aws-run-amd64 TARGET=admin@$TARGET will automatically choose the linux amd64 build from your .build directory.
Debugging ¶
By default, the kOps binary is built with optimizations enabled and debug symbols stripped. To debug a prebuilt binary, it needs to be compiled with debugging symbols instead. Add DEBUGGABLE=true to the make invocation to set the compile flags appropriately.
For example, DEBUGGABLE=true make will produce a kOps binary that can be interactively debugged.
Interactive debugging with Delve ¶
Delve can be used to interactively debug the kOps binary.
The simplest way to start a debug session is dlv debug, which compiles the package with optimizations disabled and runs it under the debugger, so it does not require a special build. Run it from the root of the kOps source tree, and pass the kOps arguments after --, omitting the kops command itself:
dlv debug k8s.io/kops/cmd/kops -- update cluster --name mycluster.example.com
To debug a binary that was already built with DEBUGGABLE=true make, use dlv exec instead:
dlv exec ${GOPATH}/bin/kops -- update cluster --name mycluster.example.com
Environment variables such as KOPS_STATE_STORE are inherited by the debugged process, so set them the same way you would for a normal kOps invocation:
KOPS_STATE_STORE=s3://my-state-store \
dlv debug k8s.io/kops/cmd/kops -- update cluster --name mycluster.example.com
Headless mode ¶
To use Delve with an Interactive Development Environment (IDE), run it in headless mode and let the IDE connect to it:
dlv debug --headless --listen=:2345 --api-version=2 k8s.io/kops/cmd/kops -- update cluster --name mycluster.example.com
Then configure your IDE to connect its debugger to port 2345 on localhost.
Debugging with VS Code ¶
The VS Code Go extension manages Delve itself, so a headless server is not needed. Create a .vscode/launch.json file with the kOps arguments and environment variables for the command you want to debug:
{
"version": "0.2.0",
"configurations": [
{
"name": "kops update cluster",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd/kops",
"args": ["update", "cluster", "--name", "mycluster.example.com"],
"env": {
"KOPS_STATE_STORE": "s3://my-state-store"
}
}
]
}
Alternatively, to attach VS Code to a Delve server that was started in headless mode, use a configuration like this:
{
"name": "Attach to Delve (kOps)",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 2345,
"host": "127.0.0.1"
}
Troubleshooting ¶
- Make sure
$GOPATHis set, and your workspace is configured. - kOps will not compile with symlinks in
$GOPATH. See issue go issue 17451 for more information - building kops requires go 1.15
- kOps will only compile if the source is checked out in
$GOPATH/src/k8s.io/kops. If you try to use$GOPATH/src/github.com/kubernetes/kopsyou will run into issues with package imports not working as expected.