.. _k8s_hosts: ===================== Kubernetes部署服务器 ===================== 在部署模拟Kubernetes集群的环境中,我采用如下虚拟机部署: - 3台 Kubernetes Mster - 5台 Kubernetes Node - 2台 HAProxy - 3台 etcd clone k8s虚拟机 ================== .. note:: 本案例在单台物理主机上部署多个KVM虚拟机,这些虚拟机是在该物理主机的NAT网络中,所以外部不能直接访问(需要端口映射)。 - clone虚拟就:: virsh shutdown centos7 for i in {1..4};do virt-clone --connect qemu:///system --original centos7 --name kubemaster-${i} --file /var/lib/libvirt/images/kubemaster-${i}.qcow2 virt-sysprep -d kubemaster-${i} --hostname kubemaster-${i} --root-password password:CHANGE_ME virsh start kubemaster-${i} done for i in {1..5};do virt-clone --connect qemu:///system --original centos7 --name kubenode-${i} --file /var/lib/libvirt/images/kubenode-${i}.qcow2 virt-sysprep -d kubenode-${i} --hostname kubenode-${i} --root-password password:CHANGE_ME virsh start kubenode-${i} done for i in {1..2};do virt-clone --connect qemu:///system --original centos7 --name haproxy-${i} --file /var/lib/libvirt/images/haproxy-${i}.qcow2 virt-sysprep -d haproxy-${i} --hostname haproxy-${i} --root-password password:CHANGE_ME virsh start haproxy-${i} done for i in {1..3};do virt-clone --connect qemu:///system --original centos7 --name etcd-${i} --file /var/lib/libvirt/images/etcd-${i}.qcow2 virt-sysprep -d etcd-${i} --hostname etcd-${i} --root-password password:CHANGE_ME virsh start etcd-${i} done .. note:: 稳定运行的Kubernetes集群需要3台Master服务器,这里多创建多 ``kubermaster-4`` 是为了演练Master服务器故障替换所准备的。 haproxy-X是用于构建 :ref:`ha_k8s` 时所需的负载均衡,用于提供apiserver的负载均衡能力。 主机名解析 ============= 在运行KVM的物理主机上 ``/etc/hosts`` 配置模拟集群的hosts域名解析 libvirt dnsmasq ----------------- 但是,在KVM虚拟机集群中,如何能够使得所有虚拟机都获得统一的DNS解析呢?显然,在集群中运行一个DNS服务器是一个解决方案。但是,请注意,在KVM libvirt的运行环境中,默认就在libvirt中运行了一个dnsmasq,实际上为 ``virtbr0`` 网络接口上连接的所有虚拟机提供了DNS解析服务。通过在物理服务器上检查 ``ps aux | grep dnsmasq`` 可以看到:: nobody 13280 0.0 0.0 53884 1116 ? S 22:15 0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper root 13281 0.0 0.0 53856 380 ? S 22:15 0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper 检查libvirt的dnsmasq配置文件 ``/var/lib/libvirt/dnsmasq/default.conf`` 可以看到:: strict-order pid-file=/var/run/libvirt/network/default.pid except-interface=lo bind-dynamic interface=virbr0 dhcp-range=192.168.122.51,192.168.122.254 dhcp-no-override dhcp-authoritative dhcp-lease-max=204 dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts 上述配置: - ``interface=virbr0`` 表示libvirt dnsmasq只对 ``virtbr0`` 接口提供服务,所以也就只影响NAT网络中对虚拟机 - ``dhcp-range=192.168.122.51,192.168.122.254`` 是我配置的DHCP范围 - ``dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile`` 是配置静态分配DHCP地址的配置文件 - ``addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts`` 是配置dnsmasq的DNS解析配置文件,类似 ``/etc/hots`` 参考 `KVM: Using dnsmasq for libvirt DNS resolution `_ ,执行 ``virsh net-edit default`` 编辑 libvirt 网络,添加 ```` 段落: .. literalinclude:: ../../../studio/libvirt_net_default.xml :language: xml :emphasize-lines: 7-53 :linenos: :caption: virsh net-edit default 然后重启libvirt default网络:: sudo virsh net-destroy default sudo virsh net-start default 此时检查物理服务器的 ``/var/lib/libvirt/dnsmasq/default.addnhosts`` 内容,原先空白的文件就会自动填写上类似 ``/etc/hosts`` 这样的配置静态IP解析:: 192.168.122.5 etcd-1.test.huatai.me 192.168.122.6 etcd-2.test.huatai.me ... .. note:: 之前我的实践发现,直接修改 ``/var/lib/libvirt/dnsmasq/default.addnhosts`` 添加静态解析内容,然后重建 ``default`` 网络也能够实现相同的DNS解析。但是,我发现过一段时间以后物理服务器的 ``/var/lib/libvirt/dnsmasq/default.addnhosts`` 会被清空。不过,在虚拟机网络中,依然能够解析DNS。似乎直接修改文件不是好的方法,所以还是参考上述文档通过修订default网络的xml来完成配置。 注意,重启网络之后,所有虚拟机的虚拟网卡会脱离网桥 ``virbr0`` ,需要重新连接:: for i in {0..13};do sudo brctl addif virbr0 vnet${i};done 随后登陆任意虚拟机,尝试解析DNS,例如,解析后续作为apiserver的VIP地址:: dig kubeapi.test.huatai.me 输出应该类似:: kubeapi.test.huatai.me. 0 IN A 192.168.122.10 而且可以使用短域名解析:: dig kubeapi 输出:: kubeapi. 0 IN A 192.168.122.10 .. note:: 如果要使用独立的dnsmasq对外提供DNS解析服务,可以参考我之前的实践 `DNSmasq 快速起步 `_ 或者 `KVM: Using dnsmasq for libvirt DNS resolution `_ pssh配置 ========== 为了方便在集群多台服务器上同时安装软件包和进行基础配置,采用pssh方式执行命令,所以准备按照虚拟机用途进行分组如下: .. literalinclude:: kube :language: bash :linenos: :caption: .. literalinclude:: kubemaster :language: bash :linenos: :caption: .. literalinclude:: kubenode :language: bash :linenos: :caption: 这样,例如需要同时安装docker软件包,只需要执行:: pssh -ih kube 'yum install docker-ce -y'