CoreOS install to a VPS
I’ve just spun up my first install of CoreOS. I found the process a little confusing at times as the doco isn’t terribly clear in places. CoreOS is a work in progress, so doco will improve I’m sure. In the meantime, hopefully this post will be of some help to others.
The host machine I used was a standard VPS from my hosting provider running on top of KVM. My hosting provider provides a console facility using NoVNC and the ability to attach bootable ISO media.
ISO Boot
Using the supplied ISO from CoreOS, boot the machine. You will end up at a shell prompt, logged in as user core
. At this point, you’re simply running the LiveCD and nothing has been installed to disk yet (something the doco does not make clear!)
In my case the network had not yet been configured, so I needed to do that manually as follows:
sudo ifconfig <network port> <ip address> netmask <netmask>
sudo route add default gw <default gateway IP>
Add to /etc/resolv.conf
your nameserver IP. I used Google’s e.g. nameserver 8.8.8.8
Config file
Once network is configured, the next thing to do is grab a config file which will be used each time your new CoreOS installation boots from disk. On another host, reachable via the network, I created the following file named cloud-config.yml
:
#cloud-config
hostname: myhostname
coreos:
etcd:
addr: $private_ipv4:4001
peer-addr: $private_ipv4:7001
units:
- name: etcd.service
command: start
- name: fleet.service
command: start
- name: static.network
content: |
[Match]
Name=ens3
[Network]
Address=x.x.x.109/24
Gateway=x.x.x.1
DNS=x.x.x.10
DNS=x.x.x.11
DNS=8.8.8.8
users:
- name: core
ssh-authorized-keys:
- ssh-rsa AAAA<rest of ssh key goes here>
- groups:
- sudo
- docker
Update the hostname
, discovery:
, [Network]
and ssh-rsa
sections to suit yourself.
IMPORTANT: be sure to run your config file through a YAML parser to check for any silly errors. For example, I accidentally left off a -
in front of one of the keys which caused the entire config to fail to load!
Install
- copy the config file to the CoreOS host e.g.
wget http://externalhost/cloud-config.yml
- now install CoreOS to the local disk with the following command:
coreos-install -d /dev/vda -c cloud-config.yml
Replace /dev/vda
with your device name and cloud-config.yml
with your config file name. The install only takes about 30 seconds. Once finished, unmount the ISO media and reboot your machine.
Once booted you’ll arrive at a login prompt. If your config was loaded successfully, you should see the IP address and hostname (you specified in the config) listed just above the login prompt. You should also be able to SSH in (using the SSH key supplied in the config) e.g. ssh core@x.x.x.x
Firewall
By default, CoreOS boots up with a completely open firewall policy. In most cases this is fine as your host’s management interface would be isolated from the wider network. In my case, using a public VPS, I needed to configure some basic iptables rules.
This was done by adding the following additional unit to cloud-config.yml
:
- name: iptables.service
command: start
content: |
[Unit]
Description=Packet Filtering Framework
DefaultDependencies=no
After=systemd-sysctl.service
Before=sysinit.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/iptables-restore /etc/iptables.rules ; /usr/sbin/ip6tables-restore /etc/ip6tables.rules
ExecReload=/usr/sbin/iptables-restore /etc/iptables.rules ; /usr/sbin/ip6tables-restore /etc/ip6tables.rules
ExecStop=/usr/sbin/iptables --flush;/usr/sbin/ip6tables --flush
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
I then created files /etc/iptables.rules
and /etc/ip6tables.rules
containing appropriate rulesets. These are applied every time the host boots.
(Thanks to this Github gist for the idea)
Troubleshooting
If, for some reason, your config doesn’t load:
- reboot using the ISO media
- mount the ninth partition on the disk e.g.
sudo mount /dev/vda9 /mnt
. (to view all partitions on the disk you can usesudo parted /dev/vda print
) - use
journalctl
to view the boot messages, looking for any errors associated with the config file created earlier e.g.journalctl -D /mnt/var/log/journal | grep cloud
- Edit the file
/mnt/var/lib/coreos-install/user_data
and make any modifications required - Unmount ISO media and reboot