标签: coreos

使 Docker 应用程序写入标准输出

我正在部署一个符合12 因素建议的 3rd 方应用程序,其中一点告诉应用程序日志应该打印到 stdout/stderr:然后集群软件可以收集它。

但是,应用程序只能写入文件或系统日志。我该如何打印这些日志?

cluster logging docker coreos

71
推荐指数
4
解决办法
10万
查看次数

如何删除丢失的 systemd 单元?

我无法弄清楚如何删除不再有文件的 systemd 单元。他们似乎仍然以某种方式徘徊在系统中。

我试图删除的旧损坏单元:

core@ip-172-16-32-83 ~ $ systemctl list-units --all firehose-router*
  UNIT                       LOAD      ACTIVE SUB    DESCRIPTION
<E2><97><8F> firehose-router@02.service not-found failed failed firehose-router@02.service
<E2><97><8F> firehose-router@03.service not-found failed failed firehose-router@03.service

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

2 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.
Run Code Online (Sandbox Code Playgroud)

这些文件不存在,但重新加载仍然有这些单位挥之不去:

core@ip-172-16-32-83 ~ $ systemctl list-unit-files …
Run Code Online (Sandbox Code Playgroud)

systemd coreos

53
推荐指数
1
解决办法
4万
查看次数

Docker 守护进程在 CoreOS 上启动时不启动

我有一个 CoreOS (835.9.0) 的 vanilla 安装,它不会在启动时启动 docker 守护进程。它仅在我通过 SSH 登录并执行例如docker ps.

如何让 docker 守护进程在系统启动时自动启动?

当我说 docker 守护进程时,我的意思ps -ef | grep docker是在我执行之后才显示任何进程docker ps

boot docker coreos

30
推荐指数
2
解决办法
2万
查看次数

在 glusterfs 中存储 Docker 卷是个好主意吗?

我目前正在考虑将我们的一些服务器和应用程序迁移到coreOS环境。我在这里看到的问题之一是持久数据的管理,因为在将容器移动到新机器时,coreOS 不处理 Docker 卷。经过一番研究,我发现glusterFS声称是一个可以解决我所有问题的集群文件系统。

我目前的想法是:我有一个 glusterFS 容器,它在我的每台 coreOS 机器上作为特权容器运行,并公开一个存储,/mnt/gluster例如。在我的Dockerfiles 中,我指定我的所有卷都应安装在此路径上。

我考虑的下一件事是哪些容器应该获得自己的卷,哪些应该共享一个。例如,每个mysql容器都有自己的卷,因为它能够自己处理复制。我不想惹这个。为同一网站提供服务的网络服务器将正确使用相同的卷来处理“用户上传的图像”等内容,因为它们无法复制这些数据。

有没有人尝试过这样的事情,或者我错过了什么?

cluster replication glusterfs docker coreos

24
推荐指数
2
解决办法
1万
查看次数

如何启动和停止另一个系统单元?

我正在使用 CoreOS 来调度 systemd 单元。我有两个单元 (firehose.servicefirehose-announce.service。我试图让 与firehose-announce.service一起开始和停止firehose.service。这是 的单元文件firehose-announce.service

[Unit]
Description=Firehose etcd announcer
BindsTo=firehose@%i.service
After=firehose@%i.service
Requires=firehose@%i.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=30s
ExecStartPre=/bin/sh -c 'sleep 1'
ExecStart=/bin/sh -c "port=$(docker inspect -f '{{range $i, $e := .NetworkSettings.Ports }}{{$p := index $e 0}}{{$p.HostPort}}{{end}}' firehose-%i); echo -n \"Adding socket $COREOS_PRIVATE_IPV4:$port/tcp to /firehose/upstream/firehose-%i\"; while netstat -lnt | grep :$port >/dev/null; do etcdctl set /firehose/upstream/firehose-%i $COREOS_PRIVATE_IPV4:$port --ttl 300 >/dev/null; sleep 200; done"
RestartSec=30s
Restart=on-failure

[X-Fleet]
X-ConditionMachineOf=firehose@%i.service
Run Code Online (Sandbox Code Playgroud)

我试图使用BindsTostart …

systemd coreos

20
推荐指数
1
解决办法
2万
查看次数

无需停机即可更新 Docker 容器

假设我有一个带有 Web 服务器的 Docker 容器(如 Apache 2)。现在我想更新它下的操作系统。这个 SF answer说最好的方法是重建基础镜像和我的 Apache 镜像。但是部署镜像意味着停机,因为我必须在创建新容器之前删除旧容器,所以只有一个容器绑定到端口 80/443。

但是,如何在零停机时间的情况下部署此更新?我应该使用负载平衡器并使用容器间通信吗?以及如何更新负载均衡器?

uptime docker coreos

17
推荐指数
1
解决办法
8916
查看次数

CoreOS:tcpdump 神秘解决网络问题(使用过多的套接字)

我今天有一个谜团要告诉你。我们在 Azure 上运行一个基于 CoreOS (2023.5.0 / Linux 4.19.25-coreos) 的小型三节点 Elasticsearch 集群。Elasticsearch 在主机网络模式下的 docker 容器内运行。在几乎完全免维护运行一年多之后,我们看到机器进入了一种非常有趣的状态。

更新

此问题已通过修复Linux 内核中的驱动程序解决。请参阅下面的答案。

症状

基本上,受影响的机器和其他两个节点之间的网络连接失效。它们都在同一个虚拟网络和同一个子网中,通常可以与其他人通信。仍然可以从其他子网(我可以通过 ssh 进入)和不同的对等虚拟网络访问受影响的节点。这台机器也有(非常不稳定的)互联网连接,但大多数请求只是超时。

我们观察到,在受影响的节点上,报告的“使用的套接字”数量/proc/net/sockstat非常高(大约 4.5k 而不是健康节点上的大约 300)。监控显示,这个数字从节点变得不可用的那一刻起迅速上升。

有趣的是,我们似乎无法识别这些使用过的套接字的来源:

# cat /proc/net/sockstat
sockets: used 4566
TCP: inuse 2 orphan 0 tw 2 alloc 98 mem 4
UDP: inuse 1 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

# cat /proc/net/sockstat6
TCP6: inuse 98
UDP6: inuse 1
UDPLITE6: inuse 0
RAW6: inuse 1
FRAG6: inuse …
Run Code Online (Sandbox Code Playgroud)

tcpdump linux-networking linux-kernel coreos azure-networking

14
推荐指数
1
解决办法
768
查看次数

这个变量转义如何在 systemd 单元文件中工作?

我有一个相当简单的单元文件,用于我在 CoreOS 上运行的服务器实例的发现助手服务。单元文件如下所示:

[Unit]
Description=Discovery for frontend server (instance %i)
BindsTo=frontend@%i.service
After=frontend@%i.service

[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/bash -c ' \
    while true; do \
        export PORT=$(docker port frontend%i 80 | sed s/.*://); \
        etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:$PORT" --ttl 60; \
        sleep 45; \
    done'
ExecStop=/usr/bin/etcdctl rm /services/frontend/%i

[X-Fleet]
MachineOf=frontend@%i.service
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我花了很长时间才到达这个阶段,因为如果我将etcdctl行更改为:

etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \
Run Code Online (Sandbox Code Playgroud)

然后它不起作用 - 它最终设置了一个100.45.218.3:没有端口的值。一路上,我花了很多时间玩弄$PORT变量的不同用途,但我不知道为什么我选择的配置有效。有一次我在脚本中有这个:

echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \ …
Run Code Online (Sandbox Code Playgroud)

bash systemd coreos

10
推荐指数
1
解决办法
5010
查看次数

Mesos 部署的最佳基础

我们目前正在设计我们新的 Apache Mesos 云设置的架构。目标是通过将不同的堆栈移动到同一架构上来统一我们的系统。主要工作负载是使用 Apache Spark 和我们的企业基础设施(包括 Web 服务器、邮件服务器等)进行大数据分析。

这个想法是在 Docker 容器中运行我们的 Web 服务,该容器运行在 Mesos 的可用调度程序之一(Marathon/Chronos、Aurora 或 Singularity)之上。因此,这将是第一个 Mesos 框架组。在它旁边,我们会有 Apache Spark 框架和几个用于数据存储的数据库框架。这将是第二组 Mesos 框架。我们将在并行运行它们进行测试后选择细节。

然而,我们很难决定在哪个基础上运行 Mesos 本身。理想情况下,我们希望尽可能靠近金属运行它。我们还希望使用编排解决方案来确保 Mesos 和框架守护进程在失败时始终运行/重新启动。我们正在考虑的选项如下:

1) 在最小的操作系统中将 Mesos 和框架作为 docker 容器运行。在这方面,我们目前倾向于 CoreOS 和 Fleet。

2) 直接在 Ubuntu/Debian 服务器上运行 Mesos 和框架。对于这个选项,我们倾向于 Foreman 和 Puppet。

至于这个问题,我们正在寻找解决方案,按重要性排序:

  • 配置最简单
  • 是最容易维护和保持更新的
  • 有最少的开销

我们之前没有使用过 CoreOS,但它似乎是我们正在走向的选项。我对此的一个大(主观)问题是我们在 Docker 容器上运行 Mesos,然后在 Mesos 上运行 Docker 容器。这对我来说似乎是“不洁”和错误的。这种考虑是没有道理的?

类似的想法涉及层之间的冗余。为了解释我从哪里来,我更希望 Mesos 是一个真正的操作系统,它只是在金属之上运行。似乎无论您使用什么基础,最终都会在架构的不止一层(即 CoreOS&Fleet&SystemD == Mesos&Marathon&Chronos)上获得相同的预期功能。这是不可避免的吗?

有没有其他好的选择来运行我们没有考虑的 Mesos 下的层,记住我们的标准?

cloud puppet foreman coreos apache-mesos

9
推荐指数
1
解决办法
351
查看次数

谷歌计算引擎如何创建用户以及如何禁用他们?

我有一个在 GCE 上运行的 CoreOS 集群,我注意到所有 GCE 实例的一个问题是,只要您通过 Google Cloud 平台上的项目进行身份验证,您就可以登录服务器。这对我来说是一个问题,因为团队中的任何人,或进入项目的任何人,都可以像任何人一样直接进入服务器。我想禁用它,只使用我在云配置文件中创建的用户,这些用户指定了过期的 ssh 密钥和密码。在这样做时,我很好奇谷歌如何在 GCE 上创建用户?有没有人找到禁用它的方法?

user-management ssh-keys google-compute-engine coreos google-cloud-platform

9
推荐指数
2
解决办法
7432
查看次数