安装Conduit

本文档指导您如何在kubernetes上安装Conduit service mesh。

前提条件

  • kubernetes版本为1.8或以上

用到的镜像如下:

  • buoyantio/kubectl:v1.6.2
  • gcr.io/runconduit/controller:v0.1.0
  • gcr.io/runconduit/web:v0.1.0
  • prom/prometheus:v1.8.1

其中位于gcr.io的镜像我备份到了DockerHub:

  • jimmysong/runconduit-web:v0.1.0
  • jimmysong/runconduit-controller:v0.1.0

另外两个镜像本身就可以从DockerHub上下载。

部署

release页面上下载conduit的二进制文件。

使用conduit install命令生成了用于部署到kubernetes中yaml文件,然后修改文件中的镜像仓库地址为你自己的镜像地址。

  1. conduit install>conduit-0.1.0.yaml
  2. # 修改完镜像地址执行
  3. kubectl apply -f conduit-0.1.0.yaml

注意:Conduit官方给出的yaml文件中不包括RBAC授权,我重新修改了,增加了RBAC和ServiceAccount。

使用kubectl proxy来开放外网访问conduit dashboard:

  1. kubectl proxy --address='172.20.0.113' --port=8001 --accept-hosts='^*$'

在浏览器中访问http://172.20.0.113:8001/api/v1/namespaces/conduit/services/web:http/proxy/servicemesh将看到如下页面:

Conduit dashboard

Conduit inject

Conduit注入的时候需要用到如下两个镜像:

  • gcr.io/runconduit/proxy:v0.1.0
  • gcr.io/runconduit/proxy-init:v0.1.0

我将其备份到了DockerHub:

  • jimmysong/runconduit-proxy:v0.1.0
  • jimmysong/runconduit-proxy-init:v0.1.0

查看conduit向yaml文件中注入了哪些配置,我们使用my-nginx.yaml为例:

  1. conduit inject --init-image harbor-001.jimmysong.io/library/runconduit-proxy-init --proxy-image harbor-001.jimmysong.io/library/runconduit-proxy my-nginx.yaml|kubectl apply -f -

注意:只需要指定镜像名称即可,tag与使用的conduit server版本相同,会自动注入。

my-nginx.yaml的内容如下:

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. name: my-nginx
  5. spec:
  6. replicas: 2
  7. template:
  8. metadata:
  9. labels:
  10. run: my-nginx
  11. spec:
  12. containers:
  13. - name: my-nginx
  14. image: harbor-001.jimmysong.io/library/nginx:1.9
  15. ports:
  16. - containerPort: 80
  17. ---
  18. apiVersion: v1
  19. kind: Service
  20. metadata:
  21. name: my-nginx
  22. labels:
  23. app: my-nginx
  24. spec:
  25. ports:
  26. - port: 80
  27. protocol: TCP
  28. name: http
  29. selector:
  30. run: my-nginx

Conduit自动注入后生成的新的yaml文件内容如下:

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. creationTimestamp: null
  5. name: my-nginx
  6. spec:
  7. replicas: 2
  8. strategy: {}
  9. template:
  10. metadata:
  11. annotations:
  12. conduit.io/created-by: conduit/cli v0.1.0
  13. conduit.io/proxy-version: v0.1.0
  14. creationTimestamp: null
  15. labels:
  16. conduit.io/controller: conduit
  17. conduit.io/plane: data
  18. run: my-nginx
  19. spec:
  20. containers:
  21. - image: harbor-001.jimmysong.io/library/nginx:1.9
  22. name: my-nginx
  23. ports:
  24. - containerPort: 80
  25. resources: {}
  26. - env:
  27. - name: CONDUIT_PROXY_LOG
  28. value: trace,h2=debug,mio=info,tokio_core=info
  29. - name: CONDUIT_PROXY_CONTROL_URL
  30. value: tcp://proxy-api.conduit.svc.cluster.local:8086
  31. - name: CONDUIT_PROXY_CONTROL_LISTENER
  32. value: tcp://0.0.0.0:4190
  33. - name: CONDUIT_PROXY_PRIVATE_LISTENER
  34. value: tcp://127.0.0.1:4140
  35. - name: CONDUIT_PROXY_PUBLIC_LISTENER
  36. value: tcp://0.0.0.0:4143
  37. - name: CONDUIT_PROXY_NODE_NAME
  38. valueFrom:
  39. fieldRef:
  40. fieldPath: spec.nodeName
  41. - name: CONDUIT_PROXY_POD_NAME
  42. valueFrom:
  43. fieldRef:
  44. fieldPath: metadata.name
  45. - name: CONDUIT_PROXY_POD_NAMESPACE
  46. valueFrom:
  47. fieldRef:
  48. fieldPath: metadata.namespace
  49. image: harbor-001.jimmysong.io/library/runconduit-proxy:v0.1.0
  50. imagePullPolicy: IfNotPresent
  51. name: conduit-proxy
  52. ports:
  53. - containerPort: 4143
  54. name: conduit-proxy
  55. resources: {}
  56. securityContext:
  57. runAsUser: 2102
  58. initContainers:
  59. - args:
  60. - -p
  61. - "4143"
  62. - -o
  63. - "4140"
  64. - -i
  65. - "4190"
  66. - -u
  67. - "2102"
  68. image: harbor-001.jimmysong.io/library/runconduit-proxy-init:v0.1.0
  69. imagePullPolicy: IfNotPresent
  70. name: conduit-init
  71. resources: {}
  72. securityContext:
  73. capabilities:
  74. add:
  75. - NET_ADMIN
  76. privileged: false
  77. status: {}
  78. ---
  79. apiVersion: v1
  80. kind: Service
  81. metadata:
  82. name: my-nginx
  83. labels:
  84. app: my-nginx
  85. spec:
  86. ports:
  87. - port: 80
  88. protocol: TCP
  89. name: http
  90. selector:
  91. run: my-nginx
  92. ---

部署示例应用

使用下面的命令部署官方提供的示例应用:

  1. curl https://raw.githubusercontent.com/rootsongjc/kubernetes-handbook/master/manifests/conduit/emojivoto.yml | conduit inject --init-image harbor-001.jimmysong.io/library/runconduit-proxy-init --proxy-image harbor-001.jimmysong.io/library/runconduit-proxy - --skip-inbound-ports=80 | kubectl apply -f -

注意:其中使用的镜像地址已经改为我的私有镜像仓库地址,大家使用时请注意修改。

参考