Micro在Kubernetes中是原生kubernetes的微服务。

Micro是一个微服务工具包,而Kubernetes是一个容器调度平台,它们组合在一起便构成微服务基础设施。

特性

  • 无外部依赖
  • 客户端缓存服务发现
  • 可选k8s服务负载均衡
  • 使用gRPC传输协议
  • 预置工具包

安装 Micro

  1. go get github.com/micro/kubernetes/cmd/micro

或者

  1. docker pull microhq/micro:kubernetes

如果使用go-micro,可以导入:

  1. import "github.com/micro/kubernetes/go/micro"

编写服务

gp-micro)中可以使用其它服务一样集成k8s。

  1. import (
  2. "github.com/micro/go-micro"
  3. k8s "github.com/micro/kubernetes/go/micro"
  4. )
  5. func main() {
  6. service := k8s.NewService(
  7. micro.Name("greeter")
  8. )
  9. service.Init()
  10. service.Run()
  11. }

部署服务

以下是k8s部署微服务的示例

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. namespace: default
  5. name: greeter
  6. spec:
  7. replicas: 1
  8. template:
  9. metadata:
  10. labels:
  11. app: greeter-srv
  12. spec:
  13. containers:
  14. - name: greeter
  15. command: [
  16. "/greeter-srv",
  17. "--server_address=0.0.0.0:8080",
  18. "--broker_address=0.0.0.0:10001"
  19. ]
  20. image: microhq/greeter-srv:kubernetes
  21. imagePullPolicy: Always
  22. ports:
  23. - containerPort: 8080
  24. name: greeter-port

通过 kubectl 部署

  1. kubectl create -f greeter.yaml

健康检查器

健康检查器(healthchecking sidecar,参考sidecar模式)会调用服务rpc接口Debug.Health向外暴露/health端点,而每个go-micro服务都有一个内置的Debug.Health端点。

部署健康检查

  1. go get github.com/micro/kubernetes/cmd/health

或者

  1. docker pull microhq/health:kubernetes

运行健康检查

例如,运行healthcheck greeter服务,地址为localhost:9091

  1. health --server_name=greeter --server_address=localhost:9091

在localhost:8080调用healthchecker

  1. curl http://localhost:8080/health

K8s 部署

添加 kubernetes 部署配置

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. namespace: default
  5. name: greeter
  6. spec:
  7. replicas: 1
  8. template:
  9. metadata:
  10. labels:
  11. app: greeter-srv
  12. spec:
  13. containers:
  14. - name: greeter
  15. command: [
  16. "/greeter-srv",
  17. "--server_address=0.0.0.0:8080",
  18. "--broker_address=0.0.0.0:10001"
  19. ]
  20. image: microhq/greeter-srv:kubernetes
  21. imagePullPolicy: Always
  22. ports:
  23. - containerPort: 8080
  24. name: greeter-port
  25. - name: health
  26. command: [
  27. "/health",
  28. "--health_address=0.0.0.0:8081",
  29. "--server_name=greeter",
  30. "--server_address=0.0.0.0:8080"
  31. ]
  32. image: microhq/health:kubernetes
  33. livenessProbe:
  34. httpGet:
  35. path: /health
  36. port: 8081
  37. initialDelaySeconds: 3
  38. periodSeconds: 3

K8s负载均衡

Micro默认提供客户端负载均衡,但k8s也提供有服务负载均衡策略。

要把默认的均衡卸掉迁移到k8s,可以使用静态选择器与k8s服务协同的方式。

不同于地址解析,选择器返回服务名与既定端口,例如greeter服务抬greeter:8080。

点击了解更多关于静态选择器

用法

要在运行服务时使用静态选择器,请指定参数或环境变量

  1. MICRO_SELECTOR=static ./service

或者

  1. ./service --selector=static

K8s 部署

部署示例

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4. namespace: default
  5. name: greeter
  6. spec:
  7. replicas: 1
  8. template:
  9. metadata:
  10. labels:
  11. app: greeter-srv
  12. spec:
  13. containers:
  14. - name: greeter
  15. command: [
  16. "/greeter-srv",
  17. "--selector=static",
  18. "--server_address=0.0.0.0:8080",
  19. "--broker_address=0.0.0.0:10001"
  20. ]
  21. image: microhq/greeter-srv:kubernetes
  22. imagePullPolicy: Always
  23. ports:
  24. - containerPort: 8080
  25. name: greeter-port

K8s 服务

静态选择器将负载均衡迁移到k8s服务。因此,请确保为每个微服务创建了k8s服务。

服务样例

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: greeter
  5. labels:
  6. app: greeter
  7. spec:
  8. ports:
  9. - port: 8080
  10. protocol: TCP
  11. selector:
  12. app: greeter

通过kubectl部署

  1. kubectl create -f service.yaml

这样,在你的服务中调用greeter微服务,会被路由到k8s服务中的greeter服务8080端口上。