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> 段落:

virsh net-edit default
 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方式执行命令,所以准备按照虚拟机用途进行分组如下:

kube
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
kubemaster
1192.168.122.11
2192.168.122.12
3192.168.122.13
4192.168.122.14
kubenode
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'