Blog

Kubernetes-palveluiden välitys Traefikilla

MAR 30, 2017

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 }'done

Jos 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: 8

Kun 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" created

Tarkistetaan deployment

> kubectl get deployments NAME              DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE nginx-deployment  3        3        3           0          4s

Hetken 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          3m

Ota 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: ClusterIP

Tä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" created

Tarkista 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           1m

Nä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: 80

Luo ingress suorittamalla

> kubectl create -f nginx-ingress.yaml ingress "nginxingress" created

Traefikin 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/token

Tarvitset 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.toml

tai 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" &gt;&gt; /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.

Traefik Nginx

Avaa nyt selaimeen välilehti ja siirry osoitteeseen http://nginx.example.com. Sinun pitäisi nähdä nginxin etusivu HTTP:n kautta tarjoiltuna.

nginx

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.toml

Jos Traefik on käynnissä palveluna, toimi näin

sudo service traefik stop sudo service traefik start

Avaa 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ä.

Nginx not safe
  • Cloud

Subscribe to our newsletter