TABLE OF CONTENTS

  1. 系统资源
  2. 创建虚拟主机
  3. 网络配置
    1. 1、修改hostname
    2. 2、修改虚拟网卡置
  4. SSH免密登录
    1. 基本原理
    2. 操作步骤
      1. 服务端配置允许公钥授权登陆
      2. 客户端生成RSA公私钥对
      3. SSH免密配置
      4. MobaXterm或shell客户端分组维护服务器信息
    3. 可能遇到的问题
      1. ~/.ssh目录和authorized_keys文件的权限问题
      2. SSH服务端可能配置了不允许root用户登录
      3. Linux创建用户设置密码提示:BAD PASSWORD: The password is shorter than 8 characters
    4. ansible工具
      1. 设备管理主机列表ansible配置
      2. 禁用主机检查
      3. 配置时间同步
  5. 附录

Windows可以使用VMWare搭建linux集群,用于日常学习、工作开发测试。自身电脑配置较好的情况下,可以节省购买云服务器的开销。

系统资源

下面是我根据集群最少节点要求,自身电脑配置来规划的集群信息。

kubernetes集群:最少3台,1 master,2 worker
etcd集群:最少3台,1 master, 2 node
mysql主从同步集群:最少2台,1 master,1 slave

IP 角色 主机名 组件 配置
192.168.2.183 Windows10,个人PC Tsukasa VMWare -
192.168.2.100 deploy tsukasa ansible, docker, harbor 4Cx2Gx20G
192.168.2.100 kubernetes k8s-master kubectl, kubelet, kubeadm, flnanel 2Cx2Gx20G
192.168.2.101 kubernetes k8s-worker01 kubectl 2Cx1Gx20G
192.168.2.102 kubernetes k8s-worker02 kubectl 2Cx1Gx20G
192.168.2.103 etcd etcd01 etcd 2Cx1Gx20G
192.168.2.104 etcd etcd02 etcd 1Cx1Gx10G
192.168.2.105 etcd etcd03(leader) etcd 1Cx1Gx10G
192.168.2.106 mysql mysql01 mysql 2Cx1Gx15G
192.168.2.107 mysql mysql02 mysql 2Cx1Gx15G

System:Centos 7,64位
User:root/tsukasa

1
2
[tsukasa@tsukasa ~]$ cat /proc/version
Linux version 3.10.0-693.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Tue Aug 22 21:09:27 UTC 2017

创建虚拟主机

网络上创建虚拟主机的教程很多,为了方便,网络设置通过桥接模式上网,下面上面一章节的系统资源创建主机。

k8s-master主机配置示例:

安装过程中,可以在下面图形化界面进行网络配置,也可以参照下一章节进行网络配置。

网络配置

通过桥接模式上网,下面配置在所有节点执行。

1、修改hostname

如果前期设置hostname不符合预期,可以执行下面命令,或者修改/etc/hostname文件

1
hostnamectl set-hostname <hostname>

2、修改虚拟网卡置

(1)执行命令ifconfig,查看虚拟网卡位ens33,修改网卡配置命令:vim /etc/sysconfig/network-scripts/ifcfg-ens33

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=a4214b82-9e0e-4c27-b499-9890e5068306
DEVICE=ens33
ONBOOT=yes
IPV6_PRIVACY=no
IPADDR=192.168.2.100
PREFIX=24
GATEWAY=192.168.2.1
DNS1=223.5.5.5

重要参数

  • BOOTPROTO:默认是dhcp,动态分配ip地址,这里指定为static,后续ip则不会改变
  • NAME, DEVICE: 与ifconfig命令中看到的网卡名称保持一致
  • ONBOOT:yes表示开机自启
  • IPADDR, NETMASK, GATEWAY, DNS1:根据自己的网络配置进行配置即可宿主机器(Windows)查询ipconfig,查到网关为192.168.2.1,子网掩码为255.255.255.0,个人PC地址为192.168.2.183。这里我们手动给k8s-master主机分配IP为192.168.2.100,不与当前局域网下其他ip冲突即可。DNS服务器选择阿里云的公共免费DNS -> 223.5.5.5或者223.6.6.6

(2)修改完成后,重启网络服务

1
2
systemctl restart network.service

如果配置成功

  • 执行ping baidu.com可以正常联网。
  • 局域网主机之间可以互相ping通,个人PC可以通过ping 192.168.2.100

SSH免密登录

按照系统资源创建好所有主机并完成网络配置后,可以配置下deploy跳板机SSH免密登陆集群中的其他机器,方便后续通过ansible进行批量操作。

基本原理

SSH通过RSA非对称密钥算法实现身份验证,客户端A把公钥发给服务端B,服务端用客户端的公钥加密一段随机字符串返回给客户端,客户端用私钥解密再次发给服务端,服务端验证通过,在~/.ssh/authorized_keys中追加客户端公钥后,后续可以免密登陆。

操作步骤

服务端配置允许公钥授权登陆

所有主机需要修改下面配置,允许公钥授权登陆。

vi /etc/ssh/sshd_config

1
2
3
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

重启sshd服务

1
systemctl restart sshd

客户端生成RSA公私钥对

客户端切换到需要免密登陆的用户,执行下面命令生成RSA公私钥对,系统自动生成~/.ssh目录和公私钥。

1
2
3
4
5
6
7
8
9
# 在deploy主机下执行
ssh-keygen -t rsa

[root@tsukasa ~]# ll ~/.ssh
total 12
-rw-------. 1 root root 1675 Jul 29 01:26 id_rsa
-rw-r--r--. 1 root root 394 Jul 29 01:26 id_rsa.pub
-rw-r--r--. 1 root root 1400 Jul 29 01:30 known_hosts

SSH免密配置

方法一:ssh-copy-id(推荐)

单台服务器配置免密登陆,后续可以通过ssh user@host直接登陆。

1
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

通常linux集群中会根据业务分配一个业务用户,后续跳板机可以通过ssh <ip>更简洁的方式登陆。我所有主机的业务用户都为tsukasa

因为集群中的机器很多,可以通过循环的方式,批量授权。具体步骤:
确认所有服务器设置好允许通过公钥授权登陆后,登陆到deploy主机,切换到想要免密登陆的用户如tsukasa,执行下列命令完成批量授权。

1
for xIp in 192.168.2.{100..107}; do  ssh-copy-id  -i ~/.ssh/id_rsa.pub $xIp; done

方法二:手动在服务端的authorized_keys文件追加客户端公钥

这种方法需要在每一台服务器上执行,追加完成后,在deploy主机中分别验证:

1
ssh -v user@host

MobaXterm或shell客户端分组维护服务器信息

可能遇到的问题

~/.ssh目录和authorized_keys文件的权限问题

Linux出于安全的考虑,~/.ssh目录目录权限和authorized_keys文件权限不能过大,手动创建场景要修改访问权限:

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

SSH服务端可能配置了不允许root用户登录

修改/etc/ssh/sshd_config,将PermitRootLogin no改为PermitRootLogin yes

Linux创建用户设置密码提示:BAD PASSWORD: The password is shorter than 8 characters

linux在系统初始化的时候可以强制创建密码少于8个字符的用户,初始化成功通过命令行终端创建会失败,提示BAD PASSWORD: The password is shorter than 8 characters

1
2
3
groupadd tsukasa
useradd tsukasa -g tsukasa
passwd

通常地,在生产环境我们不应该设置过于简单的密码,因为是个人开发环境,没有必要设置那么复杂。此时,可以这样进行密码设置:

1
echo 密码 |passwd --stdin 用户名

ansible工具

为了后续操作在各个服务器主机批量执行,减少重复工作,选择基于SSH协议传输数据的ansible工具。

因为所有操作在跳板机进行,ansible在deploy主机安装即可。

1
2
3
4
5
6
7
8
9
yum -y install https://releases.ansible.com/ansible/rpm/release/epel-7-x86_64/ansible-2.9.27-1.el7.ans.noarch.rpm

[root@tsukasa ~]# ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]

设备管理主机列表ansible配置

/etc/ansible/hosts文件中配置集群分组信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[master]
192.168.2.100 node_name=k8s-master

[worker]
192.168.2.101 node_name=k8s-worker01
192.168.2.102 node_name=k8s-worker02

[etcd]
192.168.2.103 etcd_name=etcd01
192.168.2.104 etcd_name=etcd02
192.168.2.105 etcd_name=etcd03

[k8s:children]
master
worker

[mysql]
192.168.2.106
192.168.2.107

[elb]
192.168.2.108

禁用主机检查

vi /etc/ansible/ansible.cfg

1
2
# uncomment this to disable SSH key host checking
host_key_checking = False

配置时间同步

搭建集群通常要求集群节点必须精确一致,因此所有机器都需要配置时间同步,在deploy主机执行ansible命令

1
2
3
4
5
6
ansible all -m command -a "yum install ntpdate -y"
ansible all -m command -a "ntpdate ntp.aliyun.com"

# 将时间同步加入linux定时任务,每30分钟执行一次
ansible all -m cron -a 'minute=*/30 job="/usr/sbin/ntpdate ntp.aliyun.com" name="time sync"'
# 删除任务:ansible elb -m cron -a 'name="time sync" state=absent'

附录

在线计算子网掩码

声明:本站所有文章均为原创或翻译,遵循署名 - 非商业性使用 - 禁止演绎 4.0 国际许可协议,如需转载请确保您对该协议有足够了解,并附上作者名 (Tsukasa) 及原文地址