How to create a local development environment for Kubernetes?

前端 未结 12 1605
谎友^
谎友^ 2020-12-22 18:59

Kubernetes seems to be all about deploying containers to a cloud of clusters. What it doesn\'t seem to touch is development and staging environments (or such).

Durin

相关标签:
12条回答
  • 2020-12-22 19:22

    Having a nice local development feedback loop is a topic of rapid development in the Kubernetes ecosystem.

    Breaking this question down, there are a few tools that I believe support this goal well.

    Docker for Mac Kubernetes

    Docker for Mac Kubernetes (Docker Desktop is the generic cross platform name) provides an excellent option for local development. For virtualization, it uses HyperKit which is built on the native Hypervisor framework in macOS instead of VirtualBox.

    The Kubernetes feature was first released as beta on the edge channel in January 2018 and has come a long way since, becoming a certified Kubernetes in April 2018, and graduating to the stable channel in July 2018.

    In my experience, it's much easier to work with than Minikube, particularly on macOS, and especially when it comes to issues like RBAC, Helm, hypervisor, private registry, etc.

    Helm

    As far as distributing your code and pulling updates locally, Helm is one of the most popular options. You can publish your applications via CI/CD as Helm charts (and also the underlying Docker images which they reference). Then you can pull these charts from your Helm chart registry locally and upgrade on your local cluster.

    Azure Draft

    You can also use a tool like Azure Draft to do simple local deploys and generate basic Helm charts from common language templates, sort of like buildpacks, to automate that piece of the puzzle.

    Skaffold

    Skaffold is like Azure Draft but more mature, much broader in scope, and made by Google. It has a very pluggable architecture. I think in the future more people will use it for local app development for Kubernetes.

    If you have used React, I think of Skaffold as "Create React App for Kubernetes".

    Kompose or Compose on Kubernetes

    Docker Compose, while unrelated to Kubernetes, is one alternative that some companies use to provide a simple, easy, and portable local development environment analogous to the Kubernetes environment that they run in production. However, going this route means diverging your production and local development setups.

    Kompose is a Docker Compose to Kubernetes converter. This could be a useful path for someone already running their applications as collections of containers locally.

    Compose on Kubernetes is a recently open sourced (December 2018) offering from Docker which allows deploying Docker Compose files directly to a Kubernetes cluster via a custom controller.

    0 讨论(0)
  • 2020-12-22 19:24

    We've been working on a tool to do this. Basic idea is you have remote Kubernetes cluster, effectively a staging environment, and then you run code locally and it gets proxied to the remote cluster. You get transparent network access, environment variables copied over, access to volumes... as close as feasible to remote environment, but with your code running locally and under your full control.

    So you can do live development, say. Docs at http://telepresence.io

    0 讨论(0)
  • 2020-12-22 19:24

    The disadvantage of using minkube is that it spawns another virtual machine over your machine. Also, with latest minikube version it minimum requires to have 2 CPU and 2GB of RAM from your system, which makes it pretty heavy If you do not have the system with enough resources.

    This is the reason I switched to microk8s for development on kubernetes and I love it. microk8s supports the DNS, local-storage, dashboard, istio, ingress and many more, everything you need to test your microservices.

    It is designed to be a fast and lightweight upstream Kubernetes installation isolated from your local environment. This isolation is achieved by packaging all the binaries for Kubernetes, Docker.io, iptables, and CNI in a single snap package.

    A single node kubernetes cluster can be installed within a minute with a single command:

    snap install microk8s --classic
    

    Make sure your system doesn't have any docker or kubelet service running. Microk8s will install all the required services automatically.

    Please have a look at the following link to enable other add ons in microk8s.

    https://github.com/ubuntu/microk8s

    You can check the status using:

    velotio@velotio-ThinkPad-E470:~/PycharmProjects/k8sClient$ microk8s.status
    microk8s is running
    addons:
    ingress: disabled
    dns: disabled
    metrics-server: disabled
    istio: disabled
    gpu: disabled
    storage: disabled
    dashboard: disabled
    registry: disabled
    
    0 讨论(0)
  • 2020-12-22 19:26

    The sort of "hot reload" is something we have plans to add, but is not as easy as it could be today. However, if you're feeling adventurous you can use rsync with docker exec, kubectl exec, or osc exec (all do the same thing roughly) to sync a local directory into a container whenever it changes. You can use rsync with kubectl or osc exec like so:

    # rsync using osc as netcat
    $ rsync -av -e 'osc exec -ip test -- /bin/bash' mylocalfolder/ /tmp/remote/folder
    
    0 讨论(0)
  • 2020-12-22 19:28

    Have a look at https://github.com/okteto/okteto and Okteto Cloud. The value proposition is to have the classical development experience than working locally, prior to docker, where you can have hot-reloads, incremental builds, debuggers... but all your local changes are immediately synchronized to a remote container. Remote containers give you access to the speed of cloud, allow a new level of collaboration, and integrates development in a production-like environment. Also, it eliminates the burden of local installations.

    0 讨论(0)
  • 2020-12-22 19:29

    Another great starting point is this Vagrant setup, esp. if your host OS is Windows. The obvious advantages being

    • quick and painless setup
    • easy to destroy / recreate the machine
    • implicit limit on resources
    • ability to test horizontal scaling by creating multiple nodes

    The disadvantages - you need lot of RAM, and VirtualBox is VirtualBox... for better or worse.

    A mixed advantage / disadvantage is mapping files through NFS. In our setup, we created two sets of RC definitions - one that just download a docker image of our application servers; the other with 7 extra lines that set up file mapping from HostOS -> Vagrant -> VirtualBox -> CoreOS -> Kubernetes pod; overwriting the source code from the Docker image.

    The downside of this is NFS file cache - with it, it's problematic, without it, it's problematically slow. Even setting mount_options: 'nolock,vers=3,udp,noac' doesn't get rid of caching problems completely, but it works most of the time. Some Gulp tasks ran in a container can take 5 minutes when they take 8 seconds on host OS. A good compromise seems to be mount_options: 'nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15'.

    As for automatic code reload, that's language specific, but we're happy with Django's devserver for Python, and Nodemon for Node.js. For frontend projects, you can of course do a lot with something like gulp+browserSync+watch, but for many developers it's not difficult to serve from Apache and just do traditional hard refresh.

    We keep 4 sets of yaml files for Kubernetes. Dev, "devstable", stage, prod. The differences between those are

    • env variables explicitly setting the environment (dev/stage/prod)
    • number of replicas
    • devstable, stage, prod uses docker images
    • dev uses docker images, and maps NFS folder with source code over them.

    It's very useful to create a lot of bash aliases and autocomplete - I can just type rec users and it will do kubectl delete -f ... ; kubectl create -f .... If I want the whole set up started, I type recfo, and it recreates a dozen services, pulling the latest docker images, importing the latest db dump from Staging env and cleaning up old Docker files to save space.

    0 讨论(0)
提交回复
热议问题