Kubernetes部署服务器¶
在部署模拟Kubernetes集群的环境中,我采用如下虚拟机部署:
3台 Kubernetes Mster
5台 Kubernetes Node
2台 HAProxy
3台 etcd
clone k8s虚拟机¶
备注
本案例在单台物理主机上部署多个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
备注
稳定运行的Kubernetes集群需要3台Master服务器,这里多创建多 kubermaster-4
是为了演练Master服务器故障替换所准备的。
haproxy-X是用于构建 高可用(HA)Kubernetes集群 时所需的负载均衡,用于提供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 网络,添加 <dns></dns>
段落:
1<network>
2 <name>default</name>
3 <uuid>7cbc12d6-1899-4808-8d76-cdda780e3cc9</uuid>
4 <forward mode='nat'/>
5 <bridge name='virbr0' stp='on' delay='0'/>
6 <mac address='52:54:00:03:12:89'/>
7 <dns>
8 <host ip='192.168.122.5'>
9 <hostname>etcd-1.test.huatai.me</hostname>
10 </host>
11 <host ip='192.168.122.6'>
12 <hostname>etcd-2.test.huatai.me</hostname>
13 </host>
14 <host ip='192.168.122.7'>
15 <hostname>etcd-3.test.huatai.me</hostname>
16 </host>
17 <host ip='192.168.122.8'>
18 <hostname>haproxy-1.test.huatai.me</hostname>
19 </host>
20 <host ip='192.168.122.9'>
21 <hostname>haproxy-2.test.huatai.me</hostname>
22 </host>
23 <host ip='192.168.122.10'>
24 <hostname>kubeapi.test.huatai.me</hostname>
25 </host>
26 <host ip='192.168.122.11'>
27 <hostname>kubemaster-1.test.huatai.me</hostname>
28 </host>
29 <host ip='192.168.122.12'>
30 <hostname>kubemaster-2.test.huatai.me</hostname>
31 </host>
32 <host ip='192.168.122.13'>
33 <hostname>kubemaster-3.test.huatai.me</hostname>
34 </host>
35 <host ip='192.168.122.14'>
36 <hostname>kubemaster-4.test.huatai.me</hostname>
37 </host>
38 <host ip='192.168.122.15'>
39 <hostname>kubenode-1.test.huatai.me</hostname>
40 </host>
41 <host ip='192.168.122.16'>
42 <hostname>kubenode-2.test.huatai.me</hostname>
43 </host>
44 <host ip='192.168.122.17'>
45 <hostname>kubenode-3.test.huatai.me</hostname>
46 </host>
47 <host ip='192.168.122.18'>
48 <hostname>kubenode-4.test.huatai.me</hostname>
49 </host>
50 <host ip='192.168.122.19'>
51 <hostname>kubenode-5.test.huatai.me</hostname>
52 </host>
53 </dns>
54 <ip address='192.168.122.1' netmask='255.255.255.0'>
55 <dhcp>
56 <range start='192.168.122.51' end='192.168.122.254'/>
57 </dhcp>
58 </ip>
59</network>
然后重启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
...
备注
之前我的实践发现,直接修改 /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
备注
如果要使用独立的dnsmasq对外提供DNS解析服务,可以参考我之前的实践 DNSmasq 快速起步 或者 KVM: Using dnsmasq for libvirt DNS resolution
pssh配置¶
为了方便在集群多台服务器上同时安装软件包和进行基础配置,采用pssh方式执行命令,所以准备按照虚拟机用途进行分组如下:
1192.168.122.11
2192.168.122.12
3192.168.122.13
4192.168.122.14
5192.168.122.15
6192.168.122.16
7192.168.122.17
8192.168.122.18
9192.168.122.19
1192.168.122.11
2192.168.122.12
3192.168.122.13
4192.168.122.14
1192.168.122.15
2192.168.122.16
3192.168.122.17
4192.168.122.18
5192.168.122.19
这样,例如需要同时安装docker软件包,只需要执行:
pssh -ih kube 'yum install docker-ce -y'