WEBVTT

00:00:00.590 --> 00:00:04.575
>> Hey, welcome to the Cloud
Native Show at Microsoft Ignite.

00:00:04.575 --> 00:00:06.960
I ran into Ralph
Squillace, and he was

00:00:06.960 --> 00:00:09.495
talking about Cloud Native
application bundling.

00:00:09.495 --> 00:00:12.540
There's a lot going on here
about Cloud Native Applications.

00:00:12.540 --> 00:00:14.550
I'm going to go find Ralph,
and we're going to talk about

00:00:14.550 --> 00:00:19.950
this brand new tool. Hey,
Ralph. How is it going?

00:00:19.950 --> 00:00:21.645
>> Hey, Shane. Good to see you.

00:00:21.645 --> 00:00:23.430
>> Good. I just saw
your talk on CNAB.

00:00:23.430 --> 00:00:25.050
>> I'm glad that's done,

00:00:25.050 --> 00:00:26.310
but it went really well, I thought.

00:00:26.310 --> 00:00:28.440
>> Good. You know what, I've
got a spot down the hall,

00:00:28.440 --> 00:00:30.090
why don't we go have a seat
and talk some more about it.

00:00:30.090 --> 00:00:30.750
>> Yeah. I'd love to do it.

00:00:30.750 --> 00:00:30.930
>> Cool.

00:00:30.930 --> 00:00:51.780
[MUSIC]

00:00:51.780 --> 00:00:55.930
All right, Ralph. So I saw
your presentation on CNAB.

00:00:56.150 --> 00:00:58.250
I'm looking at this, and I'm

00:00:58.250 --> 00:01:02.240
asking what problems are we trying
to solve with this new tool?

00:01:02.240 --> 00:01:03.740
So can you give me an idea what it

00:01:03.740 --> 00:01:05.900
is and what are we trying
to solve with this thing?

00:01:05.900 --> 00:01:09.020
>> So remember this is
the Cloud Native Show.

00:01:09.020 --> 00:01:09.635
>> Yeah.

00:01:09.635 --> 00:01:11.510
>> Remember that we're
talking about Cloud Native.

00:01:11.510 --> 00:01:13.190
Now, it really means that

00:01:13.190 --> 00:01:17.120
these APIs are the things that we
use to move around our software,

00:01:17.120 --> 00:01:19.920
to build our infrastructure,
and so forth.

00:01:20.140 --> 00:01:23.060
You're a developer, if I gave you

00:01:23.060 --> 00:01:25.430
the ability to build this
thing or that thing,

00:01:25.430 --> 00:01:27.470
but with a program, what
are you going to do?

00:01:27.470 --> 00:01:29.450
You're going to start creating
millions of that stuff.

00:01:29.450 --> 00:01:31.250
Why? Because you can,

00:01:31.250 --> 00:01:34.340
and it turns out that that lets
you build really complex things,

00:01:34.340 --> 00:01:36.335
microservices and so forth.

00:01:36.335 --> 00:01:38.360
That's really all well and good.

00:01:38.360 --> 00:01:40.010
But now you've got functions,

00:01:40.010 --> 00:01:42.200
not just Kubernetes,
which is the hot thing,

00:01:42.200 --> 00:01:43.700
but you've got functions and

00:01:43.700 --> 00:01:45.810
serverless and you've got
to set up some storage,

00:01:45.810 --> 00:01:47.720
and your storage might
not actually be in

00:01:47.720 --> 00:01:49.925
the same place that
your execution is,

00:01:49.925 --> 00:01:52.579
multiple planes of control,

00:01:52.579 --> 00:01:54.590
multiple APIs and tools.

00:01:54.590 --> 00:01:59.090
Now, the difficulty is not
necessarily assembling your app.

00:01:59.090 --> 00:02:00.620
What if you want to sell that app,

00:02:00.620 --> 00:02:03.785
what if you want to give it to
somebody else, how do you do that?

00:02:03.785 --> 00:02:06.905
The README is nine miles long.

00:02:06.905 --> 00:02:10.895
Is your virtual environment
exactly the same as theirs?

00:02:10.895 --> 00:02:13.160
All of a sudden, it's
your work, your brain

00:02:13.160 --> 00:02:16.525
or knowledge that needs to be
shipped to them in a package.

00:02:16.525 --> 00:02:16.915
>> Sure.

00:02:16.915 --> 00:02:18.055
>> That's where CNAB,

00:02:18.055 --> 00:02:20.215
Cloud Native Application
Bundles, comes in.

00:02:20.215 --> 00:02:23.170
You're going to need a tool to
do that, and that's Porter.

00:02:23.170 --> 00:02:27.125
The specification that describes
how to do this is CNAB.

00:02:27.125 --> 00:02:29.180
>> So as I understand it,

00:02:29.180 --> 00:02:31.565
maybe I can simplify it
for the audience is,

00:02:31.565 --> 00:02:35.630
this is an MSI for my
distributed applications.

00:02:35.630 --> 00:02:38.150
>> Yeah. If you're in
the Windows environment

00:02:38.150 --> 00:02:40.115
because you've been
there for a long time.

00:02:40.115 --> 00:02:40.345
>> Yeah.

00:02:40.345 --> 00:02:42.585
>> You think MSI for the Cloud.

00:02:42.585 --> 00:02:44.780
>> This is open source,
anybody can use it.

00:02:44.780 --> 00:02:47.060
It works on all the operating
systems and so forth.

00:02:47.060 --> 00:02:49.475
So it's not even MSI for one Cloud.

00:02:49.475 --> 00:02:50.015
>> Yeah.

00:02:50.015 --> 00:02:51.695
>> It's MSI for everything.

00:02:51.695 --> 00:02:53.075
If you're in the Linux world,

00:02:53.075 --> 00:02:55.385
it's a Dev or an RPM for the Cloud.

00:02:55.385 --> 00:02:55.670
>> Yeah.

00:02:55.670 --> 00:02:58.235
>> If you're in a Mac
world, it's a DMG.

00:02:58.235 --> 00:03:00.155
>> So I can understand
what you're saying.

00:03:00.155 --> 00:03:05.310
So recently I had a Kubernetes
cluster I had to set up.

00:03:05.310 --> 00:03:09.215
I had an application that
had 15 microservices on it.

00:03:09.215 --> 00:03:11.780
I did have some functions, and
I was in fact going through

00:03:11.780 --> 00:03:13.460
that README step by step by

00:03:13.460 --> 00:03:15.560
step, and I kept hitting
those roadblocks.

00:03:15.560 --> 00:03:15.930
>> Yeah.

00:03:15.930 --> 00:03:18.050
>> I didn't enable
such and such service

00:03:18.050 --> 00:03:20.525
on my cluster, start over.

00:03:20.525 --> 00:03:22.340
All of that failed, I had to rebuild

00:03:22.340 --> 00:03:23.900
my cluster, and it's frustrating.

00:03:23.900 --> 00:03:26.044
>> Yeah, and because the
README is very long,

00:03:26.044 --> 00:03:28.190
if you forgot something in step 2,

00:03:28.190 --> 00:03:30.980
the only way you can be certain
that you're going to do

00:03:30.980 --> 00:03:33.770
it again is to destroy everything
and start it from step 1.

00:03:33.770 --> 00:03:35.480
That's extremely frustrating.

00:03:35.480 --> 00:03:37.825
It's a waste of your time and energy.

00:03:37.825 --> 00:03:38.460
>> Yeah.

00:03:38.460 --> 00:03:40.890
>> So is this just a Microsoft thing?

00:03:40.890 --> 00:03:42.500
Are there other companies involved?

00:03:42.500 --> 00:03:44.210
>> No. So the specification is

00:03:44.210 --> 00:03:46.340
actually part of the
Linux Foundation.

00:03:46.340 --> 00:03:47.570
This is a little complex,

00:03:47.570 --> 00:03:49.130
but the Linux Foundation has

00:03:49.130 --> 00:03:51.740
a special foundation inside

00:03:51.740 --> 00:03:54.035
it called the Joint
Development Foundation.

00:03:54.035 --> 00:03:56.210
That's where companies
and communities can get

00:03:56.210 --> 00:03:59.270
together and write a specification
and have it publicly governed.

00:03:59.270 --> 00:04:02.390
The CNAB specification is part of

00:04:02.390 --> 00:04:05.990
a CNAB project under
the JTF inside the LF,

00:04:05.990 --> 00:04:07.545
which means there's
foundations all the way down.

00:04:07.545 --> 00:04:07.905
>> True.

00:04:07.905 --> 00:04:10.780
>> But it's a publicly-governed
specification.

00:04:10.780 --> 00:04:17.075
Intel is there, Datadog is
there, Docker is there.

00:04:17.075 --> 00:04:18.020
>> HashiCorp.

00:04:18.020 --> 00:04:20.540
>> HashiCorp, NYU,

00:04:20.540 --> 00:04:23.030
a whole bunch of collaborators
in addition to Microsoft.

00:04:23.030 --> 00:04:25.220
>> We're all working together with
them in order to create this.

00:04:25.220 --> 00:04:26.660
>> So for example, Docker app is

00:04:26.660 --> 00:04:28.715
a CNAB compliant PEP tool as well.

00:04:28.715 --> 00:04:31.235
If you build an app with Docker app,

00:04:31.235 --> 00:04:32.660
Porter can install it.

00:04:32.660 --> 00:04:34.250
If you build an app with Porter,

00:04:34.250 --> 00:04:35.740
Docker app can install it.

00:04:35.740 --> 00:04:38.090
>> Porter is the CLI
that we've created in

00:04:38.090 --> 00:04:41.370
order to work with the specification.

00:04:41.370 --> 00:04:42.430
>> Yes, that's right.

00:04:42.430 --> 00:04:42.695
>> All right.

00:04:42.695 --> 00:04:43.805
>> So when you think of it,

00:04:43.805 --> 00:04:47.450
it's easy to talk about CNAB as
a thing that you need to know.

00:04:47.450 --> 00:04:48.630
You actually don't need to know.

00:04:48.630 --> 00:04:50.980
What you want is the tool,
you want the experience.

00:04:50.980 --> 00:04:52.220
If you're an engineer,

00:04:52.220 --> 00:04:54.465
you'll eventually get into
the specification itself.

00:04:54.465 --> 00:04:58.700
>> So when I think about deploying
distributed applications,

00:04:58.700 --> 00:05:00.440
now put aside maybe some of

00:05:00.440 --> 00:05:02.390
the other infrastructure
pieces like serverless

00:05:02.390 --> 00:05:04.805
because I'm going to go set
that up maybe on my own.

00:05:04.805 --> 00:05:06.860
I have spent a lot of time and energy

00:05:06.860 --> 00:05:09.440
learning Compose and
before that, it was

00:05:09.440 --> 00:05:11.930
Swarm, and now, we're talking
about Kubernetes, and I'm

00:05:11.930 --> 00:05:14.540
learning Helm charts
and all of these tools,

00:05:14.540 --> 00:05:16.730
so how does this differ from
something like Compose?

00:05:16.730 --> 00:05:18.934
Because I can put together

00:05:18.934 --> 00:05:22.265
15 services and I go,
''Docker-compose Up'',

00:05:22.265 --> 00:05:25.435
or if I have Kubernetes,
I can just say,

00:05:25.435 --> 00:05:27.320
''Apply'', and pass all of

00:05:27.320 --> 00:05:30.890
my deployment files and my service
files and that happens for me.

00:05:30.890 --> 00:05:34.200
How does that differ from
something like that?

00:05:34.610 --> 00:05:39.230
>> This is really everything
that you've been using that is

00:05:39.230 --> 00:05:43.415
necessary to put together
something in a single container.

00:05:43.415 --> 00:05:45.590
It actually isn't different.

00:05:45.590 --> 00:05:49.430
So for example, I can show
you where there's a bundle,

00:05:49.430 --> 00:05:51.770
where we have Helm Charts, Terraform,

00:05:51.770 --> 00:05:55.220
a custom binary that does some
custom thing, those special items.

00:05:55.220 --> 00:05:58.415
For example, it could be
Docker Compose inside there.

00:05:58.415 --> 00:06:02.170
The difference is that Docker
Compose is a specific runtime.

00:06:02.170 --> 00:06:03.860
What else do you have to do once

00:06:03.860 --> 00:06:05.525
you've got your services
up and running?

00:06:05.525 --> 00:06:05.999
>> Oh, I see.

00:06:05.999 --> 00:06:08.570
>> So typically, you would
then do your Docker Compose,

00:06:08.570 --> 00:06:13.775
your Docker app with a Compose
file, that would all work.

00:06:13.775 --> 00:06:15.470
But then you're going to
have to run a PowerShell

00:06:15.470 --> 00:06:16.670
script to do something else.

00:06:16.670 --> 00:06:18.050
Maybe configure a CDN,

00:06:18.050 --> 00:06:19.730
maybe you do something in ARM,

00:06:19.730 --> 00:06:21.500
maybe do something in Cloudflare.

00:06:21.500 --> 00:06:23.270
>> Set some AD permissioning,
something like that.

00:06:23.270 --> 00:06:24.410
>> Exactly, you're going to have to

00:06:24.410 --> 00:06:26.450
configure the app at very least.

00:06:26.450 --> 00:06:32.029
Now, that step's already done.

00:06:32.029 --> 00:06:36.320
What you do here is Porter helps
you put the entire process

00:06:36.320 --> 00:06:38.060
in a bundle, and then you can just

00:06:38.060 --> 00:06:40.385
Docker pull, Docker
push metaphorically.

00:06:40.385 --> 00:06:43.835
It's Porter install,
Porter uninstall.

00:06:43.835 --> 00:06:46.190
But you can just do that from a URL.

00:06:46.190 --> 00:06:46.505
>> I see.

00:06:46.505 --> 00:06:47.630
>> I can show you.

00:06:47.630 --> 00:06:49.550
>> We'll get to that.
I'd love to see a demo.

00:06:49.550 --> 00:06:51.170
I just have a few more
questions around that

00:06:51.170 --> 00:06:54.155
because this is yet another tool.

00:06:54.155 --> 00:06:56.750
It sounds like all of the things

00:06:56.750 --> 00:06:59.000
that this specification provides and

00:06:59.000 --> 00:07:03.335
Porter might provide sounds like
something me as a developer,

00:07:03.335 --> 00:07:06.905
I might want to hand over
to my Ops team and say,

00:07:06.905 --> 00:07:08.195
''This is your problem.''

00:07:08.195 --> 00:07:10.160
Because as a developer,

00:07:10.160 --> 00:07:12.650
I want to just write
code and checking

00:07:12.650 --> 00:07:14.630
in and have something
else handle that process,

00:07:14.630 --> 00:07:15.890
like a CI/CD process.

00:07:15.890 --> 00:07:16.355
>> Sure.

00:07:16.355 --> 00:07:19.760
>> I remember the first
time I did Docker,

00:07:19.760 --> 00:07:20.990
I did Docker build,

00:07:20.990 --> 00:07:23.135
Docker run, and I was like,
''Man, that's magic.''

00:07:23.135 --> 00:07:23.690
>> Yeah.

00:07:23.690 --> 00:07:25.970
>> Is this another one of

00:07:25.970 --> 00:07:27.710
the just another tool that I

00:07:27.710 --> 00:07:30.475
might use for a while, and
it's going to go away?

00:07:30.475 --> 00:07:33.285
I'm asking a lot of questions,
maybe in one question.

00:07:33.285 --> 00:07:36.540
But this is a concern that I have is,

00:07:36.540 --> 00:07:38.025
''Man this is a cool tool,

00:07:38.025 --> 00:07:40.085
I'm going to go use it and then

00:07:40.085 --> 00:07:42.995
maybe it's only for my
Dev test inner loop.''

00:07:42.995 --> 00:07:44.900
Is this a production tool for me or

00:07:44.900 --> 00:07:46.610
is this a production
tool for my Ops team?

00:07:46.610 --> 00:07:48.560
>> The answer is, it might be all of

00:07:48.560 --> 00:07:50.790
these because tools are just tools.

00:07:50.790 --> 00:07:51.905
You're an engineer.

00:07:51.905 --> 00:07:54.050
Look at the tools with some degree of

00:07:54.050 --> 00:07:57.065
skepticism because you were the
one that gets to make a decision.

00:07:57.065 --> 00:07:59.995
Well, let's take an example
from a developer standpoint.

00:07:59.995 --> 00:08:01.430
I built this application,

00:08:01.430 --> 00:08:02.690
or you built your application,

00:08:02.690 --> 00:08:05.150
your Docker Swarm
application, for example.

00:08:05.150 --> 00:08:07.460
But you're going to
give that off, and you

00:08:07.460 --> 00:08:09.680
have to write the
README for somebody.

00:08:09.680 --> 00:08:10.490
>> Sure.

00:08:10.490 --> 00:08:12.170
>> Once they take that README,

00:08:12.170 --> 00:08:14.090
they're going to want
to automate that.

00:08:14.090 --> 00:08:17.000
Porter allows you to do that,

00:08:17.000 --> 00:08:19.850
but it allows other people
to do that for you by taking

00:08:19.850 --> 00:08:22.700
a README and putting it in
a structured YAML file.

00:08:22.700 --> 00:08:24.470
They don't actually have to write

00:08:24.470 --> 00:08:27.975
the Bash script or the PowerShell
or any thing like that.

00:08:27.975 --> 00:08:30.855
Once they do it, it's now
parted of your CI/CD.

00:08:30.855 --> 00:08:33.155
Now, you yourself, the developer,

00:08:33.155 --> 00:08:36.260
you never touch Porter, and you
don't care, and that's fine.

00:08:36.260 --> 00:08:37.760
So from that perspective, it may be

00:08:37.760 --> 00:08:41.300
an Ops tool because
now that snapshot of

00:08:41.300 --> 00:08:44.810
that complex setup, and that
complex application is now

00:08:44.810 --> 00:08:46.760
immutable and can be

00:08:46.760 --> 00:08:48.830
transferred throughout
your automation system.

00:08:48.830 --> 00:08:51.140
It can be digitally signed,
it can be downloaded,

00:08:51.140 --> 00:08:54.365
put in a trusted registry
as an immutable entity.

00:08:54.365 --> 00:08:58.955
That's very useful for communicating
your ideas to someone else,

00:08:58.955 --> 00:09:00.725
even though you as a
developer didn't need it.

00:09:00.725 --> 00:09:02.330
But there are other places

00:09:02.330 --> 00:09:03.920
where it might be more
of a developer tool.

00:09:03.920 --> 00:09:06.320
So for example, if you're in
a small team or if you're in

00:09:06.320 --> 00:09:10.310
a department and you need to help
other people set up your stuff,

00:09:10.310 --> 00:09:12.230
you might actually create a bundle

00:09:12.230 --> 00:09:14.180
simply because it's
easy for you to do and

00:09:14.180 --> 00:09:17.960
give to somebody else, and now
those people don't have to learn.

00:09:17.960 --> 00:09:18.560
>> I see.

00:09:18.560 --> 00:09:21.469
>> Your brain, in order
to use your application,

00:09:21.469 --> 00:09:23.630
you can just say, ''Porter
install with a tag.''

00:09:23.630 --> 00:09:25.970
As long as they have
the proper credentials,

00:09:25.970 --> 00:09:29.795
it'll install exactly the same
way you built it to be installed.

00:09:29.795 --> 00:09:31.660
So really depends on your scenario.

00:09:31.660 --> 00:09:33.160
It's an infrastructure tool.

00:09:33.160 --> 00:09:37.510
>> I know with Helm charts
and obviously Docker files,

00:09:37.510 --> 00:09:39.890
Docker images, we have
a place to store those.

00:09:39.890 --> 00:09:44.530
We can share them across other
deployment places like registry.

00:09:44.530 --> 00:09:46.430
So I can put it in Azure
Container Registry,

00:09:46.430 --> 00:09:48.605
your Docker Hub, or even GitHub.

00:09:48.605 --> 00:09:51.170
Our CNAB bundles, are we able

00:09:51.170 --> 00:09:53.140
to put those in those types
of places to share them out?

00:09:53.140 --> 00:09:56.450
>> Yeah, exactly. So one of the
nice things about a specification,

00:09:56.450 --> 00:09:58.460
not only the OCI specification,

00:09:58.460 --> 00:10:00.365
for example, Docker images,

00:10:00.365 --> 00:10:05.300
is that a CNAB bundle and
it's internal workings.

00:10:05.300 --> 00:10:08.066
There's an installation
container by default.

00:10:08.066 --> 00:10:09.050
You can extend that,

00:10:09.050 --> 00:10:09.910
you can do other things.

00:10:09.910 --> 00:10:13.250
Those are all OCI images
by default in Porter.

00:10:13.250 --> 00:10:15.920
That means you can Porter publish to

00:10:15.920 --> 00:10:19.655
an OCI registry like Docker
Hub or a private one like ACR,

00:10:19.655 --> 00:10:21.540
or wherever you wish to do.

00:10:21.540 --> 00:10:24.555
You can even pull it off and
serialize it if you wish,

00:10:24.555 --> 00:10:26.750
bring it down to a local registry.

00:10:26.750 --> 00:10:29.810
They're just Docker images for
the purposes of distribution,

00:10:29.810 --> 00:10:31.520
which makes network effect

00:10:31.520 --> 00:10:34.400
now possible not just
with one Docker image,

00:10:34.400 --> 00:10:36.530
like one service, but in fact, with

00:10:36.530 --> 00:10:40.415
your entire application plus its
deployment and upgrade stack.

00:10:40.415 --> 00:10:43.670
That puts your brain in a container.

00:10:43.670 --> 00:10:46.100
That's why it's a
very useful tool for

00:10:46.100 --> 00:10:49.220
network effect as immutability
and distribution.

00:10:49.220 --> 00:10:52.380
>> Sure. So who benefits the
most from these bundles?

00:10:52.380 --> 00:10:55.070
Now, I'm going to maybe
answer my own question.

00:10:55.070 --> 00:10:55.715
>> Go for it.

00:10:55.715 --> 00:10:59.839
>> I'm going to go and think
about now on my READMEs,

00:10:59.839 --> 00:11:01.970
especially that last
application I just installed,

00:11:01.970 --> 00:11:03.365
all the services and go,

00:11:03.365 --> 00:11:06.290
''Hey, Mrs. or Mr.

00:11:06.290 --> 00:11:07.580
Engineer that you just told me to

00:11:07.580 --> 00:11:10.460
go through all these 15 step things,

00:11:10.460 --> 00:11:13.160
maybe you should go look at
this CNAB specification,

00:11:13.160 --> 00:11:15.140
use Porter, and build
out all the steps.

00:11:15.140 --> 00:11:16.595
I just have to click the button,

00:11:16.595 --> 00:11:21.280
or do Porter install or
whatever the command is.''

00:11:21.280 --> 00:11:23.180
I know that I'll benefit from it,

00:11:23.180 --> 00:11:24.785
from trying to deploy that,

00:11:24.785 --> 00:11:27.515
but is it also

00:11:27.515 --> 00:11:31.520
our customers who might want
to be using this application?

00:11:31.520 --> 00:11:34.160
So do we see this as
something we put in

00:11:34.160 --> 00:11:38.090
a marketplace where people can
pool our apps and deploy it.

00:11:38.090 --> 00:11:40.775
That's how we're going to build
these big distributable apps?

00:11:40.775 --> 00:11:43.280
>> Sure. You can imagine
that that would be very,

00:11:43.280 --> 00:11:44.660
very straightforward to do.

00:11:44.660 --> 00:11:46.580
In fact, we're talking with
the marketplace about how

00:11:46.580 --> 00:11:49.500
we might do that with
CNAB bundles right now.

00:11:50.790 --> 00:11:53.650
You could easily do that, of course,

00:11:53.650 --> 00:11:54.850
because it's an OCI image,

00:11:54.850 --> 00:11:57.880
it can be signed, it can be
trusted, you can scan it,

00:11:57.880 --> 00:12:00.010
you can validate it, and offer it on

00:12:00.010 --> 00:12:02.275
a marketplace and also
directly to your customers.

00:12:02.275 --> 00:12:02.725
>> Okay.

00:12:02.725 --> 00:12:05.230
>> What that does is, I
think I've tried to explain,

00:12:05.230 --> 00:12:06.460
is that it gives the customers

00:12:06.460 --> 00:12:10.975
a unified immutable install of
your particular brain every time.

00:12:10.975 --> 00:12:11.170
>> Right.

00:12:11.170 --> 00:12:12.565
>> That increases confidence,

00:12:12.565 --> 00:12:15.130
it reduces your support
costs and things like that.

00:12:15.130 --> 00:12:16.780
Whether you're in a
marketplace or whether you're

00:12:16.780 --> 00:12:19.570
doing customer work
directly, for example.

00:12:19.570 --> 00:12:19.930
>> Okay.

00:12:19.930 --> 00:12:22.630
>> But there are other little
teeny features that you can do.

00:12:22.630 --> 00:12:24.010
Remember, it's just a container,

00:12:24.010 --> 00:12:25.330
it has a specification.

00:12:25.330 --> 00:12:26.800
So for example, I can actually

00:12:26.800 --> 00:12:29.545
generate a GUI installer
for one of these things.

00:12:29.545 --> 00:12:33.580
So you can actually
give what seems like

00:12:33.580 --> 00:12:38.260
a visual MSI experience to a
purely Cloud-native bundle,

00:12:38.260 --> 00:12:40.810
to a customer that
really isn't an IT pro,

00:12:40.810 --> 00:12:42.970
but does need and has credential,

00:12:42.970 --> 00:12:44.935
does need to install one
and has credentials.

00:12:44.935 --> 00:12:48.685
I can actually just plug in a USB
key, metaphorically speaking.

00:12:48.685 --> 00:12:48.970
>> Right.

00:12:48.970 --> 00:12:50.650
>> Right. Launch an app

00:12:50.650 --> 00:12:52.960
and click "Install",
add their credentials.

00:12:52.960 --> 00:12:54.610
In those environments, suddenly, but

00:12:54.610 --> 00:12:56.440
bundle becomes in
addition to just being

00:12:56.440 --> 00:12:58.180
shareable and for your customers and

00:12:58.180 --> 00:13:00.655
trustable being in a
marketplace, for example.

00:13:00.655 --> 00:13:03.730
In those scenarios, you
become extremely flexible for

00:13:03.730 --> 00:13:06.190
a much wider array of
customers who don't

00:13:06.190 --> 00:13:08.755
have the technical level
of expertise that you do.

00:13:08.755 --> 00:13:11.314
>> Okay. Now, do you have a
quick demo we can run through?

00:13:11.314 --> 00:13:11.550
>> Yeah, sure.

00:13:11.550 --> 00:13:12.685
>> Maybe show me these symbol,

00:13:12.685 --> 00:13:14.860
show me what a bundle is and
how all of this stuff works?

00:13:14.860 --> 00:13:15.760
>> Yeah, absolutely.

00:13:15.760 --> 00:13:16.420
>> All right. Let's check that out.

00:13:16.420 --> 00:13:19.000
>> So if we're looking in here,

00:13:19.000 --> 00:13:21.160
the easiest thing to do,
we'll do a simple one.

00:13:21.160 --> 00:13:22.885
You can see that I've
already installed it,

00:13:22.885 --> 00:13:24.805
but I want to explain it first.

00:13:24.805 --> 00:13:27.700
So Porter gives you the
ability to grab a bundle

00:13:27.700 --> 00:13:30.655
and actually describe what you're
going to do with it, right?

00:13:30.655 --> 00:13:32.320
This is a pretty simple bundle.

00:13:32.320 --> 00:13:33.760
It's going to use Helm 3,

00:13:33.760 --> 00:13:36.670
which is the next version
of Helm that's out there.

00:13:36.670 --> 00:13:37.780
I think it should be

00:13:37.780 --> 00:13:40.450
released ready for
production is very shortly,

00:13:40.450 --> 00:13:41.875
and if you're not
using it, you should.

00:13:41.875 --> 00:13:42.115
>> Yeah.

00:13:42.115 --> 00:13:45.580
>> So we built a bundle
exercise Helm 3.

00:13:45.580 --> 00:13:48.970
Now, if you need to install this,

00:13:48.970 --> 00:13:52.525
you're going to actually have to
generate some credentials, right?

00:13:52.525 --> 00:13:54.790
I've already got one. You
can see Helm 3 there.

00:13:54.790 --> 00:13:59.020
But you do that by
going creds generate,

00:13:59.020 --> 00:14:01.510
and you can see you can
just look at the tag.

00:14:01.510 --> 00:14:03.295
I don't have to install this.

00:14:03.295 --> 00:14:05.965
I can just point at the
image just like Docker.

00:14:05.965 --> 00:14:06.760
>> Okay.

00:14:06.760 --> 00:14:08.320
>> It'll go ahead and walk through.

00:14:08.320 --> 00:14:10.090
You can actually set

00:14:10.090 --> 00:14:13.735
a specific value, or you can
pull the value from a variable.

00:14:13.735 --> 00:14:15.820
In this case, I've
already used a file path,

00:14:15.820 --> 00:14:19.520
my cube config because that's
all I'm using right now.

00:14:19.530 --> 00:14:22.000
We'll give this up near the top.

00:14:22.000 --> 00:14:24.820
So to install, you can
see that I'm on the

00:14:24.820 --> 00:14:27.940
right specifying my particular
set of credentials,

00:14:27.940 --> 00:14:29.920
which means I can use the
same image to install in

00:14:29.920 --> 00:14:33.025
multiple different configuration
environments, right?

00:14:33.025 --> 00:14:35.170
All I'm passing is a cube config.

00:14:35.170 --> 00:14:36.580
That's how that works, okay?

00:14:36.580 --> 00:14:37.225
>> All right.

00:14:37.225 --> 00:14:40.210
>> Now, this is pretty
simple example, right?

00:14:40.210 --> 00:14:42.250
You notice that it's done

00:14:42.250 --> 00:14:44.320
several things that you
wouldn't normally do.

00:14:44.320 --> 00:14:46.060
It's already listed the releases,

00:14:46.060 --> 00:14:49.270
we don't have any, and then
it's added a custom repo.

00:14:49.270 --> 00:14:51.160
So we've done two steps already.

00:14:51.160 --> 00:14:53.995
Once the repo is installed,

00:14:53.995 --> 00:14:57.865
it's now installing the
Azure voting app, right?

00:14:57.865 --> 00:15:00.670
If the Wi-Fi is working, we'll wait.

00:15:00.670 --> 00:15:02.290
Once this comes back,

00:15:02.290 --> 00:15:03.880
we can now look at the cluster and

00:15:03.880 --> 00:15:05.770
see if it's been installed, right?

00:15:05.770 --> 00:15:06.120
>> I see.

00:15:06.120 --> 00:15:08.245
>> It should actually be.

00:15:08.245 --> 00:15:10.765
We can go over here, up there it is.

00:15:10.765 --> 00:15:13.810
In fact, we could go
and see the IP if we

00:15:13.810 --> 00:15:15.340
wanted to wait for low load balancer

00:15:15.340 --> 00:15:17.305
to open up, and we
can look at the app.

00:15:17.305 --> 00:15:20.695
You can now look at this right here.

00:15:20.695 --> 00:15:23.125
You can upgrade if you wish,

00:15:23.125 --> 00:15:25.375
and we'll go ahead and uninstall it

00:15:25.375 --> 00:15:27.865
just to show the easy workflow.

00:15:27.865 --> 00:15:30.310
>> I'm familiar with the voting
app as one of our examples

00:15:30.310 --> 00:15:32.590
that we have out on the Azure Repos.

00:15:32.590 --> 00:15:35.650
>> This is in fact the same voting
app from Azure samples, right?

00:15:35.650 --> 00:15:35.880
>> Yeah.

00:15:35.880 --> 00:15:37.210
>> So that's the same one.

00:15:37.210 --> 00:15:40.510
Now, that's a pretty
straightforward app, okay?

00:15:40.510 --> 00:15:42.520
There we go. It's unreachable.

00:15:42.520 --> 00:15:43.870
This is a Wi-Fi problem.

00:15:43.870 --> 00:15:45.820
I love conferences, don't you?

00:15:45.820 --> 00:15:49.060
All right. You'll notice just to show

00:15:49.060 --> 00:15:53.980
you that we still have our
hello-helm instance here.

00:15:53.980 --> 00:15:56.785
When we get Wi-Fi back,

00:15:56.785 --> 00:15:58.390
we can go ahead and
uninstall it again.

00:15:58.390 --> 00:15:58.705
>> Sure.

00:15:58.705 --> 00:16:01.015
>> Right? If we do that,

00:16:01.015 --> 00:16:03.864
let's look at a little
bit more complex example.

00:16:03.864 --> 00:16:06.370
One of the other features I can

00:16:06.370 --> 00:16:09.220
do is I can actually
copy this somewhere.

00:16:09.220 --> 00:16:10.450
Here, we have a bundle.

00:16:10.450 --> 00:16:13.360
If you've heard of our OAM and Dapper

00:16:13.360 --> 00:16:16.780
and Rudder open source projects
that have recently come out,

00:16:16.780 --> 00:16:18.250
here's a bundle that you can use.

00:16:18.250 --> 00:16:20.530
It installs Rudder, okay?

00:16:20.530 --> 00:16:22.855
I have a bundle for Dapper.

00:16:22.855 --> 00:16:25.450
Think about the README
for those projects.

00:16:25.450 --> 00:16:26.440
>> They're huge. Yeah.

00:16:26.440 --> 00:16:27.895
>> They're not actually that big.

00:16:27.895 --> 00:16:30.610
But because they describe all
the possible ways of doing it,

00:16:30.610 --> 00:16:32.815
you have to think about it first,

00:16:32.815 --> 00:16:34.360
make sure your environment's right.

00:16:34.360 --> 00:16:36.610
Here you just go
ahead and install it.

00:16:36.610 --> 00:16:39.010
It's already captured.
So that's the ease.

00:16:39.010 --> 00:16:41.125
But notice, I can copy this.

00:16:41.125 --> 00:16:44.755
So here, I've done
taken a public synapse,

00:16:44.755 --> 00:16:47.185
and this right-hand one could be ACR.

00:16:47.185 --> 00:16:51.085
So once I decide I have
a bundle that I like,

00:16:51.085 --> 00:16:53.170
I can actually pull it
into a private repo,

00:16:53.170 --> 00:16:56.725
the trusted repo, that can
put ACR scanning on that.

00:16:56.725 --> 00:16:58.480
I get geo-replication of it,

00:16:58.480 --> 00:17:01.780
all of those things that ACR
provides that I really want in

00:17:01.780 --> 00:17:05.275
addition to trusting that
that is my private registry.

00:17:05.275 --> 00:17:08.080
>> That's a good example
because I know that there

00:17:08.080 --> 00:17:10.960
might be multiple Docker
images that I've done before.

00:17:10.960 --> 00:17:12.040
I'm pulling them down,

00:17:12.040 --> 00:17:13.330
I'm tagging them myself,

00:17:13.330 --> 00:17:14.905
and then I'm pushing
them so that I've got

00:17:14.905 --> 00:17:18.100
these five-step motions that
I'm doing to take all of

00:17:18.100 --> 00:17:21.280
these large applications and
moving into my private place where

00:17:21.280 --> 00:17:24.490
these bundles have all of the steps
necessary in order to do that,

00:17:24.490 --> 00:17:25.930
now you've just
replicated them yourself.

00:17:25.930 --> 00:17:28.480
>> That's right. Before we go away,

00:17:28.480 --> 00:17:30.280
I want to actually show you something

00:17:30.280 --> 00:17:32.905
really pretty complex
that is more real-world.

00:17:32.905 --> 00:17:33.220
>> Okay.

00:17:33.220 --> 00:17:36.490
>> Okay. This is a bundle
that Jeremy Rickard,

00:17:36.490 --> 00:17:38.710
one of my developers,
wrote and published.

00:17:38.710 --> 00:17:41.830
You can install it. We ran
this demo at HashiConf.

00:17:41.830 --> 00:17:42.370
>> Okay.

00:17:42.370 --> 00:17:43.900
>> This bundle is interesting.

00:17:43.900 --> 00:17:48.175
You'll notice it uses
DigitalOcean in addition to AKS.

00:17:48.175 --> 00:17:51.010
This is a distributed
app across the Cloud.

00:17:51.010 --> 00:17:54.970
One of the things it
does is pretty complex.

00:17:54.970 --> 00:17:57.295
You'll notice we're using
Helm and Terraform.

00:17:57.295 --> 00:18:00.940
It first creates a bucket in

00:18:00.940 --> 00:18:05.590
DigitalOcean that's S3
compatible with a custom binary.

00:18:05.590 --> 00:18:07.600
We just dropped the binary in,

00:18:07.600 --> 00:18:10.855
now it's available to
be used from an exact,

00:18:10.855 --> 00:18:12.280
which is basically a
shell out command.

00:18:12.280 --> 00:18:13.030
>> Sure.

00:18:13.030 --> 00:18:16.795
>> You just copy the commands
that were in the README and

00:18:16.795 --> 00:18:18.880
add references to
whatever credentials

00:18:18.880 --> 00:18:20.845
you might need to make that work,

00:18:20.845 --> 00:18:23.455
and then we're going
to use Terraform.

00:18:23.455 --> 00:18:27.175
So now, we've got multiple steps,
different deployment tools.

00:18:27.175 --> 00:18:31.660
Synapse doesn't care, and your
user doesn't care either.

00:18:31.660 --> 00:18:34.120
They don't want to use your tools,

00:18:34.120 --> 00:18:35.875
they just want to use your app.

00:18:35.875 --> 00:18:37.340
>> That's correct.

00:18:37.710 --> 00:18:42.010
>> You can also specify some
outputs because we use Terraform to

00:18:42.010 --> 00:18:45.820
create a PostgreSQL
database in DigitalOcean.

00:18:45.820 --> 00:18:52.000
We're going to take those values
and create using Helm in AKS,

00:18:52.000 --> 00:18:55.210
a Helm chart that deploys
an app on top of them,

00:18:55.210 --> 00:18:57.070
that connects the DigitalOcean.

00:18:57.070 --> 00:19:00.650
>> So this is you really bundling

00:19:00.690 --> 00:19:03.895
creation deployment
tools inside of this?

00:19:03.895 --> 00:19:04.090
>> Yeah.

00:19:04.090 --> 00:19:06.280
>> That's why we are using
Terraform inside of this.

00:19:06.280 --> 00:19:09.340
Terraform actually does
infrastructure creation.

00:19:09.340 --> 00:19:11.260
>> Yeah. But it doesn't
do every infrastructure.

00:19:11.260 --> 00:19:11.380
>> Right.

00:19:11.380 --> 00:19:13.645
>> They got a great set
of modules and so forth.

00:19:13.645 --> 00:19:14.875
But look at this,

00:19:14.875 --> 00:19:17.470
does Terraform do my
little bash script?

00:19:17.470 --> 00:19:18.100
>> No, of course not.

00:19:18.100 --> 00:19:20.020
>> Or your PowerShell,
or whatever it might be,

00:19:20.020 --> 00:19:21.670
that little thing you need?

00:19:21.670 --> 00:19:22.075
>> Right.

00:19:22.075 --> 00:19:23.815
>> Drop it in, invoke it,

00:19:23.815 --> 00:19:25.210
pass a parameter here,

00:19:25.210 --> 00:19:27.609
we're passing a namespace,

00:19:27.609 --> 00:19:31.000
and go ahead, and it's just
another step in your installation.

00:19:31.000 --> 00:19:31.720
>> So looking through
this real quick.

00:19:31.720 --> 00:19:34.495
Again, it's readable,

00:19:34.495 --> 00:19:36.640
but it is a lot like a
README where it says go

00:19:36.640 --> 00:19:38.860
set up Terraform, do
all these things.

00:19:38.860 --> 00:19:40.270
Now, go run this bash script,

00:19:40.270 --> 00:19:41.575
you're sitting here
and you're waiting.

00:19:41.575 --> 00:19:41.950
>> Yeah.

00:19:41.950 --> 00:19:43.510
>> So what is the output other

00:19:43.510 --> 00:19:45.760
than maybe standard
out that I would see

00:19:45.760 --> 00:19:50.425
in my command lines
as I'm running this,

00:19:50.425 --> 00:19:52.060
and I'm sitting here and
waiting for this to run.

00:19:52.060 --> 00:19:56.500
I could execute this Porter
tool in my CIC process.

00:19:56.500 --> 00:19:57.010
>> That's correct.

00:19:57.010 --> 00:19:58.630
>> Then look at my logs,

00:19:58.630 --> 00:20:01.300
look for failures, and
act on those failures,

00:20:01.300 --> 00:20:03.220
also, like in an Azure
DevOps, something like that?

00:20:03.220 --> 00:20:04.750
>> Absolutely. So for example,

00:20:04.750 --> 00:20:07.090
you can imagine that
you're in GitHub,

00:20:07.090 --> 00:20:08.725
you're in Azure DevOps, or whatever,

00:20:08.725 --> 00:20:11.875
not only do you build the
bundle and push it to ACR.

00:20:11.875 --> 00:20:14.560
But when you detect that
ACR has got a new bundle,

00:20:14.560 --> 00:20:18.970
you can now have a pipeline that
deploys that as it should be.

00:20:18.970 --> 00:20:21.445
In fact, we can do that
now in CloudShell.

00:20:21.445 --> 00:20:23.515
So you can deploy it from CloudShell,

00:20:23.515 --> 00:20:24.880
you can deploy from Azure,

00:20:24.880 --> 00:20:28.000
but you can deploy it pretty
much from any system anywhere,

00:20:28.000 --> 00:20:30.355
whether it's Linux or
Windows, it doesn't matter.

00:20:30.355 --> 00:20:31.570
>> Yeah. I'm definitely
going to look at this.

00:20:31.570 --> 00:20:33.760
I know I've got some .NET
applications, .NET Core

00:20:33.760 --> 00:20:36.550
applications that have
multiple pieces and parts.

00:20:36.550 --> 00:20:38.950
>> Let's go bundle some
of that stuff up for fun.

00:20:38.950 --> 00:20:39.235
>> Cool.

00:20:39.235 --> 00:20:41.320
>> But the one thing I want
to also say is if you're

00:20:41.320 --> 00:20:44.140
interested in the automation
aspect of this story,

00:20:44.140 --> 00:20:46.000
should pay attention to QCon.

00:20:46.000 --> 00:20:47.200
It's coming up in a little while.

00:20:47.200 --> 00:20:47.360
>> Yeah.

00:20:47.360 --> 00:20:49.450
>> We're going to have a
lot of fun things to show.

00:20:49.450 --> 00:20:52.180
>> Cool. Now, where can people
go and learn more about this?

00:20:52.180 --> 00:20:53.200
Do we have a repo?

00:20:53.200 --> 00:20:55.585
Do we have websites where
you can go and look at this?

00:20:55.585 --> 00:20:57.670
>> Yeah. We'll go over here.

00:20:57.670 --> 00:21:00.475
The website is porter.sh.

00:21:00.475 --> 00:21:01.330
>> Okay.

00:21:01.330 --> 00:21:04.450
>> It'll resolve as
soon as we get that,

00:21:04.450 --> 00:21:06.250
and there's install,

00:21:06.250 --> 00:21:08.770
quickstarts, community,
other resources,

00:21:08.770 --> 00:21:12.025
viewers should watch
videos, the developers.

00:21:12.025 --> 00:21:15.760
Here's the Porter DigitalOcean
Terraform Kubernetes, right?

00:21:15.760 --> 00:21:17.335
One that we just discussed.

00:21:17.335 --> 00:21:21.160
There's a video of that exact
application right here.

00:21:21.160 --> 00:21:23.890
This is a little run from
a couple other people,

00:21:23.890 --> 00:21:25.165
for example, here's Porter and

00:21:25.165 --> 00:21:27.175
CNAB in a completely
different environment.

00:21:27.175 --> 00:21:31.300
So Nuno Do Carmo here
is an engineer in

00:21:31.300 --> 00:21:33.220
Switzerland who's
doing wonderful work

00:21:33.220 --> 00:21:35.740
on his afternoons, in the evenings.

00:21:35.740 --> 00:21:37.480
He doesn't do this for work.

00:21:37.480 --> 00:21:39.790
But he's decided to use
Porter on Windows 10

00:21:39.790 --> 00:21:42.160
with WSL to create bundles that he

00:21:42.160 --> 00:21:44.350
launches from Windows
10 that actually

00:21:44.350 --> 00:21:47.350
install a custom specific image,

00:21:47.350 --> 00:21:49.780
Linux image that executes in WSL.

00:21:49.780 --> 00:21:51.100
Then inside that image,

00:21:51.100 --> 00:21:52.540
loads it up with a custom

00:21:52.540 --> 00:21:54.670
specific infrastructure
set including Kubernetes.

00:21:54.670 --> 00:21:55.090
>> Nice.

00:21:55.090 --> 00:21:57.385
>> He's actually using Rancher K3D.

00:21:57.385 --> 00:21:57.850
>> Wow.

00:21:57.850 --> 00:21:59.470
>> K3Ds, all right?

00:21:59.470 --> 00:22:02.500
Then loads a specific
chart inside K3Ds,

00:22:02.500 --> 00:22:06.340
and now he's got a perfectly
reproducible test environment.

00:22:06.340 --> 00:22:08.005
That video is on there too.

00:22:08.005 --> 00:22:08.200
>> Cool.

00:22:08.200 --> 00:22:10.225
>> But if you think about
it in Cloud-native,

00:22:10.225 --> 00:22:12.535
that's a local experience,

00:22:12.535 --> 00:22:15.115
and yet it's an extremely useful one.

00:22:15.115 --> 00:22:15.460
>> Sure.

00:22:15.460 --> 00:22:18.400
>> Porter solves that
problem as well as the

00:22:18.400 --> 00:22:20.110
Cloud-native distributed around

00:22:20.110 --> 00:22:22.435
the world application
problem this was.

00:22:22.435 --> 00:22:24.640
>> Well, I really appreciate you
taking the time running through

00:22:24.640 --> 00:22:26.920
all this CNAB, Cloud-native.

00:22:26.920 --> 00:22:29.380
How we can use this ilocally,

00:22:29.380 --> 00:22:31.210
again, Windows 10 example.

00:22:31.210 --> 00:22:32.995
We can put it in an
Azure DevOps stuff.

00:22:32.995 --> 00:22:33.445
>> Yeah.

00:22:33.445 --> 00:22:35.845
>> Very exciting. I always
like to see new tools.

00:22:35.845 --> 00:22:38.320
>> Yeah. This will be
one of the formats that

00:22:38.320 --> 00:22:42.453
supported with the Azure Arc
stuff that came out today.

00:22:42.453 --> 00:22:42.640
>> Yeah.

00:22:42.640 --> 00:22:44.530
>> For example, there
going to be Kubernetes

00:22:44.530 --> 00:22:47.545
Manifest are supported
in an automated way.

00:22:47.545 --> 00:22:48.115
>> Yeah.

00:22:48.115 --> 00:22:51.130
>> Helm charts and then CNAB
bundles will be supported as well.

00:22:51.130 --> 00:22:52.105
>> Perfect. I appreciate it.

00:22:52.105 --> 00:22:52.465
>> Yeah.

00:22:52.465 --> 00:22:52.780
>> Cool.

00:22:52.780 --> 00:22:53.605
>> Hey, it's been a pleasure.

00:22:53.605 --> 00:22:56.605
>> All right. That was another
episode of Cloud Native Show.

00:22:56.605 --> 00:22:59.425
We're at Microsoft Ignite 2019,

00:22:59.425 --> 00:23:00.580
we hope to see you next time.

00:23:00.580 --> 00:23:04.285
Check out future episodes
at aka.ms/cloudnativeshow.

00:23:04.285 --> 00:23:05.110
Thanks again.

00:23:05.110 --> 00:23:07.270
Thanks for watching
the Cloud Native Show.

00:23:07.270 --> 00:23:08.680
Be sure to subscribe,

00:23:08.680 --> 00:23:10.285
watch for our future episode,

00:23:10.285 --> 00:23:12.430
and especially our
streaming shows on Twitch,

00:23:12.430 --> 00:23:13.840
where we build apps based on

00:23:13.840 --> 00:23:17.300
the conversations had right
here. We'll see you next time.

