和 K8s 不同, Eru 并不负责 PaaS 的职责, 比方说, K8s 里的 [Deployment] 和 [ReplicaSet] 等上层概念将不会由 Eru 提供.
那么如果我们想做类似的工作该怎么办呢?
Eru Agent and all its friends
在之前的流程中, 我们添加节点只是在 eru-core 里注册了一个 endpoint, 然而这并不是完整的节点部署, 这样部署首当其中的问题是, 我们不知道容器的 IP:
root@localhost:~# eru-cli workload get-status cd7c894aa0736bdf1f884115b18416bbeeca4b23e812a986ae2d86b77a332c2c
┌────┬────────────────┬──────────┬────────────┐
│ ID │ STATUS │ NETWORKS │ EXTENSIONS │
├────┼────────────────┼──────────┼────────────┤
│ │ Running: false │ │ │
│ │ Healthy: false │ │ │
└────┴────────────────┴──────────┴────────────┘
这是因为在节点上缺少一个 agent 服务用来上报给 eru-core. 来部署一个单个节点上的:
cat <<! > eru-agent.yaml
appname: "eru"
entrypoints:
agent:
cmd: "/usr/bin/eru-agent --hostname node1 --config /etc/eru/agent.yaml"
restart: always
publish:
- "12345"
healthcheck:
tcp_ports:
- "12345"
privileged: true
volumes:
- /sys:/sys:ro
- /var/run/docker.sock:/var/run/docker.sock
- /proc/:/hostProc/
- /etc/eru:/etc/eru
!
cat <<! > /etc/eru/agent.yaml
pid: /tmp/eru-agent.sock
core: 127.0.0.1:5001
healthcheck:
interval: 15
timeout: 10
status_ttl: 0
cache_ttl: 300
docker:
endpoint: unix:///var/run/docker.sock
metrics:
step: 15
api:
addr: 0.0.0.0:12345
log:
forwards:
- __discard__
stdout: True
etcd:
machines:
- 127.0.0.1:2379
prefix: /agent-selfmon
!
eru-cli workload deploy --pod testpod --image projecteru2/agent --entry agent eru-agent.yaml
然后再去看容器状态就有了:
root@localhost:~# eru-cli workload get-status cd7c894aa0736bdf1f884115b18416bbeeca4b23e812a986ae2d86b77a332c2c
┌──────────────────────────────────────────────────────────────────┬───────────────┬────────────────────┬───────────────────────────────────────────────┐
│ ID │ STATUS │ NETWORKS │ EXTENSIONS │
├──────────────────────────────────────────────────────────────────┼───────────────┼────────────────────┼───────────────────────────────────────────────┤
│ cd7c894aa0736bdf1f884115b18416bbeeca4b23e812a986ae2d86b77a332c2c │ Running: true │ bridge: 172.17.0.7 │ ERU: 1 │
│ │ Healthy: true │ │ ERU_META: {"Publish":null,"HealthCheck":null} │
└──────────────────────────────────────────────────────────────────┴───────────────┴────────────────────┴───────────────────────────────────────────────┘
eru-agent 是 eru 对 dockerd 容器 runtime 提供的节点 daemon, 对于不同的 runtime 有不同的服务, 比如 yavirtd 本身自己也包含了这部分健康监控和状态上报的机制.
实例的健康监控目前支持 http 和 tcp, 在 spec 的文档里 可以看到详细的配置.
Workload Status
workload status 里最重要的几条信息, 包括 IP, running status, healthy status, 而这个状态数据是可以通过 eru-core grpc api 去 watch 监控的.
rpc WorkloadStatusStream(WorkloadStatusStreamOptions) returns (stream WorkloadStatusStreamMessage) {};
message WorkloadStatusStreamOptions {
string appname = 1;
string entrypoint = 2;
string nodename = 3;
map<string, string> labels = 4;
}
message WorkloadStatusStreamMessage {
string id = 1;
Workload workload = 2;
WorkloadStatus status = 3;
string error = 4;
bool delete = 5;
}
考虑实现类似 Kubernetes 的 ReplicaSet 的服务: 保证集群中的实例数目满足请求, 如果有实例下线就立刻新拉起.
ReplicaSet 的功能可以通过一个更上层的服务, 部署服务之后, 调用上述 WorkloadStatusStream
接口去 watch 状态, 如果发现实例挂掉就去补充上新实例; 如果旧的下线实例后来又恢复了则把多的实例清除掉.
通过这个机制可以实现高层的 PaaS 服务, 包括灾难恢复, 自动化迁移, 等上层业务系统.
可以参考 Workload 的文档.
健康检查的详细信息在这里