VAGRANTFILE_API_VERSION = "2" NUM_WORKERS = 1 MODE = ENV['K8S_IP_FAMILY'] || "v4" if MODE != "v4" && MODE != "v6" && MODE != "dual" raise "K8S_IP_FAMILY env variable should be one of 'v4', 'v6' or 'dual'" end K8S_POD_NETWORK_V4_CIDR = "10.10.0.0/16" K8S_POD_NETWORK_V6_CIDR = "fd02::/48" if MODE == "v4" K8S_POD_NETWORK_CIDR = K8S_POD_NETWORK_V4_CIDR elsif MODE == "v6" K8S_POD_NETWORK_CIDR = K8S_POD_NETWORK_V6_CIDR else K8S_POD_NETWORK_CIDR = K8S_POD_NETWORK_V4_CIDR + "," + K8S_POD_NETWORK_V6_CIDR end # Only used for IPv6 clusters K8S_NODE_CP_GW_V4_IP = "10.10.0.1" K8S_NODE_CP_GW_V6_IP = "fd02::1" K8S_NODE_CP_GW_IP = (MODE == "v6") ? K8S_NODE_CP_GW_V6_IP : K8S_NODE_CP_GW_V4_IP K8S_SERVICE_NETWORK_V4_CIDR = "10.96.0.0/12" K8S_SERVICE_NETWORK_V6_CIDR = "fd03::/112" if MODE == "v4" K8S_SERVICE_NETWORK_CIDR = K8S_SERVICE_NETWORK_V4_CIDR elsif MODE == "v6" K8S_SERVICE_NETWORK_CIDR = K8S_SERVICE_NETWORK_V6_CIDR else K8S_SERVICE_NETWORK_CIDR = K8S_SERVICE_NETWORK_V4_CIDR + "," + K8S_SERVICE_NETWORK_V6_CIDR end NODE_NETWORK_V4_PREFIX = "192.168.77." NODE_NETWORK_V6_PREFIX = "fd3b:fcf5:3e92:d732::" MEMORY = 2048 KUBE_PROXY_MODE = ENV['KUBE_PROXY_MODE'] || "iptables" if KUBE_PROXY_MODE == "iptables" || KUBE_PROXY_MODE == "none" KUBE_PROXY_IPVS_STRICT_ARP = false elsif KUBE_PROXY_MODE == "ipvs" # For now, we always enable strict ARP, which is required to use MetalLB KUBE_PROXY_IPVS_STRICT_ARP = true else raise "KUBE_PROXY_MODE env variable should be one of 'iptables', 'ipvs' or 'none'" end Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "ubuntu/jammy64" config.vm.provider "virtualbox" do |v| v.memory = MEMORY # 2 CPUS required to initialize K8s cluster with "kubeadm init" v.cpus = 2 end groups = { "controlplane" => ["k8s-node-control-plane"], "workers" => ["k8s-node-worker-[1:#{NUM_WORKERS}]"], } config.vm.define "k8s-node-control-plane" do |node| node.vm.hostname = "k8s-node-control-plane" node_ipv4 = NODE_NETWORK_V4_PREFIX + "100" node_ipv6 = NODE_NETWORK_V6_PREFIX + "100" # The network will be configured using the Ansible playbook # Despite setting auto_config to false, it seems that it is necessary to # provide an IP address, even though it won't be used. # See https://github.com/hashicorp/vagrant/issues/7583 node.vm.network "private_network", ip: node_ipv4, auto_config: false if MODE == "v4" node_ip = node_ipv4 elsif MODE == "v6" node_ip = node_ipv6 else node_ip = node_ipv4 + "," + node_ipv6 end node.vm.provision :ansible do |ansible| ansible.playbook = "playbook/k8s.yml" ansible.groups = groups ansible.extra_vars = { # Ubuntu bionic does not ship with python2 ansible_python_interpreter:"/usr/bin/python3", node_ip: node_ip, node_ipv4: (MODE != "v6") ? node_ipv4 : "", node_ipv6: (MODE != "v4") ? node_ipv6 : "", node_name: "k8s-node-control-plane", k8s_pod_network_cidr: K8S_POD_NETWORK_CIDR, k8s_service_network_cidr: K8S_SERVICE_NETWORK_CIDR, k8s_api_server_ip: (MODE == "v6") ? node_ipv6 : node_ipv4, k8s_ip_family: MODE, k8s_antrea_gw_ip: K8S_NODE_CP_GW_IP, kube_proxy_mode: KUBE_PROXY_MODE, kube_proxy_ipvs_strict_arp: KUBE_PROXY_IPVS_STRICT_ARP, } end end (1..NUM_WORKERS).each do |node_id| config.vm.define "k8s-node-worker-#{node_id}" do |node| node.vm.hostname = "k8s-node-worker-#{node_id}" node_ipv4 = NODE_NETWORK_V4_PREFIX + "#{100 + node_id}" node_ipv6 = NODE_NETWORK_V6_PREFIX + "#{100 + node_id}" node.vm.network "private_network", ip: node_ipv4, auto_config: false if MODE == "v4" node_ip = node_ipv4 elsif MODE == "v6" node_ip = node_ipv6 else node_ip = node_ipv4 + "," + node_ipv6 end node.vm.provision :ansible do |ansible| ansible.playbook = "playbook/k8s.yml" ansible.groups = groups ansible.extra_vars = { ansible_python_interpreter:"/usr/bin/python3", node_ip: node_ip, node_ipv4: (MODE != "v6") ? node_ipv4 : "", node_ipv6: (MODE != "v4") ? node_ipv6 : "", node_name: "k8s-node-worker-#{node_id}", } end end end end