Kurkistus palveluiden löytämisen uuteen maailmaan
Henrik Hoegh
Henrik is a DevOps Consultant based in Aarhus. He specializes in Docker, Kubernetes and everything Atlassian. Away from the office Henrik designs loudspeakers and takes a keen interest in quantum physics and astrophotography.
Näin välität Kubernetesissa toimivan palvelun Traefikin kautta load balancerina ja proxyna.
Kubernetes-palveluiden välittäminen proxyn kautta
Edellisessä Traefik-blogikirjoituksessamme näytimme, miten helposti hostissa toimivia Docker-kontteja voi välittää proxyn kautta. Tällä kertaa näytämme, miten helposti Kubernetes-klusterin kontteja voi välittää Traefikin kautta.
Traefik on service discovery -ympäristöihin suunniteltu reverse proxy, joka on erityisen hyödyllinen Kubernetesissa toimiville palveluille.
Tässä blogikirjoituksessa tarkastelemme, miten Kubernetesissa toimiva palvelu voidaan välittää Traefikin kautta load balancerina ja proxyna.
Otamme käyttöön palvelun Kubernetesissa ja käytämme sitä Traefikin kautta DNS-nimellä. Luomme Kubernetesissa ingress-säännön, jolla määritämme reitityksen. Traefik tunnistaa tämän säännön ja määrittää asetuksensa automaattisesti.
Vaatimukset
Tarvitset toimivan Kubernetes-klusterin ja koneen, jossa load balancer toimii. Traefikia ajavalle koneelle on luotava reitit, jotta se voi käyttää podeja niiden ClusterIP-osoitteiden kautta. Tämä ei kuulu tämän artikkelin aihepiiriin, mutta tässä vinkki:
K8S_NODES=$(kubectl get nodes | grep "Ready" | cut -d" " -f1 | tr '\n' '\t')for node in $K8S_NODES; do NODE_IP=$(kubectl describe node $node \ | egrep -w "Addresses" \ | tr '\n' '\t' \ | cut -d"," -f1 \ | rev \ | cut -d$'\t' -f1 \ | rev) kubectl describe node ${node} \ | egrep -w "Name:|PodCIDR" \ | tr '\n' '\t' \ | awk -v IP=$NODE_IP '{ print "sudo route add -net " , $4 , " gw " , IP }'doneJos lisäät worker-nodeja, sinun on lisättävä myös niille uudet reitit.
Yllä oleva esimerkki olettaa, että käytät CNI-verkotusta. Se ei toimi overlay-verkoissa. Tällöin load balanceria ajavan koneen on oltava samassa overlay-verkossa.
Ota käyttöön deployment, palvelu ja ingress Kubernetesissa
Ota NGINX Deployment käyttöön Kubernetesissa
Luomme ensin NGINXille deploymentin, jotta voimme myöhemmin päivittää ja skaalata sitä sekä pitää sen käynnissä.
Luo tiedosto nimeltä nginx-deployment.yaml ja lisää siihen seuraava sisältö
apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: nginx-deploymentspec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 8Kun suoritamme seuraavan komennon, yllä oleva YAML luo deploymentin, replica-setin ja kolme nginx 1.7.9 -versiota ajavaa podia
> kubectl create -f nginx-deployment.yaml deployment "nginx-deployment" createdTarkistetaan deployment
> kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 3 3 3 0 4sHetken kuluttua arvon “AVAILABLE=0” pitäisi muuttua arvoksi 3, minkä jälkeen voit jatkaa.
Varmistetaan nyt, että podit ovat käynnissä.
> kubectl get podsNAME READY STATUS RESTARTS AGEnginx-deployment-4087004473-clz6x 1/1 Running 0 3mnginx-deployment-4087004473-jwz0k 1/1 Running 0 3mnginx-deployment-4087004473-zfkzn 1/1 Running 0 3mOta NGINX-palvelu käyttöön Kubernetesissa
Seuraavaksi luomme palvelun: Kubernetes-objektin, jolla on kiinteä IP-osoite ja Cluster DNS deploymentillemme.
Luo tiedosto nimeltä nginx-service.yaml ja lisää siihen seuraava sisältö
apiVersion: v1kind: Servicemetadata: labels: name: nginxservice name: nginxservicespec: ports: # The port that this service should serve on. - port: 80 # Label keys and values that must match in order to receive traffic for this service. selector: app: nginx type: ClusterIPTämä luo Kubernetesissa palveluobjektin, jolla on ClusterIP ja podiemme endpoint-IP-osoitteet. Jos pod lopetetaan, uusi käynnistetään ja palvelun endpoint päivitetään.
Luo palvelu seuraavasti
> kubectl create -f nginx-service.yaml service "nginxservice" createdTarkista palvelu suorittamalla
> kubectl get servicesNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes 10.32.0.1 <none> 443/TCP 3dnginxservice 10.32.0.102 <none> 80/TCP 1mNäemme, että uuden palvelumme ClusterIP on 10.32.0.102.
Ota ingress käyttöön Kubernetesissa
Tähän asti olemme käyttäneet Kubernetesia samalla tavalla kuin ennen ingress-objektin käyttöönottoa.
Määritämme nyt ulkomaailmasta NGINX-palveluumme johtavan reitityssäännön luomalla tiedoston nginx-ingress.yaml, johon lisätään seuraava YAML:
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: nginxingressspec: rules: - host: nginx.example.com http: paths: - path: / backend: serviceName: nginxservice servicePort: 80Luo ingress suorittamalla
> kubectl create -f nginx-ingress.yaml ingress "nginxingress" createdTraefikin asentaminen
Klusterimme on nyt valmis. Meidän tarvitsee enää asentaa ja määrittää Traefik sekä lisätä merkintä hosts-tiedostoon.
Lataa binääritiedosto
Siirry GitHubiin ja lataa uusin vakaa Traefik-julkaisu arkkitehtuurillesi ja tee siitä suoritettava. Tällä hetkellä versio on 1.1.2.
https://github.com/containous/traefik/releases/latest
wget https://github.com/containous/traefik/releases/download/v1.1.2/traefik_linux-amd64 mv traefik_linux-amd64 traefik chmod u+x traefik </code>Luo asetustiedosto
Luo traefikin kanssa samaan kansioon tiedosto nimeltä traefik.toml ja lisää siihen seuraava sisältö:
[web] address = ":8080" ReadOnly = true [kubernetes] # Kubernetes server endpoint endpoint = "http://controller.example.com:8080" namespaces = ["default","kube-system"]Yllä oleva määritys kertoo Traefikille, että se palvelee sisältöä vain kahdesta nimiavaruudesta: ”default” ja ”kube-system”. Jos haluat Traefikin palvelevan kaikkia nimiavaruuksia, poista rivi.
Osio [web] kertoo Traefikille, että sen tulee tarjota hallintapaneeli portissa 8080. Se on kätevä, sillä se näyttää kaikki palvelut, joita Traefik parhaillaan palvelee.
Osio [kubernetes] kuvaa, miten Traefikin tulee muodostaa yhteys Kubernetesin kube-apiserveriin. Tässä esimerkissä kube-apiserver kuuntelee portissa 8080 osoitteessa controller.example.com. Jos käytät SSL:ää ja kuuntelet porttia 8443, voit määrittää varmenteen ja tokenin näissä kahdessa tiedostossa:
/var/run/secrets/kubernetes.io/serviceaccount/ca.crt/var/run/secrets/kubernetes.io/serviceaccount/tokenTarvitset nämä kaksi tiedostoa, vaikka et käyttäisi tokenia tai varmennetta. Luo siinä tapauksessa kaksi tyhjää tiedostoa.
Käynnistä Traefik
Käynnistä nyt Traefik joko manuaalisesti
./traefik -c traefik.tomltai jos haluat Traefikin toimivan palveluna, voit käyttää tätä mallina
\[Unit] Description=Traefik proxy server Documentation=https://github.com/containous/traefik [Service] ExecStart=/root/traefik/traefik \ -c /root/traefik/traefik.toml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target </code>Lisää DNS hosts-tiedostoon
Määritimme ingress-objektissamme, että nginx-palvelumme tulee olla saavutettavissa DNS-nimellä nginx.example.com. Koska minulla ei ole DNS-palvelinta, luon hosts-tiedostooni merkinnän:
Korvaa [load-balancer-ip] Traefikia käyttävän koneen IP-osoitteella.
su -c 'echo "[load-balancer-ip] nginx.example.com" >> /etc/hosts'Palvelumme testaaminen
Siirry ensin Traefikin hallintapaneeliin ja varmista, että nginx-palvelu näkyy luettelossa osoitteessa http://[localbalancer-ip]:8080. Sinun pitäisi nähdä hallintapaneeli sekä nginxin front-end ja back-end. Front-end kuvaa säännön ja back-end podimme.
Avaa nyt selaimeen välilehti ja siirry osoitteeseen http://nginx.example.com. Sinun pitäisi nähdä nginxin etusivu HTTP:n kautta tarjoiltuna.
Pyyntösi kuormantasaataan Kubernetes-klusterissamme käynnissä olevien kolmen nginx-podin välillä. Kokeile pysäyttää yksi niistä ja huomaa, että voit painaa F5-näppäintä niin usein kuin haluat. Traefik huomaa tilanteen ja määrittää itsensä uudelleen. Kun pysäytetyn podin tilalle käynnistyy uusi pod, myös Traefik palvelee sitä automaattisesti. Palveluiden löydettävyys parhaimmillaan.
SSL:n lisääminen ja http → https-uudelleenohjaus
Yllä oleva esimerkki on toimiva, mutta ei hyödyllinen tuotannossa, sillä se palvelee vain http-pyyntöjä. Haluamme käyttää SSL:ää https:n kautta. Katsotaan siis, kuinka helppoa se on.
Muokkaa traefik.toml-tiedostoa lisäämällä http → https-uudelleenohjaus ja sertifikaatit seuraavasti
defaultEntryPoints = ["http", "https"][entryPoints][entryPoints.http] address = ":80"[entryPoints.http.redirect] entryPoint = "https"[entryPoints.https] address = ":443"[entryPoints.https.tls][[entryPoints.https.tls.certificates]]CertFile = "/certs/kubernetes.pem"KeyFile = "/certs/kubernetes-key.pem"[web]address = ":8080"ReadOnly = true[kubernetes]# Kubernetes server endpointendpoint = "http://controller.example.com:8080"namespaces = ["default","kube-system"]Lisäsimme kaksi oletussyöttöpistettä (http ja https). Syöttöpisteiden osiossa määritämme uudelleenohjauksen http:stä https:ään portista 80 porttiin 433.
Seuraavaksi on sertifikaattiosio, jossa määritämme sertifikaatin ja avaintiedoston. Siinä kaikki.
Käynnistä nyt Traefik uudelleen joko painamalla Ctrl + C ja suorittamalla se uudelleen tai pysäyttämällä palvelu ja käynnistämällä sen uudelleen.
Jos Traefik ei ole käynnissä palveluna
ctrl + c ./traefik -c traefik.tomlJos Traefik on käynnissä palveluna, toimi näin
sudo service traefik stop sudo service traefik startAvaa nyt selaimessa http://nginx.example.com ja varmista, että sinut ohjataan https:ään.
Jos käytät itse allekirjoitettuja sertifikaatteja, selain näyttää varoituksen. Lisää vain poikkeus ja jatka.
Ja voilà: nginx palvellaan Kubernetes-klusterista https:n kautta vain 20 rivin staattisella konfiguraatiolla ja palveluiden löydöllä.
- Cloud
Subscribe to our newsletter
Related blogs