From 458b2648499d9477aa5af08dbb1c88f6137ae783 Mon Sep 17 00:00:00 2001 From: Dalton Hubble Date: Mon, 21 Dec 2015 14:07:44 -0800 Subject: [PATCH] docs: Add libvirt docker0 walkthrough --- .gitignore | 2 +- README.md | 101 +++---------------------------------- docs/getting-started.md | 4 +- docs/img/libvirt-ipxe.png | Bin 0 -> 21124 bytes docs/img/virt-manager.png | Bin 0 -> 30432 bytes docs/virtual-hardware.md | 103 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 113 insertions(+), 97 deletions(-) create mode 100644 docs/img/libvirt-ipxe.png create mode 100644 docs/img/virt-manager.png create mode 100644 docs/virtual-hardware.md diff --git a/.gitignore b/.gitignore index 32a24925..07b176e0 100644 --- a/.gitignore +++ b/.gitignore @@ -25,5 +25,5 @@ _testmain.go bin/ coverage/ -Godeps/_workspace/src/github.com/coreos/coreos-baremetal +Godeps/_workspace/src/ images/ \ No newline at end of file diff --git a/README.md b/README.md index 2875c4a7..48df1574 100644 --- a/README.md +++ b/README.md @@ -1,101 +1,14 @@ -# CoreOS on Baremetal +# CoreOS on Baremetal [![Docker Repository on Quay](https://quay.io/repository/coreos/bootcfg/status "Docker Repository on Quay")](https://quay.io/repository/coreos/bootcfg) CoreOS on Baremetal contains guides for booting and configuring CoreOS clusters on virtual or physical hardware. It includes Dockerfiles and Vagrantfiles for setting up a network boot environment and the `bootcfg` HTTP service for providing configs to machines based on their attributes. ## Guides -[Getting Started](docs/getting-started.md) -[Boot Config Service](docs/bootcfg.md) -[Libvirt Guide](docs/virtual-hardware.md) -[Baremetal Guide](docs/physical-hardware.md) -[bootcfg Config](docs/config.md) -[bootcfg API](docs/api.md) +* [Getting Started](docs/getting-started.md) +* [Boot Config Service](docs/bootcfg.md) +* [Libvirt Guide](docs/virtual-hardware.md) +* [Baremetal Guide](docs/physical-hardware.md) +* [bootcfg Config](docs/config.md) +* [bootcfg API](docs/api.md) -## Networking - -Use PXE, iPXE, or Pixiecore with `bootcfg` to define kernel boot images, options, and cloud configs for machines within your network. - -To get started in a libvirt development environment (under Linux), you can run the `bootcfg` container on the docker0 virtual bridge, alongside either the included `ipxe` conatainer or `danderson/pixiecore` and `dhcp` containers. Then you'll be able to boot libvirt VMs on the same bridge or baremetal PXE clients that are attatched to your development machine via a network adapter and added to the bridge. `docker0` defaults to subnet 172.17.0.0/16. See [clients](#clients). - -List all your bridges with - - brctl show - -and on docker 1.9+, you may inspect the bridge and its interfaces with - - docker network inspect bridge # docker calls the bridge "bridge" - - -To get started on a baremetal, run the `bootcfg` container with the `--net=host` argument and configure PXE, iPXE, or Pixiecore. If you do not yet have any of these services running on your network, the [dnsmasq image](dockerfiles/dnsmasq) can be helpful. - -### iPXE - -Configure your iPXE server to chainload the `bootcfg` iPXE boot script hosted at `$BOOTCFG_BASE_URL/boot.ipxe`. The base URL should be of the for `protocol://hostname:port` where where hostname is the IP address of the config server or a DNS name for it. - - # dnsmasq.conf - # if request from iPXE, serve bootcfg's iPXE boot script (via HTTP) - dhcp-boot=tag:ipxe,http://172.17.0.2:8080/boot.ipxe - -#### docker0 - -Try running a PXE/iPXE server alongside `bootcfg` on the docker0 bridge. Use the included `ipxe` container to run an example PXE/iPXE server on that bridge. - -The `ipxe` Docker image uses dnsmasq DHCP to point PXE/iPXE clients to the boot config service (hardcoded to http://172.17.0.2:8080). It also runs a TFTP server to serve the iPXE firmware to older PXE clients via chainloading. - - cd dockerfiles/ipxe - ./docker-build - ./docker-run - -Now create local PXE boot [clients](#clients) as libvirt VMs or by attaching bare metal machines to the docker0 bridge. - -### PXE - -To use `bootcfg` with PXE, you must [chainload iPXE](http://ipxe.org/howto/chainloading). This can be done by configuring your PXE/DHCP/TFTP server to send `undionly.kpxe` over TFTP to PXE clients. - - # dnsmasq.conf - enable-tftp - tftp-root=/var/lib/tftpboot - # if regular PXE firmware, serve iPXE firmware (via TFTP) - dhcp-boot=tag:!ipxe,undionly.kpxe - -`bootcfg` does not respond to DHCP requests or serve files over TFTP. - -### Pixecore - -Pixiecore is a ProxyDHCP, TFTP, and HTTP server and calls through to the `bootcfg` API to get a boot config for `pxelinux` to boot. No modification of your existing DHCP server is required in production. - -#### docker0 - -Try running a DHCP server, Pixiecore, and `bootcfg` on the docker0 bridge. Use the included `dhcp` container to run an example DHCP server and the official Pixiecore container image. - - # DHCP - cd dockerfiles/dhcp - ./docker-build - ./docker-run - -Start Pixiecore using the script which attempts to detect the IP and port of `bootcfg` on the Docker host or do it manually. - - # Pixiecore - ./scripts/pixiecore - # manual - docker run -v $PWD/images:/images:Z danderson/pixiecore -api http://$BOOTCFG_HOST:$BOOTCFG_PORT/pixiecore - -Now create local PXE boot [clients](#clients) as libvirt VMs or by attaching bare metal machines to the docker0 bridge. - -## Clients - -Once boot services are running, create a PXE boot client VM or attach a bare metal machine to your host. - -### VM - -Create a VM using the virt-manager UI, select Network Boot with PXE, and for the network selection, choose "Specify Shared Device" with bridge name `docker0`. The VM should PXE boot using the boot configuration determined by its MAC address, which can be tweaked in virt-manager. - -### Bare Metal - -Link a bare metal machine, which has boot firmware (BIOS) support for PXE, to your host with a network adapter. Get the link and attach it to the bridge. - - ip link show # find new link e.g. enp0s20u2 - brctl addif docker0 enp0s20u2 - -Configure the boot firmware to prefer PXE booting or network booting and restart the machine. It should PXE boot using the boot configuration determined by its MAC address. diff --git a/docs/getting-started.md b/docs/getting-started.md index e01b63a6..e850be6d 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -51,7 +51,7 @@ In these guides, PXE is used to load the iPXE boot file so iPXE can chainload sc [iPXE](http://ipxe.org/) is an enhanced implementation of the PXE client firmware and a network boot program which uses iPXE scripts rather than config files and can download scripts and images with HTTP. -Basic PXE client server protocol flow +iPXE client server protocol flow A DHCPOFFER to iPXE client firmware specifies an HTTP boot script such as `http://example.provisioner.net/boot.ipxe`. @@ -86,7 +86,7 @@ Many networks have DHCP services which are impractical to modify or disable. Cor To address this, PXE client firmware listens for a DHCPOFFER from non-PXE DHCP server *and* a DHCPOFFER from a PXE-enabled **proxyDHCP server** which is configured to respond with just the next server and boot filename. The client firmware combines the two responses as if they had come from a single DHCP server which provided PXE Options. -Basic PXE client server protocol flow +DHCP and proxyDHCP responses are merged to get PXE Options The [libvirt guide](virtual-networking.md) shows how to setup a network environment with a standalone PXE-enabled DHCP server or with a separate DHCP server and proxyDHCP server. diff --git a/docs/img/libvirt-ipxe.png b/docs/img/libvirt-ipxe.png new file mode 100644 index 0000000000000000000000000000000000000000..51086ed1c3f7b1f255f57e2ff552ad653cad6c4d GIT binary patch literal 21124 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 literal 0 HcmV?d00001 diff --git a/docs/img/virt-manager.png b/docs/img/virt-manager.png new file mode 100644 index 0000000000000000000000000000000000000000..b31d658ba1a5974204d87e89465e62fc11ae68bc GIT binary patch literal 30432 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 literal 0 HcmV?d00001 diff --git a/docs/virtual-hardware.md b/docs/virtual-hardware.md new file mode 100644 index 00000000..9292d0d3 --- /dev/null +++ b/docs/virtual-hardware.md @@ -0,0 +1,103 @@ + +# Libvirt Virtual Hardware + +CoreOS can be booted and configured on virtual hardware within a libvirt environment (under Linux) with different network services running as Docker containers on the `docker0` virtual bridge. Client VMs or even baremetal hardware attached to the bridge can be booted and configured from the network. + +Docker containers run on the `docker0` virtual bridge, typically on a subnet 172.17.0.0/16. Docker assigns IPs to containers started through the docker cli, but the bridge does not run a DHCP service. List network bridges on your host and inspect the bridge Docker 1.9+ created (Docker cli refers to `docker0` as `bridge`). + + brctl show + docker network inspect bridge + +## Boot Config Service + +First, run the `bootcfg` container with your configs and images directories. + + docker run -p 8080:8080 --name=bootcfg --rm -v $PWD/data:/data:Z -v $PWD/images:/images:Z coreos/bootcfg:latest -address=0.0.0.0:8080 -data-path=/data -images-path=/images + +or use `./docker-run`. + +## PXE Setups + +As discussed in [getting started](getting-started.md), there are several variations of PXE network boot environments. We'll show how to setup and test each network environment. + +Several setups make use of the `dnsmasq` program which can run a PXE-enabled DHCP server, proxy DHCP server, and/or TFTP server. + +### PXE + +To boot PXE clients, configure a PXE network environment to [chainload iPXE](http://ipxe.org/howto/chainloading). The iPXE setup below configures DHCP to send `undionly.kpxe` over TFTP to older PXE clients for this purpose. + +With `dnsmasq`, the relevant `dnsmask.conf` settings would be: + + enable-tftp + tftp-root=/var/lib/tftpboot + # if PXE request came from regular firmware, serve iPXE firmware (via TFTP) + dhcp-boot=tag:!ipxe,undionly.kpxe + +### iPXE + +Create a PXE/iPXE network environment by running the included `ipxe` container on the `docker0` bridge alongside `bootcfg`. + + cd dockerfiles/ipxe + ./docker-build + ./docker-run + +The `ipxe` image uses `dnsmasq` to run DHCP and TFTP. It allocates IPs in the `docker0` subnet and sends options to chainload older PXE clients to iPXE. iPXE clients are pointed to the `bootcfg` service (assumed to be running on 172.17.0.2:8080) to get a boot script. + +``` +# dnsmasq.conf +dhcp-range=172.17.0.43,172.17.0.99,30m +enable-tftp +tftp-root=/var/lib/tftpboot +# set tag "ipxe" if request comes from iPXE ("iPXE" user class) +dhcp-userclass=set:ipxe,iPXE +# if PXE request came from regular firmware, serve iPXE firmware (via TFTP) +dhcp-boot=tag:!ipxe,undionly.kpxe +# if PXE request came from iPXE, serve an iPXE boot script (via HTTP) +dhcp-boot=tag:ipxe,http://172.17.0.2:8080/boot.ipxe +``` + +Libvirt iPXE network environment + +Continue to [clients](#clients) to create a client VM or attach a baremetal machine to boot. + +### Pixiecore + +Create a Pixiecore network environment by running the `danderson/pixiecore` container alongside `bootcfg`. Since Pixiecore is a proxyDHCP/TFTP/HTTP server and the `docker0` bridge does not run DHCP services, you'll need to run DHCP for your client machines. + +The `dhcp` image uses `dnsmasq` just to provide DHCP to the `docker0` subnet. + + cd dockerfiles/dhcp + ./docker-build + ./docker-run + +Start Pixiecore using the script which attempts to detect IP:port `bootcfg` ss using on `docker0` or do it manually. + + # Pixiecore + ./scripts/pixiecore + # manual + docker run -v $PWD/images:/images:Z danderson/pixiecore -api http://$BOOTCFG_HOST:$BOOTCFG_PORT/pixiecore + +Continue to [clients](#clients) to create a client VM or attach a baremetal machine to boot. + +## Clients + +Once a network environment is prepared to boot client machines, create a libvirt VM configured to PXE boot or attach a baremetal machine to your Docker host. + +### libvirt VM + +Use `virt-manager` to create a new client VM. Select Network Boot with PXE and for the network selection, choose "Specify Shared Device" with the bridge name `docker0`. + +Virt-Manager showing PXE network boot method + +The VM should PXE boot using the boot config and cloud config based on its UUID, MAC address, or your configured defaults. The `virt-manager` shows the UUID and the MAC address of the NIC on the shared bridge, which you can use when naming configs. + +### Bare Metal + +Connect a baremetal client machine to your libvirt Docker host machine and ensure that the client's boot firmware (probably BIOS) has been configured to prefer PXE booting. + +Find the network interface and attach it to the virtual bridge. + + ip link show # find new link e.g. enp0s20u2 + brctl addif docker0 enp0s20u2 + +Restart the client machine and it should PXE boot using the boot config and cloud config based on its UUID, MAC address, or your configured defaults.