Slide 1

Slide 1 text

$POOFDUJOH5IPVTBOETPG4FSWJDFTBU-: $PSQPSBUJPOXJUI$FOUSBM%PHNB$POUSPM1MBOF %FWFMPQFSF9QFSJFODF -*/&1MVT$PSQPSBUJPO .JOXPP4POH )BOOBN3IFF

Slide 2

Slide 2 text

"HFOEB • #BDLHSPVOE$POUFYU • 0VS$IBMMFOHFT • $FOUSBM%PHNB$POUSPM1MBOF • 4JEFDBSMFTT4FSWJDF.FTI • 3FDBQ'VUVSF8PSL

Slide 3

Slide 3 text

• .BOBHJOHBOEEJTUSJCVUJOHUSBGGJDQPMJDJFTGPSTFSWJDFUPTFSWJDF DPNNVOJDBUJPOUPUIFEBUBQMBOF • "EWBOUBHFT • $FOUSBMJ[FETFSWJDFDPOGJHVSBUJPONBOBHFNFOU • %ZOBNJDTFSWJDFSFDPOGJHVSBUJPO • 8FJNQMFNFOUFEUIJTPO$FOUSBM%PHNB $POUSPM1MBOF

Slide 4

Slide 4 text

8IBUJT$FOUSBM%PHNB $FOUSBM%PHNB 6* "QQMJDBUJPOT 7JFX$POGJHT 8BUDI$POGJHT 3FQPTJUPSZ4FSWJDFGPS5FYUVBM$POGJHVSBUJPO (JUCBTFE4UPSBHF .PEJGZ$POpHT

Slide 5

Slide 5 text

.JSSPSJOHGSPNBO&YUFSOBM(JU3FQPTJUPSZ .PEJGZ$POGJHT 7JFX$POpHT 8BUDI$POGJHT $IBOHF:PVS$POGJHVSBUJPO4BGFMZUISPVHI1VMM3FRVFTU (JU)VC $PVMECFBOZFYUFSOBMHJUQSPWJEFS 1SPQPTF $IBOHFT $FOUSBM%PHNB 6* "QQMJDBUJPOT (JUCBTFE4UPSBHF

Slide 6

Slide 6 text

"HFOEB • #BDLHSPVOE$POUFYU • 0VS$IBMMFOHFT • $FOUSBM%PHNB$POUSPM1MBOF • 4JEFDBSMFTT4FSWJDF.FTI • 3FDBQ'VUVSF8PSL

Slide 7

Slide 7 text

:PVS"QQ $POUSPM1MBOF • 4FSWJDFSFHJTUSZ • 1PMJDJFT • 5SBGpDDPOUSPM • $BOBSZSFMFBTFT • 5SBGpDDPOUSPM • $MJFOUTJEFMPBECBMBODJOH $VTUPN.FTTBHF 4DIFNB 0VS -FHBDZ$POUSPM1MBOF%BZT 0UIFS"QQ 1SPKFDU.BOBHFNFOU 5PPM 1.$ $VTUPN $MJFOU :PVS1PE :PVS1PE :PVS1PE :PVS1PE :PVS1PE 1IZTJDBM BOE7JSUVBM .BDIJOFT

Slide 8

Slide 8 text

• 5JHIU$PVQMJOHXJUI1.$ LTTVQQPSU • /PEZOBNJDSFHJTUSBUJPO • -BDLPG*OUFSPQFSBCJMJUZ • 8IJDIDMJFOUTVQQPSUTUIFDVTUPNNFTTBHFTDIFNB • -JNJUFE5SBGGJD$POUSPM • "SFHJTUSZ OPUBUSVFDPOUSPMQMBOF -JNJUBUJPOTPGUIF-FHBDZ4ZTUFN

Slide 9

Slide 9 text

• 4VQQPSUGPS%JWFSTF4PVSDFT r 1.$ 7.T 1.T BOELT • *OUFSPQFSBCJMJUZXJUI&OWPZ r *OEVTUSZ4UBOEBSEY%41SPUPDPM • (JU0QT#BTFE8PSLqPX • )JHI3FMJBCJMJUZ • 3PCVTU"VUI 4ZTUFN 4IPVME8F.PWFUP"OPUIFS4PMVUJPO %FTJHO$POTJEFSBUJPOTGPSB/FX4ZTUFN

Slide 10

Slide 10 text

ʜ 8F DPVMEO`UGJOEPOFUIBU GJUTBMMPGUIFN

Slide 11

Slide 11 text

• 4VQQPSUGPS%JWFSTF4PVSDFT r 1.$ 7.T 1.T BOELT • *OUFSPQFSBCJMJUZXJUI&OWPZ r *OEVTUSZ4UBOEBSEY%41SPUPDPM • (JU0QT#BTFE8PSLqPX  .JSSPSJOH • )JHI3FMJBCJMJUZr .VMUJEBUBDFOUFSSFQMJDBUJPO • 3PCVTU"VUI 4ZTUFN 8BJU$FOUSBM%PHNB4VQQPSUT %FTJHO$POTJEFSBUJPOTGPSB/FX4ZTUFN

Slide 12

Slide 12 text

"HFOEB • #BDLHSPVOE$POUFYU • 0VS$IBMMFOHFT • $FOUSBM%PHNB$POUSPM1MBOF • 4JEFDBSMFTT4FSWJDF.FTI • 3FDBQ'VUVSF8PSL

Slide 13

Slide 13 text

:PVS"QQ $POUSPM1MBOF • 4FSWJDFSFHJTUSZ • 1PMJDJFT • "DDFTTDPOUSPM • -PBECBMBODJOH • ;POFBXBSFSPVUJOH • "VUPNBUJDSFUSJFT • $JSDVJUCSFBLFST • ʜ Your Pod Your Pod Your Pod Your Pod Your Pod 1IZTJDBM BOE7JSUVBM .BDIJOFT • "DDFTTDPOUSPM • $PODVSSFODZDPOUSPM • 5SBGpDDPOUSPM • .FUSJDT • ʜ Y%41SPUPDPM 1SPKFDU.BOBHFNFOU 5PPM 1.$ 0UIFS "QQ 0VUCPVOE 4JEFDBS *OCPVOE 4JEFDBS 0UIFS "QQ • "DDFTTDPOUSPM • $MJFOUTJEFMPBECBMBODJOH • $JSDVJUCSFBLFS • "VUPNBUJDSFUSJFT • ʜ ,T&OEQPJOU1MVHJO %ZOBNJD3FHJTUSBUJPO

Slide 14

Slide 14 text

'SPN-FHBDZ4DIFNBUPY%43FTPVSDFT // Legacy schema { "zone": "DC-1", "groups": [ { "name": "iPad" } ], "pmcProjectId": "foo", "pmcFarmId": "foo-BETA", "hostname": "foo-beta1-dev", "ip": "10.10.10.11", "port": 8080, "weight": 1000, "status": "NORMAL", "slow_start": 0.05 }, ... // xDS resources "locality": { "zone": "DC-1" }, "lbEndpoints": [ { "endpoint": { "address": { "socketAddress": { "address": "10.10.10.11", "portValue": 8080 } }, "hostname": "foo-beta1-dev" }, "metadata": { "filterMetadata": { "jp.co.lycorp.attributes": { "slowStart": 0.05 } } }, "loadBalancingWeight": 1000, "healthStatus": "HEALTHY" }, ... #VJMEZPVSPXOQMVHJOBOETFBNMFTTMZJOUFHSBUFXJUIY%4Š JU`TFBTJFSUIBOZPVUIJOL

Slide 15

Slide 15 text

'SPNLT$POUSPM1MBOFUPY%43FTPVSDFT Control Plane Watch Changes // Registered via XdsKubernetesService // on Central Dogma { "name": "groups/foo/k8s/endpointAggregators/foo/beta", "clusterName": "groups/foo/k8s/clusters/foo/beta", "localityLbEndpoints": [ { "watcher": { "serviceName": "foo-beta", "portName": "foo-port", "kubeconfig": { "controlPlaneUrl": "https://foo.com/v1/abcdef-ghijk", "credentialId": "foo-beta-cred" } }, "locality": { "zone": "dc-1" } }] }

Slide 16

Slide 16 text

"VUPNBUJD3FHJTUSBUJPOPO4UBSUVQ // Register via gRPC or HTTP API. rpc RegisterLocalityLbEndpoint(RegisterLocalityLbEndpointRequest) returns (LocalityLbEndpoint) { option (google.api.http) = { patch: "/api/v1/xds/{endpoint_name=groups/*/endpoints/**}:registerLocalityLbEndpoint" body: "locality_lb_endpoint" }; }

Slide 17

Slide 17 text

• "TFSWJDFNFTIDPOUSPMQMBOF • *NQMFNFOUTUIFJOEVTUSZTUBOEBSEY%4QSPUPDPM • %FTJHOFEXJUI-:`TIFUFSPHFOFPVTJOGSBTUSVDUVSFJONJOE • "MMFYJTUJOH$FOUSBM%PHNBBEWBOUBHFT • (JU0QT#BTFE8PSLGMPX )JHI3FMJBCJMJUZ 3PCVTU"VUIPSJ[BUJPO $FOUSBM%PHNB$POUSPM1MBOF

Slide 18

Slide 18 text

"HFOEB • #BDLHSPVOE$POUFYU • 0VS$IBMMFOHFT • $FOUSBM%PHNB$POUSPM1MBOF • 4JEFDBSMFTT4FSWJDF.FTI • 3FDBQ'VUVSF8PSL

Slide 19

Slide 19 text

3FDBQ"5ZQJDBM,T"QQMJDBUJPO "VUPNBUFEEFQMPZNFOU TDBMJOH BOENBOBHFNFOUPGDPOUBJOFSJ[FEBQQMJDBUJPOT

Slide 20

Slide 20 text

3FDBQ"EEJOH*TUJPJOUPUIF1JDUVSF *OGSBTUSVDUVSFMBZFSUIBUHJWFTBQQMJDBUJPOTDBQBCJMJUJFTMJLF [FSPUSVTUTFDVSJUZ PCTFSWBCJMJUZ BOE BEWBODFEUSBGGJDNBOBHFNFOU • 4FSWJDFSFHJTUSZ • "DDFTTDPOUSPM • "EWBODFEMPBECBMBODJOH FH;POFBXBSFSPVUJOH • "VUPNBUJDSFUSJFT • $JSDVJUCSFBLFST • 

Slide 21

Slide 21 text

3FDBQ8JUI$%$1 5IFGVODUJPOBMJUZPG*TUJPDBOCFSFQMBDFEXJUIUIF$FOUSBM%PHNB$POUSPM1MBOF

Slide 22

Slide 22 text

5FDIOJDBMMZUIFFYUFSOBMBQQMJDBUJPODBOBMTPTFOESFRVFTUTUISPVHIBOFOWPZTJEFDBS /PUNBOBHFECZLTNFBOT • *ODSFBTFEEFQMPZNFOUNBOBHFNFOUDPNQMFYJUZ • "OPUIFSQPJOUPGGBJMVSF 4JODFNJHSBUJOHFWFSZTFSWJDFUPLTBUPODFNBZOPUCFUSJWJBM $BMMJOHGSPN&YUFSOBM&OWJSPONFOUT

Slide 23

Slide 23 text

"MMPGUIFVTVBMHPPEJFT • ;FSPUSVTUTFDVSJUZ PCTFSWBCJMJUZ BOEBEWBODFEUSBGpDNBOBHFNFOU "EEFECPOVT • -FTTOFUXPSLIPQT MFTTMBUFODZ BOEMFTTQPJOUTPGGBJMVSFT (PJOH4JEFDBSMFTT

Slide 24

Slide 24 text

"SNFSJB JTBNJDSPTFSWJDFGSBNFXPSLVTFEFYUFOTJWFMZXJUIJO-: (PJOH4JEFDBSMFTTXJUI"SNFSJB

Slide 25

Slide 25 text

4P 8IBUJT"SNFSJB "SNFSJB JTZPVSHPUPNJDSPTFSWJDFGSBNFXPSLGPSBOZ TJUVBUJPO:PVDBOCVJMEBOZUZQFPGNJDSPTFSWJDF MFWFSBHJOHZPVSGBWPSJUFUFDIOPMPHJFT JODMVEJOHH31$  5ISJGU ,PUMJO 3FUSPpU 3FBDUJWF4USFBNT 4QSJOH#PPUBOE %SPQXJ[BSE *UJTPQFOTPVSDFECZUIFDSFBUPSPG/FUUZBOEIJT DPMMFBHVFTBU-:$PSQPSBUJPO // A simple HTTP client var client = WebClient.of("http://my-endpoint.com") .decorator(CircuitBreakerClient.newDecorator(..)) .decorator(RetryingClient.newDecorator(..)) .build(); // send a GET request var response = client.get("/").aggregate().join(); 8IBUJG"SNFSJB PGGFSFEBTQFDJBMDMJFOUXIJDI DPVMEBDUBTBEBUBQMBOF

Slide 26

Slide 26 text

"SNFSJB BTB%BUB1MBOF var bootstrapStr = """ dynamic_resources: lds_config: ... cluster_name: controlplane_cluster static_resources: clusters: - name: controlplane_cluster load_assignment: ... socket_address: address: my-control-plane.com """; var xdsBootstrap = XdsBootstrap.of(fromYaml(bootstrap)); %JTDMBJNFS5IFEFTJHOBOEJNQMFNFOUBUJPOJTJOQSPHSFTTBOENBZCF TVCKFDUUPDIBOHF "UZQJDBMFOWPZCPPUTUSBQ DPOpHVSBUJPO 1BSTFUIFCPPUTUSBQJOUPBO9ET#PPUTUSBQ5IF"SNFSJB DMJFOU XJMMVTFUIJTCPPUTUSBQJOGPSNBUJPOUPBDUBTBEBUBQMBOF 8IJDIDPOUSPMQMBOFTIPVMEXFVTFUPGFUDISFTPVSDFT "SFTPVSDF JTBDPMMFDUJPOPGQPMJDJFTPGIPXUPSPVUFSFRVFTUT %FGJOFTIPXUPDPOOFDUUPB DPOUSPMQMBOF    

Slide 27

Slide 27 text

"SNFSJB BTB%BUB1MBOF var xdsBootstrap = XdsBootstrap.of(bootstrap); var client = WebClient.of(ofListener("my-listener", xdsBootstrap)); var res = client.get("/").aggregate().join(); Disclaimer: The design and implementation is in progress and may be subject to change How to connect to the control plane. Which resource should be used to route requests. A resource represents a collection of routing policies. The client automatically fetches the resource from the control plane and sends requests, effectively acting as a data plane. Create a client based on the resource name and the bootstrap configuration.    

Slide 28

Slide 28 text

%ZOBNJD3FDPOGJHVSBUJPO var xdsBootstrap = XdsBootstrap.of(bootstrap); var client = WebClient.of(ofListener("my-listener", xdsBootstrap)); var res = client.get("/").aggregate().join(); // A simple HTTP client var client = WebClient.of("http://my-endpoint.com") .decorator(CircuitBreakerClient.newDecorator(..)) .decorator(RetryingClient.newDecorator(..)) .build(); // send a GET request var response = client.get("/").aggregate().join(); /PUJDFUIBU • /POFFEUPTQFDJGZUIFFOEQPJOU63- • /POFFEUPTQFDJGZ$JSDVJU#SFBLFS DPOGJHVSBUJPOT • /POFFEUPTQFDJGZ3FUSZJOH DPOGJHVSBUJPOT &WFSZUIJOHJT%ZOBNJD

Slide 29

Slide 29 text

*NBHJOFHPJOHDPNQMFUFMZ4JEFDBSMFTT We can still use envoy in k8s, but we can also go completely sidecar-less. (if you would like!) Less hops means: • Less latency • Less points of failures • Less complexity • Easier debugging

Slide 30

Slide 30 text

)PX-*/&TFOET1VTI3FRVFTUT Tune into the  Main Room C session for details on how this was done. "Pushsphere: LINE's Secret Recipe for Reliable, Prompt and High-Volume Push Notifications"

Slide 31

Slide 31 text

"HFOEB • #BDLHSPVOE$POUFYU • 0VS$IBMMFOHFT • $FOUSBM%PHNB$POUSPM1MBOF • 4JEFDBSMFTT4FSWJDF.FTI • 3FDBQ'VUVSF8PSL

Slide 32

Slide 32 text

• $FOUSBM%PHNB$POUSPM1MBOF • "TFSWJDFNFTIDPOUSPMQMBOF EFTJHOFEGPSIFUFSPHFOFPVTJOGSBTUSVDUVSF • *OIFSJUTBMMUIFQSPWFOTUSFOHUITPG$FOUSBM%PHNB • (PJOH4JEFDBSMFTT • $BMMLTTFSWJDFTGSPNFYUFSOBMFOWJSPONFOUT FBTJFSNJHSBUJPO • -FTTDPNQMFYJUZ MFTTIPQT MFTTGBJMVSF • 4VQQPSUFECZ"SNFSJB 3FDBQ

Slide 33

Slide 33 text

• $FOUSBM%PHNB$POUSPM1MBOF • 6TFS*OUFSGBDF • *NQSPWFE3FTPVSDF"VUIPSJ[BUJPO • 4JEFDBSMFTT%BUB1MBOF • #FUUFS*OUFSPQXJUIUIFY%41SPUPDPM • %FCVH.FOV • $VTUPN'JMUFS3FHJTUSZ 'VUVSF8PSL 8FDBOCVJMEUIJTUPHFUIFS

Slide 34

Slide 34 text

HJUIVCDPNMJOFDFOUSBMEPHNB HJUIVCDPNMJOFBSNFSJB