簡體   English   中英

Linkerd,K8和路由

[英]Linkerd, k8s and routing

我正在嘗試讓我了解k8s和linkerd。 我之前使用過docker-compose,之前使用過consul。

我還沒有完全弄清楚自己在做什么錯,所以如果有人可以檢查邏輯並查看錯誤出在哪里,我會很高興。

我在本地使用minikube ,並希望使用GCE進行部署。

我基本上是想得到一個簡單的容器,該容器運行在k8s和鏈接器中運行的節點應用程序,但是對於某些原因,我無法使路由正常工作。

config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: l5d-config
data:
  config.yaml: |-
    admin:
      port: 9990

    namers:
    - kind: io.l5d.k8s
      experimental: true
      host: localhost
      port: 8001

    routers:
    - protocol: http
      label: outgoing
      baseDtab: |
        /srv        => /#/io.l5d.k8s/default/http;
        /host       => /srv;
        /http/*/*   => /host;
        /host/world => /srv/world-v1;
      interpreter:
        kind: default
        transformers:
        - kind: io.l5d.k8s.daemonset
          namespace: default
          port: incoming
          service: l5d
      servers:
      - port: 4140
        ip: 0.0.0.0

    - protocol: http
      label: incoming
      baseDtab: |
        /srv        => /#/io.l5d.k8s/default/http;
        /host       => /srv;
        /http/*/*   => /host;
        /host/world => /srv/world-v1;
      interpreter:
        kind: default
        transformers:
        - kind: io.l5d.k8s.localnode
      servers:
      - port: 4141
        ip: 0.0.0.0

然后我部署了一個deamonset了解的deamonset ,這是使用linkerd的最明智的方法

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  labels:
    app: l5d
  name: l5d
spec:
  template:
    metadata:
      labels:
        app: l5d
    spec:
      volumes:
      - name: l5d-config
        configMap:
          name: "l5d-config"
      containers:
      - name: l5d
        image: buoyantio/linkerd:0.8.6
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        args:
        - /io.buoyant/linkerd/config/config.yaml
        ports:
        - name: outgoing
          containerPort: 4140
          hostPort: 4140
        - name: incoming
          containerPort: 4141
        - name: admin
          containerPort: 9990
        volumeMounts:
        - name: "l5d-config"
          mountPath: "/io.buoyant/linkerd/config"
          readOnly: true

      - name: kubectl
        image: buoyantio/kubectl:v1.4.0
        args:
        - "proxy"
        - "-p"
        - "8001"

然后,我使用構建的docker容器部署復制控制器:

apiVersion: v1
kind: ReplicationController
metadata:
  name: testservice
spec:
  replicas: 3
  selector:
    app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      dnsPolicy: ClusterFirst
      containers:
      - name: service
        image: eu.gcr.io/xxxx/testservice:1.0
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: http_proxy
          value: $(NODE_NAME):4140
        command:
        - "pm2-docker"
        - "processes.json"
        ports:
        - name: service
          containerPort: 8080

然后,當我進入minikube service l5d將顯示服務和鏈接器,但沒有得到應顯示的默認頁面。

為了測試一切是否正常,我構建了另一個服務,該服務直接指向端口8080,然后它可以工作,但不能通過鏈接器代理。

有人可以發現錯誤嗎? 非常感謝。

我們在鏈接器Slack中對此進行了詳細討論。 問題不在於配置本身,而在於沒有在請求上設置主機頭的事實。

上面的配置將基於主機頭進行路由,因此此頭必須與服務名稱相對應。 curl -H "Host: world" http://$IPADDRESS (或其他任何方式)會起作用。

(也可以根據請求的其他位進行路由,例如HTTP請求的URL路徑。)

多虧了linkerd松弛通道以及進一步的嘗試,我設法弄清了這一點,並構建了兩個相互通信的服務,即發布和獲取數據。 這只是為了擺脫linkerd的困擾。 有空的時候,我會寫一篇有關它的教程,以便其他人可以從中學習。

我在復制控制器中缺少一個kubectl代理:

- name: kubectl
  image: buoyantio/kubectl:1.2.3
  args:
   - proxy
   - "-p"
   - "8001"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM