<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Ed Lee on Medium]]></title>
        <description><![CDATA[Stories by Ed Lee on Medium]]></description>
        <link>https://medium.com/@ed_lee?source=rss-d98c48f65518------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*bclxImOcxkNVtON2ULjaeg.png</url>
            <title>Stories by Ed Lee on Medium</title>
            <link>https://medium.com/@ed_lee?source=rss-d98c48f65518------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 18:11:42 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ed_lee/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Thank you for using and contributing to Argo and participating in the Argo Community!]]></title>
            <link>https://blog.argoproj.io/thank-you-for-using-and-contributing-to-argo-and-participating-in-the-argo-community-dd3dde8b8a97?source=rss-d98c48f65518------2</link>
            <guid isPermaLink="false">https://medium.com/p/dd3dde8b8a97</guid>
            <dc:creator><![CDATA[Ed Lee]]></dc:creator>
            <pubDate>Fri, 09 Nov 2018 19:09:38 GMT</pubDate>
            <atom:updated>2018-11-23T19:50:33.129Z</atom:updated>
            <content:encoded><![CDATA[<p>Thank you for using and contributing to <a href="https://github.com/argoproj/argo">Argo</a> and participating in the <a href="https://join.slack.com/t/argoproj/shared_invite/enQtMzExODU3MzIyNjYzLTA5MTFjNjI0Nzg3NzNiMDZiNmRiODM4Y2M1NWQxOGYzMzZkNTc1YWVkYTZkNzdlNmYyZjMxNWI3NjY2MDc1MzI">Argo Community</a>!</p><p><strong>Some recent news to share with you.</strong></p><p><a href="https://eksworkshop.com/batch/">AWS EKS Workshop</a> now discusses using Argo for batch processing applications with Kubernetes.</p><p>Google has recently launched <a href="https://cloud.google.com/blog/products/ai-machine-learning/introducing-ai-hub-and-kubeflow-pipelines-making-ai-simpler-faster-and-more-useful-for-businesses">Kubeflow Pipelines</a> which <a href="https://github.com/kubeflow/pipelines#acknowledgments">uses Argo</a> to orchestrate Kubernetes resources!</p><p>There is a complete <a href="https://github.com/kubeflow/examples/tree/master/mnist">end-to-end example</a> of training and running an MNIST ML model using Argo to orchestrate workflows.</p><p>Another <a href="https://github.com/kubeflow/example-seldon">end-to-end example</a> using Argo from <a href="https://www.seldon.io/">Seldon</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dd3dde8b8a97" width="1" height="1" alt=""><hr><p><a href="https://blog.argoproj.io/thank-you-for-using-and-contributing-to-argo-and-participating-in-the-argo-community-dd3dde8b8a97">Thank you for using and contributing to Argo and participating in the Argo Community!</a> was originally published in <a href="https://blog.argoproj.io/">Argo Project</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Argo workflow demo at the Kubernetes Community Meeting]]></title>
            <link>https://blog.argoproj.io/argo-workflow-demo-at-the-kubernetes-community-meeting-c428c3c93f9d?source=rss-d98c48f65518------2</link>
            <guid isPermaLink="false">https://medium.com/p/c428c3c93f9d</guid>
            <category><![CDATA[continuous-testing]]></category>
            <category><![CDATA[workflow-automation]]></category>
            <category><![CDATA[continuous-integration]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[docker]]></category>
            <dc:creator><![CDATA[Ed Lee]]></dc:creator>
            <pubDate>Tue, 19 Sep 2017 13:31:12 GMT</pubDate>
            <atom:updated>2018-11-13T02:23:55.692Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ac8YxziIjGAqk63s0pQ_5Q.jpeg" /></figure><p><strong>Note: This is for an older version of Argo. For the latest information please check out the argoproj GitHub repo: </strong><a href="https://github.com/argoproj/argo">https://github.com/argoproj/argo</a><br><strong>and the recent TGIK demo of Argo by Joe Beda:<br></strong><a href="https://www.youtube.com/watch?v=M_rxPPLG8pU&amp;start=859">https://www.youtube.com/watch?v=M_rxPPLG8pU&amp;start=859</a></p><p>This post walks through the <a href="https://argoproj.github.io/">Argo</a> demo we showed at the Kubernetes Community meeting on September 14th.</p><p>The demo showed how to quickly create and run Argo workflows from the command line. We also showed how Argo artifacts and fixtures increase the power and usefulness of container native workflows on Kubernetes.</p><p>We’d like to thank everyone for their feedback and encouragement! If you missed the meeting, here are the relevant links.</p><ul><li><a href="https://docs.google.com/document/d/1VQDIAB0OqiSjIHI8AWMvSdceWhnz56jNpZrLs6o7NJY/edit?ts=5991e4a6#heading=h.en8cy6hno0c6">Kubernetes Community Meeting Working Doc</a></li><li><a href="https://www.youtube.com/watch?v=LRDoKOLOlf8&amp;feature=youtu.be&amp;t=141">Meeting recording</a> (the demo starts at 1 min 30 seconds)</li><li><a href="https://github.com/argoproj/argo">https://github.com/argoproj/argo</a></li></ul><h4>Demo walkthrough</h4><p>We forked the influxdb GitHub project and added a .argo directory with a few Argo templates.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/11b47ca46037c62807e7ff65c72b6e39/href">https://medium.com/media/11b47ca46037c62807e7ff65c72b6e39/href</a></iframe><p>An Argo workflow template has three main sections:</p><ul><li>Header</li><li>Inputs and outputs</li><li>Steps</li></ul><p>In our demo, we run a workflow called InfluxDB CI that does continuous integration forinfluxdb. It has two input parameters COMMIT, which is the commit ID to build, and REPO which is a URL to our forked GitHub repo. Note that the default values of these parameters are set to %%session.xxx%% This means that the values will be filled in based on the session that initiates the workflow. Usually, sessions are initiated from the CLI, GUI, or an event trigger.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/519e78e0cebae8a4cbe6c2b18e28fe8c/href">https://medium.com/media/519e78e0cebae8a4cbe6c2b18e28fe8c/href</a></iframe><p>In the above, the InfluxDB CI workflow consists of four steps: CHECKOUT,INFLUXDB-BUILD, INFLUXDB-TEST-UNIT, andINFLUXDB-TEST-E2E. Steps that are listed as a part of the same YAML array, denoted with the — symbol, are run in parallel, e.g. the INFLUXDB-BUILD and INFLUXDB-TEST-UNIT steps above.</p><p>Note the use of artifacts to pass the output of one step as input arguments to a subsequent step. I find it useful to read the artifact references from right to left, so %%steps.CHECKOUT.outputs.artifacts.CODE%% can be read as the CODE artifact that is generated as an output of the CHECKOUT step.</p><p>Let’s take a look at the INFLUXDB-BUILD step which invokes the influxdb-build template in more detail.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3f32a091e94b29b9d8cacf65605fcc5e/href">https://medium.com/media/3f32a091e94b29b9d8cacf65605fcc5e/href</a></iframe><p>The influxdb-build template has one input which is the CODE artifact and generates one output, which is the INFLUXD artifact. The input artifact will be placed at the path /go/src/github.com/infuxdata/influxdb and the output artifact, which is simply the InfluxDB binary built by the template, will be found at /go/bin/influxd. The template uses the golang:1.8.3 image from DockerHub to perform the build.</p><p>Now let’s see how fixtures work look at theINFLUXDB-TEST_E2E step which uses the influxdb-test-e2e template.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/398ed21c76ca4df80a8962866b33ad7d/href">https://medium.com/media/398ed21c76ca4df80a8962866b33ad7d/href</a></iframe><p>The influxdb-test-e2e template has one input artifact called INFLUXD. Note that this artifact is not mapped to any directory path in this template because the artifact is simply passed to other steps in the workflow and is not actually consumed by the workflow itself.</p><p>The workflow declares a fixture called INFLUXDB by running the influxdb-server template. By declaring the influxdb-server template as a fixture, we ensure that the InfluxDB server will be started before running the workflow steps and will be destroyed once the workflow is finished. Think of it as a convenient way to manage the lifecycle of services needed during the running of a workflow. Note that we can refer to attributes of the fixture such as it’s IP address (e.g.%%fixtures.INFLUXDB.ip%%) from steps in the workflow.</p><p>Let’s take a look at the influxdb-server template to see how it is implemented.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e260ac81baa370ac090081b5ce237187/href">https://medium.com/media/e260ac81baa370ac090081b5ce237187/href</a></iframe><p>Well, that was anti-climactic! All it does is run the INFLUXD artifact that we already built using a debian DockerHub image :-)</p><p>Ok, now that we’ve seen what an Argo workflow looks like, let’s run it using the following Argo CLI commands.</p><ul><li>argo job submit</li><li>argo job list</li><li>argo job show</li><li>argo job logs</li></ul><p>Here we go!</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c0f77b4ed08feef5bc7a9ff6d45aecdd/href">https://medium.com/media/c0f77b4ed08feef5bc7a9ff6d45aecdd/href</a></iframe><p>Something I really like about Argo is that if your project repo is public, you don’t even need to “add” the repo to Argo. You can just fork the public repo, add a .argo directory and then start running workflows without doing any additional configuration. By using the --local flag with the argo job submit command, you don’t even have to commit your changes. The local copy of templates from the .argo directory will be used instead of the committed copy. This avoids cluttering your repo with useless intermediate commits while you are debugging your workflow.</p><p>Finally, note the http link highlighted in the above example. If you click on the link, it will open a job status page in your web browser.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*o8HI-OeR0qZVHelGsR1elw.png" /><figcaption>Argo UI showing workflows details including the inline access to YAML definitions</figcaption></figure><p>From the job status page, you can see a realtime graphical display of your running workflow, browse the YAML for each step, download logs and artifacts, and even shell (e.g.sh or bash) into running steps.</p><p>One last thing, if you click on the Job Summary, you will see some stats for the job including how much it cost to run the job! I’ve heard people say that developers don’t care how much things cost but I find it very useful for optimizing workflows and getting code to run efficiently.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZzGoOFnIDhkLZlEmEvG4Ng.png" /></figure><p>If you’ve read all the way to the end, thank you! Please give Argo a <a href="https://github.com/argoproj/argo/blob/master/demo.md">try</a> and here is a <a href="https://www.youtube.com/watch?v=LRDoKOLOlf8&amp;feature=youtu.be&amp;t=141">video</a> of the demo (starts at 1 min 30 seconds)</p><p><a href="https://medium.com/u/d98c48f65518"><em>Ed Lee</em></a><em> is a cofounder of </em><a href="https://www.applatix.com/"><em>Applatix</em></a><em>, a startup committed to helping users realize the value of containers and Kubernetes in their day-to-day work.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c428c3c93f9d" width="1" height="1" alt=""><hr><p><a href="https://blog.argoproj.io/argo-workflow-demo-at-the-kubernetes-community-meeting-c428c3c93f9d">Argo workflow demo at the Kubernetes Community Meeting</a> was originally published in <a href="https://blog.argoproj.io/">Argo Project</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The need for a container-native workflow engine]]></title>
            <link>https://blog.argoproj.io/the-need-for-a-container-native-workflow-engine-4d99f0c5e78e?source=rss-d98c48f65518------2</link>
            <guid isPermaLink="false">https://medium.com/p/4d99f0c5e78e</guid>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[workflow-automation]]></category>
            <category><![CDATA[puppet]]></category>
            <category><![CDATA[docker]]></category>
            <dc:creator><![CDATA[Ed Lee]]></dc:creator>
            <pubDate>Wed, 06 Sep 2017 13:52:14 GMT</pubDate>
            <atom:updated>2018-03-17T01:22:50.040Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_z6K0v2SvBINFuFzWhAHQA.jpeg" /></figure><p>Argo is an open source container-native workflow engine for Kubernetes. <a href="https://github.com/argoproj/argo/blob/master/README.md">Argo</a> makes it easy to specify, schedule, and coordinate the running of workflows and applications on Kubernetes. It implements each step in a workflow as a container and provides simple and flexible mechanisms for specifying constraints between the steps in a workflow as well as artifact management for linking the outputs of one step as inputs to subsequent steps.</p><p>Argo was born out of frustration in automating our daily work for both development and deployments. Learning unfamiliar APIs to automate infrastructure, writing ad-hoc scripts for repetitive tasks, asking and in some cases waiting for operations teams to update needed services, and all the while feeling frustrated that even small improvements required disproportionate investments of time and effort.</p><p>When we first started experimenting with containers a few years ago, we saw its potential to simplify this entire process. Unlike VMs, containers provide lightweight and reliable packaging of the execution environment and application together in a portable self-contained image. Moreover, a container image can be reliably generated from source code (e.g. Dockerfile). By designing the entire system including workflows around containers, one creates a complete source-controlled system for getting work done.</p><p>One could achieve something similar by using an existing continuous integration framework like Jenkins, putting your build scripts under source control, and then using something like Chef/Puppet recipes for managing the infrastructure that will run your recipes. This is quite feasible, but requires configuring and integrating multiple independent tools and the result will not be as flexible or lightweight as a container-native solution.</p><p>Although container-based workflows by itself can be used to perform some simple tasks, most interesting jobs will require passing the output of one step as input to subsequent steps. This is where Argo’s artifact management comes in. It makes it very simple to manage the flow of artifacts as inputs and outputs between stages.</p><p>Alternatively, one can use an external artifact repository such as Nexus or Artifactory, but that is another tool to integrate and you would have to create your own system for naming and garbage collecting the artifacts. Tasks that are handled automatically by Argo. Moreover, much of your efforts in carefully naming and managing your artifacts would be short-lived given that most artifacts are transient and are not needed beyond the scope of the workflow in which they are generated and used.</p><p>Moreover, workflows that depend on external tools will be less portable because of variations in how the external tools are configured and managed from one system to another.</p><p>An integrated workflow system also requires several other related features for getting useful work done, especially at scale, with stability and good performance.</p><ol><li>Admission control is an important element to ensure system stability and availability. Argo has integrated admission control mechanisms so that the core container orchestration engine (i.e. Kubernetes) is not overloaded and that workflows are admitted and serviced in a “fair” manner. Without admission control, under heavy load, the Kubernetes system itself can become unresponsive and unstable.</li><li>Ability to run containerized workloads on a container-based infrastructure. It it is very common to want to run Docker commands from inside another container. Being able to do this reliably, with good performance and isolation requires carefully crafting a solution. Argo has built-in functionality to support called <a href="https://applatix.com/case-docker-docker-kubernetes-part/">Docker-in-Docker</a> (DinD) reliably at scale.</li><li>Often, steps in a workflow require interacting with services that are either dynamically created during the execution of the workflow or exist statically in the external environment. For example, you can dynamically deploy a MySQL database or use an existing MySQL database as a fixture and then access the database during the execution a workflow for testing or other purposes. Argo provides an integrated way to specify, spin up, pool, use, and destroy external services to provide a way to get real stuff done with workflows.</li></ol><p>Argo makes it simple to specify and run complex workflows with artifacts and other features needed to get useful work done, all via simple YAML definitions. Each step in an Argo workflow is a container that can be generated from source code (e.g. Dockerfile). The entire system can be specified as source code and becomes portable from one Argo system to another.</p><p>Argo has been a labor of love - we built something we needed to do our own work that we think addresses a need shared by other developers. We hope Argo can be useful to you and we welcome your feedback on <a href="https://github.com/argoproj/argo/blob/master/README.md">Argo</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4d99f0c5e78e" width="1" height="1" alt=""><hr><p><a href="https://blog.argoproj.io/the-need-for-a-container-native-workflow-engine-4d99f0c5e78e">The need for a container-native workflow engine</a> was originally published in <a href="https://blog.argoproj.io/">Argo Project</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>