Developer Environments
Traditional development involves committing code, pushing to repository, kicking start a CI pipeline, passing and then pushing it to a cluster through CD practices. The task grows burdonsome as you need to do it multiple times a day and as more and more develipers get added to the mix.
Dev Environments attempt to solve this by allowing you to Live preview your changes as you save the code (er changes) in your editor. While this can be done with scripts and wrappers it comes with a lot of overhead of configuration and up-keep. Okteto cli intends to provide you a cli set to ease this burden with well-defined flows.
Install cli
❯ brew install okteto
...
❯ okteto version
okteto version 1.14.9
Configure okteto cli to your kubernetes context
❯ kubectl ctx # from krew ctx plugin
default
❯ okteto context use default
✓ Using context default @ default
i Run 'okteto context update-kubeconfig' to update your kubectl credentials
❯ okteto context update-kubeconfig
i Updated kubernetes context 'default/default' in '[/Users/nashok/k3s.conf]'
❯ okteto context list
Name Namespace Builder Registry
default * default docker -
Developer workflow
- Sample python application
❯ cat app.py
import datetime
from flask import Flask, jsonify
app = Flask('example')
now = datetime.datetime.now()
@app.route('/', methods=['GET'])
def root():
return jsonify({'message': 'hello world'})
@app.route('/healthz', methods=['GET'])
def health():
return jsonify({'message': f'up since {now}'})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080, debug=True)
❯ cat Dockerfile
FROM python:3.8-slim-buster
WORKDIR /python-docker
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
EXPOSE 8080
COPY . .
CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]
❯ tree -L 1
.
├── Dockerfile
├── app.py
├── requirements.txt
- Run
okteto init
❯ okteto init
i Using default @ default as context
✓ Okteto manifest (okteto.yml) deploy and build configured successfully
? Do you want to launch your development environment? [y/n]: n
❯ tree -L 1
.
├── Dockerfile
├── app.py
├── okteto.yml # gets created
├── requirements.txt
- Build and push the images
❯ grep image: okteto.yml
image: ashoka007/okteto-test:0.0.1
❯ okteto build
i Building image for service 'python'
i Building the image 'ashoka007/okteto-test:0.0.1' using your local docker daemon
[+] Building 4.2s (11/11) FINISHED
=> [internal] load build definition from Dockerfile => => transferring dockerfile: 255B
...
0.0.1: digest: sha256:dfd2fa6109e7d6cfade3c6eda90319b0f59816877faf4a23e18bb6cf6a50bc2f size: 2207
✓ Image 'ashoka007/okteto-test:0.0.1' successfully pushed
- Deploy images
❯ okteto deploy
i Using default @ default as context
i Images were already built. To rebuild your images run 'okteto build' or 'okteto deploy --build'
i Running kubectl apply -f kubernetes.yaml
deployment.apps/okteto-test-dep created
service/okteto-test-svc created
There are no available endpoints for 'python'
✓ Development environment 'python' successfully deployed
i Run 'okteto up' to activate your development container
- Start synchronization
❯ okteto up
i Using default @ kind-macbook as context
i Development environment 'docker' already deployed.
i To redeploy your development environment run 'okteto deploy' or 'okteto up [devName] --deploy'
i Images were already built. To rebuild your images run 'okteto build' or 'okteto deploy --build'
✓ Images successfully pulled
✓ Files synchronized
Context: kind-macbook
Namespace: default
Name: test-app
Forward: 8080 -> 8080
9229 -> 9229
root@test-app-okteto-6bb5c444cf-txvxt:/python-docker#
- Start the service in DEV mode and test working
root@test-app-okteto-6bb5c444cf-txvxt:/python-docker# python app.py
* Serving Flask app 'example' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on all addresses (0.0.0.0)
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://127.0.0.1:8080
* Running on http://10.244.1.16:8080 (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 111-486-135
127.0.0.1 - - [03/Aug/2022 05:26:16] "GET / HTTP/1.1" 200 -
# test from localhost
❯ curl localhost:8080
{
"message": "hello from app again @ 2022-08-03 05:26:02.759327"
}
- Check the bi-directional sync between the DEV pod and localhost
# localhost
❯ touch test.txt
❯ ls
Dockerfile app.py okteto.yaml requirements.txt test.txt
# inside the pod
root@test-app-okteto-6bb5c444cf-txvxt:/python-docker# ls
Dockerfile app.py okteto.yaml requirements.txt test.txt
- Clean up
root@test-app-okteto-6bb5c444cf-txvxt:/python-docker# exit
exit
# localhost
❯ okteto down
i Using default @ kind-macbook as context
✓ Development container 'test-app' deactivated
Top comments (0)