Linkerd、k8s 和路由
Linkerd, k8s and routing
我目前正在努力了解 k8s 和 linkerd。我之前用过 docker-compose 和 consul 之前。
我还没有完全弄清楚我做错了什么,所以如果有人能检查逻辑并看看错误在哪里,我会很高兴。
我在本地使用 minikube
并且想使用 GCE 进行部署。
我基本上是在尝试获得一个简单的容器,它在 k8s 和 linkerd 中运行节点应用程序 运行,但由于某些原因,我无法使路由正常工作。
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
,据我所知,这是使用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
时,显示了服务和 linkerd,但我没有得到应该显示的默认页面。
为了测试是否一切正常,我构建了另一个服务,它直接指向端口 8080 然后它可以工作,但不是通过 linkerd 代理。
有人能找出错误吗?非常感谢。
我们在 linkerd Slack 中讨论了一些额外的细节。问题不在于配置本身,而在于请求中未设置主机 header。
以上配置会根据主机header进行路由,所以这个header必须对应一个服务名。 curl -H "Host: world" http://$IPADDRESS
(或其他)会起作用。
(也可以根据请求的其他位进行路由,例如 HTTP 请求中的 URL 路径。)
多亏了 linkerd 松弛通道和一些进一步的尝试,我设法弄清楚并构建了两个相互通信、发布和获取数据的服务。这只是为了掌握 linkerd 的窍门。有时间我会写一篇教程,让其他人可以从中学习。
我的复制控制器中缺少 kubectl 代理:
- name: kubectl
image: buoyantio/kubectl:1.2.3
args:
- proxy
- "-p"
- "8001"
我目前正在努力了解 k8s 和 linkerd。我之前用过 docker-compose 和 consul 之前。
我还没有完全弄清楚我做错了什么,所以如果有人能检查逻辑并看看错误在哪里,我会很高兴。
我在本地使用 minikube
并且想使用 GCE 进行部署。
我基本上是在尝试获得一个简单的容器,它在 k8s 和 linkerd 中运行节点应用程序 运行,但由于某些原因,我无法使路由正常工作。
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
,据我所知,这是使用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
时,显示了服务和 linkerd,但我没有得到应该显示的默认页面。
为了测试是否一切正常,我构建了另一个服务,它直接指向端口 8080 然后它可以工作,但不是通过 linkerd 代理。
有人能找出错误吗?非常感谢。
我们在 linkerd Slack 中讨论了一些额外的细节。问题不在于配置本身,而在于请求中未设置主机 header。
以上配置会根据主机header进行路由,所以这个header必须对应一个服务名。 curl -H "Host: world" http://$IPADDRESS
(或其他)会起作用。
(也可以根据请求的其他位进行路由,例如 HTTP 请求中的 URL 路径。)
多亏了 linkerd 松弛通道和一些进一步的尝试,我设法弄清楚并构建了两个相互通信、发布和获取数据的服务。这只是为了掌握 linkerd 的窍门。有时间我会写一篇教程,让其他人可以从中学习。
我的复制控制器中缺少 kubectl 代理:
- name: kubectl
image: buoyantio/kubectl:1.2.3
args:
- proxy
- "-p"
- "8001"