我目前正在处理CoreOS,到目前为止,我认为我有了整体的想法和概念.我还没有得到的一件事就是执行cloud-init.
我知道这cloud-init是一个为CoreOS做一些配置的过程.我还不明白的是......
cloud-init?在第一次启动?每次开机?...?cloud-init知道在哪里找到它的配置数据?我已经看到有config-drive,这完全有道理,但这是唯一的方法吗?user-data文件的作用究竟是什么?...?我看到,与标准cloud-config文件不同,runcmdCoreOS cloud-config文件中没有选项.目前,我通过向我添加以下内容来启用CoreOS机器上的交换cloud-config:
units:
- name: swap.service
command: start
content: |
[Unit]
Description=Turn on swap
[Service]
Type=oneshot
Environment="SWAPFILE=/1GiB.swap"
RemainAfterExit=true
ExecStartPre=/usr/sbin/losetup -f ${SWAPFILE}
ExecStart=/usr/bin/sh -c "/sbin/swapon $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)"
ExecStop=/usr/bin/sh -c "/sbin/swapoff $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)"
ExecStopPost=/usr/bin/sh -c "/usr/sbin/losetup -d $(/usr/sbin/losetup -j ${SWAPFILE} | /usr/bin/cut -d : -f 1)"
[Install]
WantedBy=local.target
Run Code Online (Sandbox Code Playgroud)
然后在初始化我的CoreOS映像后,我必须ssh进入机器并运行:
sudo fallocate -l 1024m /1GiB.swap && sudo chmod 600 /1GiB.swap \
&& …Run Code Online (Sandbox Code Playgroud) 我有两个服务A和B.
A在启动时设置etcd中的值,比如它从环境文件中获取的公共IP地址:
ExecStartPost=/usr/bin/etcdctl set /A_ADDR $COREOS_PUBLIC_IPV4
Run Code Online (Sandbox Code Playgroud)
B在启动时需要该值,以及它自己的IP地址.所以这样的事情会很好:
ExecStart=/usr/bin/docker run -e MY_ADDR=$COREOS_PUBLIC_IPV4 -e A_ADDR=$ETCD_A_ADDR mikedewar/B
Run Code Online (Sandbox Code Playgroud)
但这显然是不可能的,因为etcd变量不会像这样的systemd环境变量.相反,我可以做一些/usr/bin/bash -c 'run stuff'我的,ExecStart但它很尴尬,特别是因为我需要systemd扩展$COREOS_PUBLIC_IPV4和我的新bash shell扩展$(etcdctl get /A_ADDR).它也充满了代码味道,让我觉得我错过了一些重要的东西.
有人能告诉我从etcd获取值到我ExecStart声明中的"正确"方法吗?
- 更新
所以我一直在运行
ExecStart=/usr/bin/bash -c 'source /etc/environment && /usr/bin/docker run -e A_ADDR=$(/usr/bin/etcdctl get /A_ADDR) -e MY_ADDR=$COREOS_PUBLIC_IPV4 mikedewar/B'
Run Code Online (Sandbox Code Playgroud)
但它很难看.还是不敢相信我没有错过什么..
我一直在停止并启动这个容器没有问题.然后突然我得到了这个奇怪的错误.
请参阅下面的命令历史
core@ip-10-32-251-200 /vol/jenkins/war/WEB-INF/lib $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
241d05c8d14f joshuacalloway/jenkins:latest "/usr/bin/supervisor 5 weeks ago Up 6 days 0.0.0.0:80->8080/tcp jenkins
core@ip-10-32-251-200 /vol/jenkins/war/WEB-INF/lib $ docker stop 241
241
core@ip-10-32-251-200 /vol/jenkins/war/WEB-INF/lib $ docker start 241
241
core@ip-10-32-251-200 /vol/jenkins/war/WEB-INF/lib $ docker stop 241
241
core@ip-10-32-251-200 /vol/jenkins/war/WEB-INF/lib $ docker start 241
Error response from daemon: Cannot start container 241: Unit docker-241d05c8d14f0b9f18d4f8647ac76a27097354aab5d92f1aaa6c9789a85e6e3d.scope already exists.
2014/09/05 00:27:39 Error: failed to start one or more containers
core@ip-10-32-251-200 /vol/jenkins/war/WEB-INF/lib $ docker start …Run Code Online (Sandbox Code Playgroud) 跨多个数据中心使用etcd是否安全?因为它将etcd端口暴露给公共互联网.在这种情况下我是否必须使用客户端证书或者etcd有某种授权?
我开始使用CoreOS(在AWS ECS上).在启动我的第一个容器后,我看到了journalctl:
Could not generate persistent MAC address for vethXXXX: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这里有更多背景信息.我删除了时间和实例信息,但这都在同一秒内.请注意,有两个不同的veth条目.我不知道这是否意味着什么.
systemd[1]: Started docker container 1234
systemd[1]: Starting docker container 1234
dockerd[595]: time="2015-07-23T23:30:52Z" level=info msg="GET /v1.17/containers/1234/json"
dockerd[595]: time="2015-07-23T23:30:52Z" level=info msg="+job container_inspect(1234)"
systemd-timesyncd[473]: Network configuration changed, trying to establish connection.systemd-udevd[7501]: Could not generate persistent MAC address for vethYYYY: No such file or directory
kernel: device vethXXXX entered promiscuous mode
kernel: IPv6: ADDRCONF(NETDEV_UP): vethXXXX: link is not ready
systemd-udevd[7508]: Could not generate persistent …Run Code Online (Sandbox Code Playgroud) 我可以使用CoreOS rkt或一些相关工具来运行我的Docker-Compose项目吗?
和/或有没有办法将Docker-Compose项目转换为类似的东西,对于CoreOS和rkt?
我的Docker-Compose项目在localhost和生产服务器上运行良好.但我认为我更喜欢CoreOS和rkt的安全模型 - 那么我就不必在我的开发机器上运行具有root权限的容器(对吧?).
这里似乎是关于如何运行单个Docker容器的文档rkt:https://coreos.com/rkt/docs/latest/running-docker-images.html - 但我想要Docker-Compose之类的功能,而不仅仅是单个容器.
(我目前使用基于Ubuntu的Linux发行版.)
如何设置日志文件的最大大小?或启用日志轮换.在文档中我没有找到任何关于此的内容.
或者有必要为此编写脚本?
我有一个kubernetes单节点设置(参见https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant-single.html)
我有一个服务和一个复制控制器创建pod.这些pod需要连接到同一服务中的其他pod(注意:这最终是因为我可以让mongo运行w /副本集(非localhost),但这个简单的例子演示了mongo的问题).
当我从任何节点连接到服务时,它将被分发(按预期)到其中一个pod.这将一直有效,直到它自身负载平衡(我所在的容器).然后它无法连接.
很抱歉是冗长的,但我要附上我的所有文件,以便你可以看到我在这个小例子中做了什么.
Dockerfile:
FROM ubuntu
MAINTAINER Eric H
RUN apt-get update; apt-get install netcat
EXPOSE 8080
COPY ./entry.sh /
ENTRYPOINT ["/entry.sh"]
Run Code Online (Sandbox Code Playgroud)
这是切入点
#!/bin/bash
# wait for a connection, then tell them who we are
while : ; do
echo "hello, the date=`date`; my host=`hostname`" | nc -l 8080
sleep .5
done
Run Code Online (Sandbox Code Playgroud)
构建dockerfile
docker build -t echoserver .
标记并上传到我的k8s群集的注册表
docker tag -f echoserver:latest 127.0.0.1:5000/echoserver:latest
docker push 127.0.0.1:5000/echoserver:latest
Run Code Online (Sandbox Code Playgroud)
这是我的复制控制器
apiVersion: v1
kind: ReplicationController
metadata:
labels:
role: echo-server …Run Code Online (Sandbox Code Playgroud) 我在AWS上使用CoreOS创建了一个Kubernetes集群,但我无法与主节点进行通信.
例如,类似于以下操作的操作类似于kubectl exec或kubectl logs失败:
Error from server: dial tcp: lookup ip-XXX-X-XXX-XXX.eu-west-1.compute.internal: no such host
Run Code Online (Sandbox Code Playgroud)
我在Github上发现了一些描述问题的问题所以我知道团队知道这个bug,但是我想在这里询问是否有可能使用一些解决方法,直到它以某种方式得到解决.
提到的一个解决方法是使用--hostname-override标志,但是当我在AWS上时,这个标志被忽略(参见#22984)
coreos ×10
docker ×4
kubernetes ×3
etcd ×2
systemd ×2
amazon-ecs ×1
cloud-init ×1
logging ×1
rkt ×1
rotation ×1
swapfile ×1