From ad0a66ffccace68c339ae431e152cd8403c99ade Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Fri, 20 Dec 2019 11:47:44 +0200 Subject: [PATCH] Add Contour usage docs and diagrams --- docs/diagrams/flagger-contour-overview.png | Bin 0 -> 40522 bytes docs/diagrams/flagger-gitops-contour.png | Bin 0 -> 38171 bytes .../usage/contour-progressive-delivery.md | 402 ++++++++++++++++++ 3 files changed, 402 insertions(+) create mode 100644 docs/diagrams/flagger-contour-overview.png create mode 100644 docs/diagrams/flagger-gitops-contour.png create mode 100644 docs/gitbook/usage/contour-progressive-delivery.md diff --git a/docs/diagrams/flagger-contour-overview.png b/docs/diagrams/flagger-contour-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..e79ce813ccba953b2cb0254ed7602b8d63afdf48 GIT binary patch literal 40522 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 X>j>kuh2ihO*fiRj`Wj{GwvYY?T~_w; literal 0 HcmV?d00001 diff --git a/docs/diagrams/flagger-gitops-contour.png b/docs/diagrams/flagger-gitops-contour.png new file mode 100644 index 0000000000000000000000000000000000000000..fe26bce001f66aed0799d450460fb61719abfcca GIT binary patch literal 38171 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�jhMg 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

)XZ?e2T2ZE!-5N&7#E7&TC^MgE@vc9sRF%raKL$ zmQC?k%=ZQpL$v|`IgUTtA9#b#Ti`6kN`|!8^etmp)ESdr8=P6J@>iT2rv=BJ6_BG9 zbUVtMOsqou6bbP{0e1H-mZXFae&t`SGcEvf95q5+61OH3Q&+*7ZK}8}O4OQJtA!&R zrybLrv-N}x+JqF1f11&TDb7u>KSurvuoKqrpD53r{=6Lc z8!yrm>fxgNMK$t{xExZ%W0ID{cOCnq+UH%0A#XPv2m3|uR@QFfZA~kAOusbejwcHz z36cvRjmbAvTpZ_&BZrgn&h(y}@2LLpQ}!8XqYw6tNq$IM>*+-lIzDFR3K zA_#uy^YpfInRBx`_s%C*pKtq9hM#$Uf^)&P>m^P=i-}>$y4b#NJj&v_l1z86d+a$K zjt?(zwQv?R28VLV;5e= zsSP4Xy8d93w`7_nodc>lE;F56NzD{lWsWH>G9no;zV&X|f-xSk5z6`-_fge-S=AJV zL!|xyc*ZG5=zz{OUoawSDV@O8`EtP0+gAxtv{<%%JNLoBX>=-`OBV+tTM_h^F9foR zHA7Y3uW;2Dzv~&%l$PdpR!y47e%(K$o(B6gEIMR>019C2d@NXURBa89dS%Fz1Ok*0~ z*q)Fm&edO2oJ)3Wr+R0OW^{g%YP6?d`?L4Ds^+jId!Ws_U37FCKTDkTj$c;U#Ka1L z*fHB8W{okyvb>{88xvd&4NF{cGYJSKAe{rfg29eDz$ zfK>FhryDM5{;AF;2F~0Defn^X>gRGqU<}nzdykk0n$}q2|K_0^88e&yTfgbD+ z-Cy^eEaL(lQluCaGN~dy8}m?89G{@i`T6OdG1qQbh^=U#eO}$J_+3Be=WUP%=};#E zuNR?yR=?h~95@yPzCa|4aTEK{DbG9_g|L5M_^^;xDV9?g4T_d2?%ZQuF1X1eJq3Ob z@e_SW@q(2hFmLYTwCu}JJ&SZu&b7>|7>G(j-!8;WxJ@S$WXPBUFv}#b-3O-5g?gtmiv;n1{lm9MU!=fo|9I zUPf$1(`fQUMMvR)SK3>PMP~5T?7nos?y-=c`ljh^58>EM^;f7~#?Y2&zYwhXfj#U2 zvYIC0+6wqyfi-as6g@|k75p~wz;=9A`O{hC>P)`gissQbv-`(PEjfKZoxCkAcTx>a z5z5N1^s ziMgFot+^mT05-Z-k=e9@p8$85406%Hu~KP$HD_l-=3G?mV4m*P-e`naIpBO@W_q0d z{!EuatwwQ?aHIpCbyolOBu(V19HcD0a0e?XGC?z_w?H72^{jz@uB66I}eb z*>13=bWU^H_KY)K?yh;=Od9_351@+ufs)sE`0B6sBb?u@B~Bve$|>TSH+cCYynQh; zXvd&)y<2$dptuJgRS8&>5A2rcpOEKaM<%$(>6aN@JqpvFiJ5=BR5NrqUfF@5%y_)o zq8pFlc&r@uluLPZ`3PV{7;j@4K>VB2>#P3V4j@me6JIPf$1AbTL@#-++t ziB7IZ48<%nE5Gl|x@6m-`6Vtil+3+m*@I9|Al7e58mrfAslFVN0WS(@*h|;z7XVYH z)~pWNkK8{j_e`eJ-=4{a>;7tb0Nb4Q*fmw{f5M|U9Llx8CiUB3XxcC*W;14lvi~~{ z@rA-R8mQ83i)47D*S%L~grlMCcAG zpssc(jBp8hMK-3w_vf-d0k#6W#OhtHUDNx+)XwPP_O35Qb!)5fYUK(2krECmC8N-R z!tA@NNNsxYX-W$;)0km=?bhs@b6~C!D;WA!cS981)hQ4Rp5Plaoa6n81~;|j&quH zt5MsulM(bSleL~49djh$1T$!~_cEZw6y0?6>}MCsQU^MS61-8pRtLP>MJ%wn#ha<> z#n2PIPx3V;4G(U;VDme2HLLVs_*}@=GdtmVr(<%@D?6QVG1G#>?ee21CP>s(Y6mo!Gz@U zVQk*+;f^-8b}~tU3TE3zbC%Bmy|`rVxhr`ct#G&NeUmpB1hsS#FaI)+2-75*omcdlLv}sOW4vbGL z*H4r+7JX;o7GUA#&0o(_06=X{C2sQF+3)J(HE~bALjSlRHJh<@ZdAH`Z35d<0Cf3! z+$=8$yho-Zv%pn$Ck}IN?FTH%>%B*}gqiqFyOBN86iIko&EISYSbOd!zms|geH>}V zakngI&{XZWJ8}uJ!rQHW@k4=l=@iofIGsRq-%Fune_}*3^(pChbDQR@Wu!FLHBQS% zZk_xzniB->fW}7ZwKmX6{#$McgS~JjVvsK9sm@c{U12egWZT1xxTYq|OF(UGs^cr4 z`1g`-MCKz7%C%O1>EpL~(H5i~y&`bg_ZIq0&{DxX?4VR4h}XMyGnj!{#l6V&WUE=a z?+qiz_cpWbCGSXyk=#9MXS^Wg5f@{Z1d z?}NJrR=wOeUHVW&%jR^SW8FStL(?)c__}?r_JZ?Q;S=}QetEJhJ-?hHpVj#D`on)DXHhcVt}YVeN@5T z;90n4$L|f^aYC%}s6z*?iPBBAl_sOg$lfaAp${i^>0`#s$GxTV6vyq@0^k*mfeS6C z4Z}g`SqR89*mCfmt!Er2241P9#39|5wPxFn+_2Zo2>=Qky+xa6(812@@MOFqziHu zn5@b@G%N=ioKtMkZv~1ko_Vm<_BVHY0wG+?Y8CvzPP`&uOWm@SYiYxd;#xB$#8j5E z#n8O%U@u+R5|@SlP~AMeIA>|R#X0cegl>(@p)G;mLM+J2HT<6W*$!HGTtnfRj*KlRHnYm3 zv52k>tTiJ~SO=q`ZW4FwXkK!j(B(r`sK@JfEp&)Y#x>!VU+cW%%pl*SyP?-FuXl4I zw{@8`@o|NKasqXPlGJLI&YX(Il5zgC`psp0#?$b@b!mk!{h4yImVm|*julJLv*IK|AUYm<9zN{T9 zTJvqI1N1?S2wi?YKsh;QYsa3!|0CDj)~WQ<@`+yumjidmWde|4mozt14~a07d~_>F zjL6Zyv$D=ICa4^1sX8IzlBge;?#%zLKSyBgoh9=Y%}tG_%kCgo>yPD64e(X zTMVSm`X0o)Pan-dMW)sqgt--e58pLI&z3j0kH_Q>WSF53fcqTwO9vs%rP+DmGwQ>< zJk%qcw0Y*x4R59i8x#BAlrM7$R)}~cZ{zixH#?s!YmQ(qDsUb(q;IBO4%MFcnebTO z{qLGIu}^1bx1}S954TO768hpv6;{I zQ=7`DUq)`W(8pipM~vWA$UUU4Z!m8xNPcs4v}t5io80i&RD>6M=1IBR?2y|L{47Y0 zDabl59DjoAwu1Ak`MLg{)?tCbSJ*JD#ta6M3J$?H;Ev1KGX)S7w7NNtXdL32vtR|l z>z`ckGtbN1jX!xgDC{UKVdX>oJn96`|FEtTAu0I`P!IqmQ}pjeEF|l{(G~8-Azls- zcT(x0w|nOtK|Yinnj~7)jiSbFtKr%q^b&;fx(C@`2|iAOrhUO+j{46lU?HOlDTKv$5z%4adUCP+=jAGc2ZdSNz@X9r&Zr&mDJ%1xJ2 zzx_v9X!`eF1-CtXQgndJ7qo%4y(qH*U273-lAY}qj;?> zg9N7yuTL^vFyr%;Q)u2THew?0y#PN0(GJ|q9>Z|M(d$KjE@8l_xiDy6YO!@{l1R^F zcxG`(`0UD7(Vxh2$iP|(kTfy8BN});N!okiwT0X*4m3&q^+ZERooUKMH#(=#j~dZ!T`pLiH4^ZL;Mv`h_=Z(P6*{!SQR6$lhku^ z)KW%spRYKHV_Qv5l$L(Gyt;8%=;8993#-+-I<~k-@d-~<*d*Chj3>pA;m_=o*$1ek z1A^4|tKN&qp|87Ne|Ehc8bTg$ujPt8g{d$i4E{-g&f+x)DYbvI{WUZ={M_c*N$O4* z6UB{Z4b1;P$*aFUeW8I_IObntNDyzP-*~=}kmu_8*O)}$)Bj`cs1~|gSUSpRdF{%v zxur3aU+sf<(wIMb2qbOBb()`FVlYQXbz_1mAxP8zuH8ojvfM>Za@O@fM60K8hZ)gP zut2Wd3?g#!#qCGM{^3IEQZ%;+p6^MQI3v7&3BwR+)GAiR!L6>t6>#sfSR>@qp(P{( z=kj!%sIdi;pQR==Wko3%U-#MEv)nt}rnt(4$ii%1EaoU2F`&|8XmAFajmg(Sa z&gXz^H`XO6--s?<^>o?*Ot?Aqltn|}e?LTF82qDLy!pBRcSs+0PeH)@C17Ov-)u=B zIdQVtFXKNo-R~d*l^d}%=c(TczWN|?9SgNV+(Ak2ZOq~%?o!u%=YgOxs*H{ej5PRj zs}1-EKJ$3HOQi#oFAlN)&8>q8k6IAd=W}bj_MggaM9vF^ws_>O>~n4oUGx7Ghy*$9 zp-!>Pqw$}qrGw=E8=XU(cI|(0ARgR4=Sa-y{|Yiu7!5K)p7`TCwuD$16Bfwo2#~sX z{=+DY$@&zXaZ7lprwFyMhEE6`W8c3&4lUvPJ7-zVaHrz7?;nHd^VMjQRIx zX~e$S8eZ*`ro*Db<1Ey@;h*rV5T~!)7kb!Sdi>{-_D1_9NTGk@y@2l-#ZFKc7qudb z${Iu}ENnQQlnJG`tDsGeigQrJO+wV2xv-6Uu7ZEBs&9-HS}=!_FPk zBcwBOs76)LTIlCcbmX{fGk}X2^q`}0!h(|Hy$uzJ)kA+o=s(=3{3Dc~ZRMBb+))^} zx;H<#yiBQu{ts-`DZo-Curi1$a=E|kB)r_xwhAtFY{%uS{$J*1Uy+QBMgfHWF0F^m zYbu`gPDWeH`v%(z+y4gF1yeBU(XH3~OO!%3a|>xXcoLE&4A;kn_IndbmV*BW#wzIF z9_WxlO>~y$I(8#KYOZYY1BbRY@ebmi>x$&(-LDn8w%Lo6J2#bAw{8V0Kz))=#1Xn{ z2+7f5jf@t3fakz_;2TSE5B3{cY>lmLh~3xoICl4T!aSnZCL+TW6u@UP!Z2ii)`+G> zP4+{~L*Is|*Y1u&^dCgi>`W(D0*|5RCNdU>vdqT#iUYLuD77+AB+7^>2!AI_tLtb^ zSR;)LK~P8QKx#H0${TeYNnhU5H2P}4k>T^rFy6CZ<`4Tj_A}91Ym}qqo(wL&-P4cm z07;Yhpt^X)tq!vYO3`^dh$$HKaCkawm$5p!{HHV-sCRVVZhcGOlC-3R^}#A!_fs!L ztfIfTZQkw{TqaLDeEL9_Dcu-qWS9bG?||2A_0SL4nLVDb5mQ&IjfdGCs%L7g@xeGx z&!-HPfZNt4-fxYVdsS{oP~5lMlV4ww{zWI&YumK##;QI#{cQY{{k-?9e$2t6EU0xQ z<4?@b^djs}9`LgJeQ0v8eN(xOY5y6lj#`;)(j?_Pz8zEW+k=7k<&7hm_-_w2hUbxM zd?S+Ft^$NSaj{C>t_5%D1;m@pz)AelPk@XDv-yr_nzK9YHpVk*do|EqeKrx}>+|(gTg`oiQ)Mj>x(f(P zX_IJ+&syShg$9A?=7e%ATFgo&M!I1o0Q_k!j)pJdoukn%E83-m&7S$Tw6#1Mr7q?J zTUaHqm(dDT^{i>hoW`ee+ca&L^GSBkFE+_B=)l+%YH%CeN;WdX8Z=(iS1lVvx=T5q z7@FU9p!85eHckFaE6wuwa&3vztL;{$OA)8+AYCfPS5`wt9ZtxEbcE1S0%jAzU+v<| z3R4oWsMS9M<4>tsKFnDZ&Im|;=JT4T>4&ND%fGpW({V0qRkkwRAZ{*X$X9p6#cgcN{Jtw7)P&2SM6bOO=T8G-WRK>AETCn&qM>^z{6hsliPkCu*9_dnUJ6D|T zP-X}V#W=i@=dnQ3^hIT2!ciB~Sh82XfaB;0G$Y#Ob^nM&z)%fFWxrK5lwmMer`Qm zY7E*;&f1z`o9cKhnvngy2`pGWmX;4)5+F|Rc>9{9nM&p7L?=uKp2-BqbN5vMWbDpe z?03Yc^-iB0bT=oZ!kpPZ+Q}xK+F5=`s-w-CQ?=hZ1hIh(U$QIBmtdh)W4UuPy1+9V z*!UjwgZgn6P``*0)4$a1;aeTC*BO46CK&vlI?|!LTbKr3p;`O@BmzG7(NNdT+HGEJ zN5{>MLqozb&D;5>y^4anVPz6ZJy~cvMR!9j7WQ8*rH|j;dvIWa?wu&1mdpa3r@Q+o){-D#H+|GKFw|IEN;t%DfSY@EcrEW zDxO3@;5Sxr4gVA^vsCstcwhaML5j8AYE!jmG16i$Ez9<@Yq7*bJR=Kyt-7Hci;8lAIq^K7BgkXH^1NrXebZ$B#>Y*^>Y5 z|AhNO>)(}qw{r@|$s6%9=Hx_4fcpu11&pq4RHU-sCHqxoSX(p}D~9OWjY*nEJ7ORp zuwcO&Jyg_#(i@GG5lm)o%9n1r?A_?^M~aivbz%v`)Xbe}v!A#!f250en3b9XpNizD z>xp!QkB082Nwbbg%yye=kq&SitUme0#&VN2rnr0HWncTY&Ot2LQor-27p%F>jrQ`_ zlUNKy@8JgR$2a$Ll`k?3Xi=7614V4Rsnw|_oW>do&Q^~C)d z^dU0yiy{TFp&S%lD^1}KMz+jkwoYG7h|qAbR(a|jAugSHLCI#n88O$X&AFL#YrhY+ z)g9I5Jtn(0`~}!-E?S^00>&N3M;}kP$$eLkmm0d8_cU@U3z*&EzJ`)RS1jTWLFp2+ zhFot4gIrC|?@r-*hPO3K`EScqUIL%)(h}dJlK0}_xw$;j7Nb{N7CDP@^fx1Rg-dpJ z0&RFJk1lt^_Ta{vcQ2g#pccE$*=2Z5@J1RLv7rR4SSxjWL>3ZUmefiUv~~}FmmU9Y z>0_Mp1F<*XVml#LjD#p`i&uKmHW~Xp_s~pux>oiiDY2mt6m72-J-`=n?YPg*Y57F% z7Rdm)n$m?1F8m*FAxH(HH`C;QVZqN!Zym{Uo^4w@e7=<`b)DxmxYv!{9mJOXnfAij z6;Y0lDDvxW`;V@04u#-e^oQj4g0HU-tsU-1E(gV@I;LsO=-H5;?Su(ny45_oR{^FKD(TQYe@$g(q1lWkF`8%nr z?NOEDq1uF7(tVGOGbUNL4HcGh^q2oISrtW}qguhA`5D}kI!fot9L`O!3Mf!fPJ5V1 zg4jp`+KK?@edLaghQm?I%%-MY=`g0g)vVAg|G2Cv46G4tZQptn04OV|zjVQTX>)kD zpE%z`F&~HpzxRS#-kZj38M~`iW;ncMoLRmM#6Q9n(k-fNij-DAN3d}AE7%Tbc$B7< zJpn~d5iO-M*@iAi_d02%Oh{0TY77T!uJSKj2}UiFnE7l2X39m=*Yqsqc}S@efu8Nu zqMg*+vXVtX4{=d&=kH@`y4jEKdu-O+e@hf;IsU-W{Q{qf6HY6mqDR}yq0<+URx8LA zpt%{9x8^8)7F{UKay#f2;tg&P&lV&eY;a7cPbBZeE?~M1Jv1!Hs^8#mm5VOmr{3*8 zx%_B_Qsrtwpf=Q-o@PMS={fe!ku(lDCp?yLo?h{z^gfsZ&{ul7G=*UkzHiGJU z_8@j=HJ@*}kT+@&#uSQ7Ar`tMbB-vjq#rpcD@Kb!I?W?3PIZ!BG0iZ`PX+SsNfQDS zA`I51>)%P#Ad z5DN((B}JV}Y>jhIB?)@lg_I{oXPi_X`5YKFi>*^Y;30|Y!-9iY`k8!L>0;PR^z-3? z_`(#*w75{rqz#axArT+(2l7A{ru(snhHEHdr?=Tqm{53X+clSh7Jr}4cY3A;p>FWK z@J^Dmo!ER#x4wtQJ~D|dgTHqr?RhRl>>}UwNE=5jQ_1FgH=;BJs3jvs#HgYvZm}J+ z1ro^-1WB%yp+vV0JxbV1vjz?N$Z?3|WUn84Jcv#5F0eSYF<=OP`}cB1_84U+S|-0g z`E-O^50!DAJf?0qGRnCzR*o5GETB-cVmSrla2@-b*xiq?o`=5 zsN&jtV&1yB-7TJ+t}pW=&Ao)^d!%23)Ci%bJ$!En(DMCrH zA~5yLZifE5#%n|uG)_iu?y}8hpCZU2P=&97z_5PHaDRj)&}1U#q^-fiSwcU7c}0?I zgN8x6bO!%!@n&&ZwnF^2!ohH=FyqQSH72Il;Kx1kxKVGi(Sxz}s%S#qH;LYLPCeD1 z*n4A2`$qvdjiR4O83k09F5BF*tXehbJt3c*nRVVopaIs)k0n7OT`R|-TQ6X;%%23J z>V>X;YO2tq2eU~F+x8TO^}vT#cdbVa{U%N2i6Li++>Ao{F%{PIE|v9~?IE55w-A)9CF0a@R0`#q^`Q;mQW9+^{5 z+|R@Mcf&3b-?U46G>%TslteljUTSr*tr5xjN61JPbtCj^%FB5;bKCoc;$cRciukNA$Cp6o0Hex5Q#N?E7e zYW6#FDcc>)Ea7Qqf2N{(^ldQ^ZT;nRA2m-YM~4Y7d)#DRjg`oFN6E@8Q|fs8mHA?H zN!MlmrJgPxZC5u9%ZJC?)8?*-4fcfd!BCwfecc$4aPD9`6+nb-(sLaKj@Ee#!Zfm0 z*Ha4^aI%%JTPqpTEH>Kx_WYXiPn{X{r$G`SbTS;9Vm&U1=0+@lU}n*rF7q$j&o`^4 zu&++{fTwW{Odu+Rlz6bpuX-k%#|*i9?ThYLD(OG-On$5K4>UVr=mq>y2$v~hqvXoC zmx6V^K(Xf3w_PXzFkH$uA;IA`3zm0*{w2C$ti>LtABhL*cd z*lTUW9;L8yTno=nYZuIrPNUzb)6y|R3`WkzL6MeNsVOt)$3n|430@FO;o z0h9jKPVvhSD)$m93k_`I`s%o4B?#b^&gWKej**jKwnr$v{xIt|pQvBtEWGQnjE`ls z+&3yDn5{N0;qBVnkK}O2-67R9vL4c4sfhPLYe&k)ADpbuk*l0BJ8^neXl4DHJcDK^ z=$E0D`v`rxYFHe@@YGYIX(H%v^wLbO!ZHD$CB=g+-|i=eS+p|~0<=_Hb4DJz!yTeq z0Y(#7U$}N+$K|P51_#eTIZ^(r>Ph=OOgH~;tdFh^kB5WImdnxv#yET)A2&GAISJJl z$eI>?G@I*Cwkn$KDWHtr98+iTo`xWXf(jbtS7*Ey zT^^#Vt_Fc5r`gdP17_zU)Vonb_)UK9zF@}^CCluKIl*Rir+N7fiH<1H+(3@C8f{M# zi{65s`{Q*l%&AW!fY?x4<;+3Ed_*6-#x-uI0lAgNMq^lUE9nV+*B?(#O^~J=6BV<> z7!P^la0A1x5uCrV{E^`KQ))U4nOYc_`V|rOGd2F{{o}i(yBDwxm;&pi5JhOAgQ{#u z8sKnj^uknj|B32Jsh11ZLXugp$*>L@x`f=5sHP86^fDZc1pUNiCX8vIie>6L#ONVY zzI8OW_w~?wIo%uXMO>d7Lr)A^+_e-C&wgk(U?+iCh9wSZ2&?12<8_nmu$urRwZW<}zz@CjYOl3E;QtS=J*ttIb zbcqma_GhJXZNCf8M59gn)EhgVd6nJM?;jX!Vus4d7kRYr)r0})Z>H>*zhNw%KZ1WT z`73yC$E4u|f>t&aH@_L4yF2|U zhnV{83it%?8L#@8qP@S#+j(LJa7=fEZ~#?@+r-qiT#g~Rlvkru%XQnPs}1q|dui=B z>VdPi!xMU^fnR>}BTqU4?_jB9iQCuaR6FyGF@bs?$y7LZSt$av%cp>>*@^L9+-d~w zxUO*HEA>Br=z?t(2~Al2>x-Hj+tVY9sIij6wLzXl)_0<)G`$g|qQU}lhvyQM2X+q; z?mhddwjLg%BdCTKkB20xq3eD&DtkAt!YEF&aJ|^_Fxq8v%x6W?>1eK^U|oS{>T55o z(B6&VDaLrg@)T(iR}wznk$zQeA#!L;C1&zF+gz&9zptq*hVH?;+!ZFw->g4;{N!RS{9NGGVrei;OBG7=B^Q5&zaUF6t1 zt49f3(ma#J%<&p+O#reR`_=X@Oi2p79_M<^t1hmM#(U?5v#jj%E?)EQL|v5@x<#Z4 zl3=vsl0k-nPgCk({C%fI#&CYUWP6GNwjWVKYPJ#%&?nxnXzEx?#;B=Kr}-t@R%J2KB4-%lpb*K%Bxg36J4Z+^||D=t?8Oft4_wr7fPDYq2A zVExL00Xrj3_g5{3=m_fV{A$!y!ygMjs#_Mrv71sk%>nW(-wStzvJ^C-M{|{q;wjYhXYVIV5g{Li%F+hT&_hm;k+CDGH8zBP34C1B}dfWy9eL}2H1 zI+u%xxO#hZA+Dh*L(9=Sxvmb{eT(Wq6su7Epls1YsNanK`6>4M$}aPpl&E-tXqq=n+B93zvKu{Z1U7*rWv=ocG+lu~ zC;VcHX{R-?M*Yw9R2W{RGF_@$FvybYOhh~FrIw8Rz2;w0xX*6V%sbbF6i05-1<(h8!x!4ugyrMbG?mov(RV> zw0gmG0ZK}(HNf)n`wy=gjhwS07HzmkL&cKUG=yc=O>7wExrDb?@AWNUUTzAUM7`t=%&4 zD@P_H>C5hp5oZW^B*6hi_gv?%UH{uzP41gSa2&Ci=9qNSVGdeYGqgrEb7&avM$|SfS##I>^k=p$Syrx zlt@D1!cCDZGWSwg(#fC;pSmKft*dMo^W`*dLt@9@|A;S7_@wcF+Pe05ru#3BE+So} zgpgwHp2#nknM%^;dA6Edr{qE9ez&K0LoXx@626|v2gryFk%+alTD z)8%Yxe_U~(0q(qe)HRWKrpoi7G>}hE&{Zr7T57ipsWS?{jFCge_(39(5#| z#>gufuHEYXNTHTA`W~3;z4_0NBt4Dy54=`jBfWesn=mg)Yx`pzV&v30(#xMK;Vv7b zw9H)1Gnx4QxXSp0mEQ;CfV^ay>m*!D*qp0=P^cxuB3qe+$$EHwskva_O5hZBgd zI;D;*4R+~Cekc#Dcwu&O@cQ=d&jo$|U=CC)9A`wt4~EP=>M zH{CN-3mE$Ozup$53|`xg=u`Vn(+qXehkAS}9z-ZeoU%oUjkPOfn>9mT=PxK1s8Qd_ zN)UGO6)!q8t|SD$=u`Va?||zm_56%qdOV`#syQg*%ax7LIXIffc>2o?0Zv-wlT6b_ zUq*FSR(1)r;8an**)6RKUr=_Suy3NsUF>zI{Rv!QOwJSZC;h;#?x0a$HD$rJ?(LoL zsS3J>NywWR8Lnsm(o5HfXeX+0{9VX))~ZAou1Wh1c4tap^s`gon+E$Y1f)}EhkATx zWjYQRB_Ci&pJ}VuD%?yNh~rcke9>M=V+vn(Z6aP{QtJ+Ws{359r$Up^V&CTP&rPB} z21jH#uGVgXC7Nx*n${g1-Aq@ktIX_czWm8ntE+Q3VnZ`sR`-r;n*Gkm?2b2pS!~-D zEX5LQS_CEtJk|>o+`KM4m-ne~%$BDsuGld4w&Ox-@_wg;V-i+yVJD_PUn0>(&ATj) zsqY8melz?ie@OK$p?C{o+@h2dAkcs~@2pRVGmNNruGNv4_dfF&(&bHqnSiElwB_fJ zDkohW-#=dn_bD%%@Npc@j%|S=Eu;ZOY9=uxxjww{H+R33qkUY+;zm?uKGCvMc2WGW z2)1QR?p<|}qyMwiqomLI_$-!fp^;r9V(RIy_N56(6Q~})8Wyd}G_(%VBuM?xK$1lI z{d=9)^!qh;{DF~~-ym2yd02(ioHPC4WTc%}wqs1L<%C77z+#hdv(#>2-Z))R>LghD z?<63UZ~>vzfAjzno9`BHnK*4H!oZ>w0Ov8J1Z!Q5)d9#-H&OL846=R$Bh#ou_#lvl z)P^$fCr)^-L~(PT!r)$_K6P2QVIa445n#Po7r{dWB-4P7pN&Er+TAu;IgE0KfdPZY z>IkH(w6ZFP>-k}02@}zf_(m?wn$kQkbqgcYY(Svfsfzw!uUEv)tB$iga8IT{UaG)N ztdl_fF!9*jGc(NyVbA;7x3IgGF%7ugcYvD`;j^*INEKB+Nkc0=Y3Kd)!_mcl%utFl z!b4Nfq$4)zE~pd)6jJs$H0j`F4{*wq+u(lJM-F2?PBW@3Z&h#A22jRG8ZgSxAo12( zk@2%oHAG4N^4c0>$?PX^DiiPX-Iw-N1EzZB81vrYnn4>J28kA_kFnG)G18C?xsmlv zg?3;TyTX5>cyjc4N7bwnG7e0LV1?(N$Po{jc^h6aYFKtAP4+W$IxDC>$%_Lv6q8?~ z>`Pr5RSKgqDtAFGXbRyOnR4to-lM}s(H-eR_X_}J5Qb9q;9RYx%v`o);Hz^@gZv(>j;#ZC@T@ME@;O?UD?<5hHYsc` zw1LKLZH$Kh3k?SlDhhx0?KU&k`^Kn?iTWXF5-h zLF?ueyR}6zOTwc;W@wMq>z8Fhhs>9iNU?W2To!Y;is=(u8ZH-jTT@WZ`V@y(<EzET_JB2h!NO%tR@zR>bzpg@M6(4zNg62~fL@kyd}cNv3Y0j7T?g7t17A}El!)jXzqsQM9k>#JX(mX{zw zlWuii{X}6yj-1``(*f@6nkHH{FYKw^cVG3_SwC7Gz|u|e z;7Q}6ak6=y2$MxSg!2K{<2=!?;P7#15FSp!&>E`mIn|c8FT5OuI8`xey2oVGF}hdC zN8AY+Q$LX6`&9OmFpv*|GiYO;steTCE)pSV{7A`Z2j!9tM)nkrw93W>ZcrYmF_hXu zYAFYe5JKObI+I1)3A1+?J9&e1r0y@uhz{VXME{HL3df;Vv+9Uzvr!`FMC-pQwfuQH zerIk|bfSuU#kncuEPwgVB%&QImE`ndV5^4~ow6VSiaij3O zjk~NJy)~2bVHduRm0{QKM;(+?)F?Z*H z3{c;L(C-xg4Lk7Q?_YQ4TzDq{9(`}Q|AJt6_!&yc$1TQx!LxNnk5Ik`R3%_R`CYF+ zQh567zkx~2f{on>xb>Tl6v77tHsQm_NQFt%j;C%pJA|88y!-L7=7Zki07t{Vx5bg| z*U5eX?8@vKmjIg-kRz_m9D(NBVR_PDU5itL33Gr~2hd$E%_q;p@8* zYuYemZ96Kq7?^uGwx8gVn^H>@?V7gE1J3@Y@bA7TE%EA7bnwfoHiqo|8AmK~8n|u5 zH?NGQe>7owjrQj{gPG#~!y6bfE!R5lE4|z_`3X-_=$>Oxa zLnrrQMZTQFZM|g7#sN|HmU4(TW3g*C+;#SzC2_cW`+cv``68e<+g{AWWQ7!xZ|)mE z1c}_6*sMR%r~uhI@7VczGrOe=p@7QeAI)RS1CFs5oziU;O=+=ANx)AMkn8>(xY1lm zZ~bV|Wy(aHP1}d>l>>}Q-33VjY$*vjCijyBI1=*T!v7-wzn+Bqzf1n6_i}Alx(`n4 T9aiO=6!1aq;b$nPul(^Zci{ZZ literal 0 HcmV?d00001 diff --git a/docs/gitbook/usage/contour-progressive-delivery.md b/docs/gitbook/usage/contour-progressive-delivery.md new file mode 100644 index 00000000..c82888f2 --- /dev/null +++ b/docs/gitbook/usage/contour-progressive-delivery.md @@ -0,0 +1,402 @@ +# Contour Canary Deployments + +This guide shows you how to use the Contour ingress controller and Flagger to automate canary releases and A/B testing. + +![Flagger Contour Overview](https://raw.githubusercontent.com/weaveworks/flagger/master/docs/diagrams/flagger-contour-overview.png) + +### Prerequisites + +Flagger requires a Kubernetes cluster **v1.11** or newer and Contour **v1.0** or newer. + +Install Contour on a cluster with LoadBalancer support: + +```bash +kubectl apply -f https://projectcontour.io/quickstart/contour.yaml +``` + +The above command will deploy Contour and an Envoy daemonset in the `projectcontour` namespace. + +Install Flagger using Kustomize (kubectl 1.14) in the `projectcontour` namespace: + +```bash +kubectl apply -k github.com/weaveworks/flagger//kustomize/contour +``` + +The above command will deploy Flagger and Prometheus configured to scrape the Contour's Envoy instances. +You can also enable Slack or MS Teams notifications, +see the Kustomize install [docs](https://docs.flagger.app/install/flagger-install-on-kubernetes#install-flagger-with-kustomize). + +You can install Flagger using Helm v2 or v3: + +```sh +helm repo add flagger https://flagger.app + +helm upgrade -i flagger flagger/flagger \ +--namespace projectcontour \ +--set meshProvider=contour \ +--set prometheus.install=true \ +--set slack.url=https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK \ +--set slack.channel=general \ +--set slack.user=flagger +``` + +### Bootstrap + +Flagger takes a Kubernetes deployment and optionally a horizontal pod autoscaler (HPA), +then creates a series of objects (Kubernetes deployments, ClusterIP services and Contour HTTPProxy). +These objects expose the application in the cluster and drive the canary analysis and promotion. + +Create a test namespace: + +```bash +kubectl create ns test +``` + +Install the load testing service to generate traffic during the canary analysis: + +```bash +kubectl apply -k github.com/weaveworks/flagger//kustomize/tester +``` + +Create a deployment and a horizontal pod autoscaler: + +```bash +kubectl apply -k github.com/weaveworks/flagger//kustomize/podinfo +``` + +Create a canary custom resource: + +```yaml +apiVersion: flagger.app/v1alpha3 +kind: Canary +metadata: + name: podinfo + namespace: test +spec: + # deployment reference + targetRef: + apiVersion: apps/v1 + kind: Deployment + name: podinfo + # HPA reference + autoscalerRef: + apiVersion: autoscaling/v2beta1 + kind: HorizontalPodAutoscaler + name: podinfo + service: + # service port + port: 80 + # container port + targetPort: 9898 + # Contour request timeout + timeout: 15s + # Contour retry policy + retries: + attempts: 3 + perTryTimeout: 5s + # define the canary analysis timing and KPIs + canaryAnalysis: + # schedule interval (default 60s) + interval: 30s + # max number of failed metric checks before rollback + threshold: 5 + # max traffic percentage routed to canary + # percentage (0-100) + maxWeight: 50 + # canary increment step + # percentage (0-100) + stepWeight: 5 + # Contour Prometheus checks + metrics: + - name: request-success-rate + # minimum req success rate (non 5xx responses) + # percentage (0-100) + threshold: 99 + interval: 1m + - name: request-duration + # maximum req duration P99 + # milliseconds + threshold: 500 + interval: 30s + # testing + webhooks: + - name: acceptance-test + type: pre-rollout + url: http://flagger-loadtester.test/ + timeout: 30s + metadata: + type: bash + cmd: "curl -sd 'test' http://podinfo-canary.test/token | grep token" + - name: load-test + url: http://flagger-loadtester.test/ + type: rollout + timeout: 5s + metadata: + cmd: "hey -z 1m -q 10 -c 2 -host app.example.com http://envoy.projectcontour" +``` + +Save the above resource as podinfo-canary.yaml and then apply it: + +```bash +kubectl apply -f ./podinfo-canary.yaml +``` + +When the canary analysis starts, Flagger will call the pre-rollout webhooks before routing traffic to the canary. +The canary analysis will run for five minutes while validating the HTTP metrics and rollout hooks every half a minute. + +After a couple of seconds Flagger will create the canary objects: + +```bash +# applied +deployment.apps/podinfo +horizontalpodautoscaler.autoscaling/podinfo +canary.flagger.app/podinfo + +# generated +deployment.apps/podinfo-primary +horizontalpodautoscaler.autoscaling/podinfo-primary +service/podinfo +service/podinfo-canary +service/podinfo-primary +httpproxy.projectcontour.io/podinfo +``` + +After the boostrap, the podinfo deployment will be scaled to zero and the traffic to `podinfo.test` will be routed +to the primary pods. During the canary analysis, the `podinfo-canary.test` address can be used to target directly the canary pods. + +### Expose the app outside the cluster + +Find the external address of Contour's Envoy load balancer: + +```bash +export ADDRESS="$(kubectl -n projectcontour get svc/envoy -ojson | jq -r ".status.loadBalancer.ingress[].hostname")" +echo $ADDRESS +``` + +Configure your DNS server with a CNAME record (AWS) or A record (GKE) and point a domain e.g. `app.example.com` to the LB address. + +Create a HTTPProxy definition and include the podinfo proxy generated by Flagger (replace `app.example.com` with your own domain): + +```yaml +apiVersion: projectcontour.io/v1 +kind: HTTPProxy +metadata: + name: podinfo-ingress + namespace: test +spec: + virtualhost: + fqdn: app.example.com + includes: + - name: podinfo + namespace: test + conditions: + - prefix: / +``` + +Save the above resource as podinfo-ingress.yaml and then apply it: + +```bash +kubectl apply -f ./podinfo-ingress.yaml +``` + +Verify that Contour processed the proxy definition with: + +```sh +kubectl -n test get httpproxies + +NAME FQDN STATUS +podinfo valid +podinfo-ingress app.example.com valid +``` + +Now you can access podinfo using your domain address. + +### Automated canary promotion + +Flagger implements a control loop that gradually shifts traffic to the canary while measuring key performance indicators +like HTTP requests success rate, requests average duration and pod health. +Based on analysis of the KPIs a canary is promoted or aborted. + +![Flagger Canary Stages](https://raw.githubusercontent.com/weaveworks/flagger/master/docs/diagrams/flagger-canary-steps.png) + +A canary deployment is triggered by changes in any of the following objects: +* Deployment PodSpec (container image, command, ports, env, resources, etc) +* ConfigMaps and Secrets mounted as volumes or mapped to environment variables + +Trigger a canary deployment by updating the container image: + +```bash +kubectl -n test set image deployment/podinfo \ +podinfod=stefanprodan/podinfo:3.1.1 +``` + +Flagger detects that the deployment revision changed and starts a new rollout: + +```text +kubectl -n test describe canary/podinfo + +Status: + Canary Weight: 0 + Failed Checks: 0 + Phase: Succeeded +Events: + New revision detected! Scaling up podinfo.test + Waiting for podinfo.test rollout to finish: 0 of 1 updated replicas are available + Pre-rollout check acceptance-test passed + Advance podinfo.test canary weight 5 + Advance podinfo.test canary weight 10 + Advance podinfo.test canary weight 15 + Advance podinfo.test canary weight 20 + Advance podinfo.test canary weight 25 + Advance podinfo.test canary weight 30 + Advance podinfo.test canary weight 35 + Advance podinfo.test canary weight 40 + Advance podinfo.test canary weight 45 + Advance podinfo.test canary weight 50 + Copying podinfo.test template spec to podinfo-primary.test + Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available + Routing all traffic to primary + Promotion completed! Scaling down podinfo.test +``` + +When the canary analysis starts, Flagger will call the pre-rollout webhooks before routing traffic to the canary. + +**Note** that if you apply new changes to the deployment during the canary analysis, Flagger will restart the analysis. + +You can monitor all canaries with: + +```bash +watch kubectl get canaries --all-namespaces + +NAMESPACE NAME STATUS WEIGHT LASTTRANSITIONTIME +test podinfo Progressing 15 2019-12-20T14:05:07Z +``` + +If you’ve enabled the Slack notifications, you should receive the following messages: + +![Flagger Slack Notifications](https://raw.githubusercontent.com/weaveworks/flagger/master/docs/screens/slack-canary-notifications.png) + +### Automated rollback + +During the canary analysis you can generate HTTP 500 errors or high latency to test if Flagger pauses the rollout. + +Trigger a canary deployment: + +```bash +kubectl -n test set image deployment/podinfo \ +podinfod=stefanprodan/podinfo:3.1.2 +``` + +Exec into the load tester pod with: + +```bash +kubectl -n test exec -it deploy/flagger-loadtester bash +``` + +Generate HTTP 500 errors: + +```bash +hey -z 1m -c 5 -q 5 http://app.example.com/status/500 +``` + +Generate latency: + +```bash +watch -n 1 curl http://app.example.com/delay/1 +``` + +When the number of failed checks reaches the canary analysis threshold, the traffic is routed back to the primary, +the canary is scaled to zero and the rollout is marked as failed. + +```text +kubectl -n projectcontour logs deploy/flagger -f | jq .msg + +New revision detected! Starting canary analysis for podinfo.test +Pre-rollout check acceptance-test passed +Advance podinfo.test canary weight 5 +Advance podinfo.test canary weight 10 +Advance podinfo.test canary weight 15 +Halt podinfo.test advancement success rate 69.17% < 99% +Halt podinfo.test advancement success rate 61.39% < 99% +Halt podinfo.test advancement success rate 55.06% < 99% +Halt podinfo.test advancement request duration 1.20s > 0.5s +Halt podinfo.test advancement request duration 1.45s > 0.5s +Rolling back podinfo.test failed checks threshold reached 5 +Canary failed! Scaling down podinfo.test +``` + +If you’ve enabled the Slack notifications, you’ll receive a message if the progress deadline is exceeded, +or if the analysis reached the maximum number of failed checks: + +![Flagger Slack Notifications](https://raw.githubusercontent.com/weaveworks/flagger/master/docs/screens/slack-canary-failed.png) + +### A/B Testing + +Besides weighted routing, Flagger can be configured to route traffic to the canary based on HTTP match conditions. +In an A/B testing scenario, you'll be using HTTP headers or cookies to target a certain segment of your users. +This is particularly useful for frontend applications that require session affinity. + +![Flagger A/B Testing Stages](https://raw.githubusercontent.com/weaveworks/flagger/master/docs/diagrams/flagger-abtest-steps.png) + +Edit the canary analysis, remove the max/step weight and add the match conditions and iterations: + +```yaml +canaryAnalysis: + interval: 1m + threshold: 5 + iterations: 10 + match: + - headers: + x-canary: + exact: "insider" + webhooks: + - name: load-test + url: http://flagger-loadtester.test/ + metadata: + cmd: "hey -z 1m -q 5 -c 5 -H 'X-Canary: insider' -host app.example.com http://envoy.projectcontour" +``` + +The above configuration will run an analysis for ten minutes targeting users that have a `X-Canary: insider` header. + +You can also use a HTTP cookie. To target all users with a cookie set to `insider`, the match condition should be: + +```yaml +match: +- headers: + cookie: + suffix: "insider" +webhooks: +- name: load-test + url: http://flagger-loadtester.test/ + metadata: + cmd: "hey -z 1m -q 5 -c 5 -H 'Cookie: canary=insider' -host app.example.com http://envoy.projectcontour" +``` + +Trigger a canary deployment by updating the container image: + +```bash +kubectl -n test set image deployment/podinfo \ +podinfod=stefanprodan/podinfo:3.1.3 +``` + +Flagger detects that the deployment revision changed and starts the A/B test: + +```text +kubectl -n appmesh-system logs deploy/flagger -f | jq .msg + +New revision detected! Starting canary analysis for podinfo.test +Advance podinfo.test canary iteration 1/10 +Advance podinfo.test canary iteration 2/10 +Advance podinfo.test canary iteration 3/10 +Advance podinfo.test canary iteration 4/10 +Advance podinfo.test canary iteration 5/10 +Advance podinfo.test canary iteration 6/10 +Advance podinfo.test canary iteration 7/10 +Advance podinfo.test canary iteration 8/10 +Advance podinfo.test canary iteration 9/10 +Advance podinfo.test canary iteration 10/10 +Copying podinfo.test template spec to podinfo-primary.test +Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available +Routing all traffic to primary +Promotion completed! Scaling down podinfo.test +```