Mae eich gwasanaeth Compose yn mynd i amser allan yn erbyn API y mae’r porwr ar yr un peiriant yn ei agor heb unrhyw gŵyn. Y gwahaniaeth hwnnw yw’r cliw: mae’r cais sy’n gweithio yn gadael gwesteiwr â thwnnel VPN, ac mae’r cais sy’n hongian yn gadael cynhwysydd â’i stac rhwydwaith ei hun. Nid oes unrhyw beth y tu mewn i’r cynhwysydd yn gwybod llwybrau’r twnnel, felly mae’r cyrchfan breifat yn parhau’n anghyraeddadwy sut bynnag y sillafir yr enw. Yr atgyweiriad yw naid fwriadol drwy’r gwesteiwr, nid tabl llwybrau mwy cyfrwys.

Dechreuwch gyda pham mae’r ddau lwybr yn wahanol, yna penderfynwch ble y dylai’r twnnel fyw.

Pam mae’r gwesteiwr yn gweithio a’r cynhwysydd ddim

Mae codi’r twnnel yn rhoi rhyngwyneb i’r gwesteiwr, set o lwybrau ac, fel arfer, cofnod resolver a ddarperir gan y VPN. Nid yw cynhwysydd yn etifeddu dim ohono: mae’n dechrau ag un rhyngwyneb ar bont yr injan a llwybr diofyn sy’n pwyntio at y bont honno. Mae llwybrau a osodir ar y gwesteiwr yn anweledig i unrhyw beth sy’n rhedeg y tu mewn i’r gofod enw hwnnw.

Dyna pam mae’r symptomau’n edrych yn anghyson yn hytrach nag yn syml wedi torri. Mae’r gwesteiwr yn datrys yr enw preifat ac yn cysylltu, oherwydd bod yr enw a’r llwybr ill dau yn bodoli yno. Mae’r cynhwysydd yn anfon ei becyn at gyfeiriad preifat na all unrhyw beth ar lwybr y bont ei gyrraedd, ac mae’r cais yn mynd i amser allan. Nid yw ychwanegu’r enw at ffeil hosts y cynhwysydd yn newid dim, oherwydd mae’r cyfeiriad ei hun yn anghyraeddadwy o ble mae’r cynhwysydd yn eistedd.

Cyrhaeddwch y gwesteiwr o du mewn i’r cynhwysydd

Mae proses yn y cynhwysydd sy’n deialu localhost yn deialu’r cynhwysydd. Mae Docker Desktop yn cyhoeddi host.docker.internal fel enw sy’n pwyntio’n ôl at y peiriant sy’n rhedeg yr injan; mae injans Linux yn ei adael heb ei ddiffinio oni bai bod y gwasanaeth yn gofyn amdano, a dyna a wna’r mapio isod. Gyda hynny mae’r cymhwysiad yn anelu at enw a phorth yn lle’r cyfeiriad preifat.

services:
  app:
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      INTERNAL_API_HOST: "host.docker.internal:8666"

Mae’r twnnel yn aros ar ochr y gwesteiwr i’r naid, a’r porth yn y newidyn hwnnw yw’r un y bydd y procsi yn gwrando arno. Mae cynhwysydd sy’n colli’r twnnel nawr yn methu ar un naid hysbys yn lle ceisio llwybr na chafodd erioed.

Dewiswch ble mae’r twnnel yn byw

Mae tair ffurf yn bosibl ar gyfer gwasanaeth Compose sydd angen API preifat, ac maent yn wahanol o ran pa broses sy’n berchen ar y twnnel. Gall cleient VPN redeg y tu mewn i ddelwedd y cynhwysydd, sy’n golygu datgelu dyfais twnnel a rhoi’r gallu gweinyddu rhwydwaith sy’n dod gyda hi. Gall y cymhwysiad rannu gofod enw rhwydwaith cynhwysydd twnnel ar wahân, fel bod y ddau broses yn gweld un stac ac un tabl llwybrau. Neu gall y twnnel aros ar y gwesteiwr, gyda blaenyrrwr cul o’r gwesteiwr i’r cynhwysydd.

Mae’r ddau gyntaf yn tynnu ffeiliau proffil, ymddygiad ailgysylltu a pholisi resolver i mewn i’r prosiect, ac maent yn gwneud pob gwasanaeth yn y ffeil yn dibynnu ar iechyd y twnnel. Mae hynny’n ormod o gyplysu ar gyfer un alwad API. Ar gyfer stac datblygu sy’n darllen un pwynt terfyn mewnol, y blaenyrrwr ar ochr y gwesteiwr yw’r newid lleiaf sy’n dal i gadw manylion mewngofnodi lle mae tîm y platfform yn eu rheoli.

Cyhoeddwch un llwybr cul ar y gwesteiwr

Dechreuwch o’r hyn y mae’r blaenyrrwr yn ei etifeddu: rhedegwch ef dan y cyfrif sy’n berchen ar y twnnel ac mae ei socedi allanol yn cymryd llwybrau’r gwesteiwr a resolver y gwesteiwr. Mae un bloc location nginx yn cwmpasu un llwybr.

server {
    listen 8666;
    location /search/ {
        proxy_pass http://10.20.30.40:8090/;
        proxy_set_header Host internal-api.example;
        proxy_read_timeout 60s;
    }
}

Cymrwch y cyfeiriad a’r porth fel rhai dros dro a rhowch y pâr y mae’r API yn gwrando arno mewn gwirionedd. Mae pob upstream pellach yn haeddu ei floc location ei hun, a dylai pob bloc dderbyn dim ond y llwybrau y mae’r gwasanaeth hwn yn eu galw, fel na all y procsi ddod yn ddrws cyffredinol i’r rhwydwaith preifat. Rhwymwch y gwrandawr i gyfeiriad y bont ar gyfer cleientiaid sy’n cyrraedd drwy host-gateway, i loopback yn unig pan fydd y cleient yn rhannu gofod enw rhwydwaith y gwesteiwr, ac yn byth at 0.0.0.0. Dewiswch borth sydd dal yn rhydd hefyd: mae rhif sydd eisoes wedi’i gymryd yn gadael y procsi heb wrando tra bo’r cynhwysydd yn parhau i fynd i amser allan, ac ni ellir gwahaniaethu hynny oddi wrth y nam rhwydwaith y gwnaethoch ddechrau ag ef.

Porthladdoedd, enwau a’r penderfyniad TLS

Mae datrys enwau yn hollti yr un ffordd â llwybro. Mae chwiliadau cyhoeddus y cynhwysydd yn mynd drwy resolver yr injan, felly ni fydd enw preifat sy’n datrys ar y gwesteiwr yn datrys y tu mewn i’r cynhwysydd. Y procsi yw’r elfen sy’n datrys yr enw preifat, oherwydd ei fod yn etifeddu resolver y gwesteiwr.

TLS yw’r penderfyniad a ohirir ac sydd wedyn yn esbonio’r methiant nesaf. Os yw’r procsi yn anfon beitiau ymlaen heb eu cyffwrdd, mae’r cynhwysydd yn gweld tystysgrif yr API ei hun ac angen y CA mewnol yn ei storfa ymddiriedaeth. Os yw’r procsi yn terfynu TLS, mae’r ymddiriedaeth honno’n symud i’r gwesteiwr ac mae’r cymhwysiad yn dechrau adeiladu dolenni o’r pennawd host a gaiff. Dewiswch un trefniant a’i gymhwyso i bob adnodd, oherwydd mae ailgyfeiriad a gyhoeddir gan y llall yn pwyntio at enw gwesteiwr na all y cynhwysydd ei ddatrys.

Gwiriwch o du mewn i’r gwasanaeth

Anfonwch y cais o’r cynhwysydd, nid o’r gwesteiwr: curl plaen yn erbyn llwybr y procsi, yna archwiliad iechyd y cymhwysiad ei hun. Pan fydd y procsi yn ateb ond y cymhwysiad yn dal i fethu, cymharwch dri pheth: yr URL sylfaen y mae’n ei adeiladu, unrhyw newidyn procsi yn ei amgylchedd, a’r CA y mae’n ymddiried ynddo. Maent i gyd yn amgylchedd a logiau’r cynhwysydd, ac mae trwsio unrhyw un ohonynt yn gadael y VPN yn llonydd.

Ysgrifennwch y trefniant a ddewiswyd yn README y prosiect tra bo’n ffres. Fel arall bydd y person nesaf sy’n taro’r amser allan hwn yn treulio’r un prynhawn yn ailddarganfod bod y twnnel yn byw ar y gwesteiwr.

Erthyglau cysylltiedig