目录
背景
笔者最近需搭建一个开发用的istio环境。公司给了一台服务器: 128核,256G内存,2T硬盘, centos7。用它虚出几台虚机,搭建k8s,再搭istio,性能上应该不是问题。
搭建多虚机
先用vagrant+virtualbox虚6台虚机。其中5台用于搭建1主4从的k8s环境, 另1台用于docker私服。下面是具体步骤。
软件准备
vagrant是用于构建和管理虚拟机环境的开源命令行工具,支持多种操作系统。先从vagrant下载地址获取linux版本。然后在从virtualbox下载地址下载一个linux版本的virtualbox作为虚机软件。这两个都是rpm格式。采用yum install安装即可。下面是我用的版本
[root@c0423 software]# ls -lh
-rw-r--r--. 1 root root 39M Feb 7 12:36 vagrant_2.2.14_x86_64.rpm
-rw-r--r--. 1 root root 97M Feb 7 14:42 VirtualBox-6.1-6.1.18_142142_el7-1.x86_64.rpm
接着从这里获取一个centos7的 box。
通过如下命令将box加入vagrant,并指定本地名为"centos/7"。
vagrant box add centos/7 virtualbox.box
加成功了,可通过vagrant box list看到。
[root@c0423 vm]# vagrant box list
centos/7 (virtualbox, 0)
建一个目录,然后进入此目录,执行如下命令建立虚机环境配置文件:
vagrant init centos/7
该命令会在目录下生成一个配置文件Vagrantfile. 接下来就可进行6台机器的配置了。
vagrant配置
下面先贴出我的配置。
Vagrant.configure("2") do |config|
# 默认配置,适合所有虚机
config.vm.box = "centos/7"
config.disksize.size = "300GB" # 给虚机挂载的数据盘。 因为默认安装的virtualbox, 只有40G, 空间不够
# 公共网络
config.vm.network "public_network"
config.vm.provider "virtualbox" do |vb|
vb.memory = "32768" # 虚机内存
vb.cpus = 16 #虚机cpu核数
end
config.vm.define "master" do |master|
master.vm.host_name = "master" #机器名
master.vm.network :private_network, ip:"192.168.1.10" #机器对应的虚IP,一定要用私有网络
end
config.vm.define "minion1" do |minion1|
minion1.vm.host_name = "minion1"
minion1.vm.network :private_network, ip:"192.168.1.11"
end
config.vm.define "minion2" do |minion2|
minion2.vm.host_name = "minion2"
minion2.vm.network :private_network, ip:"192.168.1.12"
end
config.vm.define "minion3" do |minion3|
minion3.vm.host_name = "minion3"
minion3.vm.network :private_network, ip:"192.168.1.13"
end
config.vm.define "minion4" do |minion4|
minion4.vm.host_name = "minion4"
minion4.vm.network :private_network, ip:"192.168.1.14"
end
config.vm.define "harbor" do |harbor|
# docker私服配置只要4核8G内存,采用如下方式单独配置
harbor.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--name", "harbor", "--memory", "8192", "--cpus", "4"]
end
harbor.vm.host_name = "harbor"
harbor.vm.network :private_network, ip:"192.168.1.15"
end
end
下面列出Vagrantfile需要注意的地方:
一定要配公共网络,即public_network; 各虚机IP要绑定到私有网络,即private_network。 否则后续搭建的k8s, istio会有问题. 比如我就遇到过k8s-metrics不可用,如下
[root@master kubeasz]# kubectl top nodes
Error from server (ServiceUnavailable): the server is currently unable to handle the request (get nodes.metrics.k8s.io)
[root@master kubeasz]# kubectl logs -n kube-system dashboard-metrics-scraper-79c5968bdc-4mpvt
{"level":"error","msg":"Error scraping node metrics: the server is currently unable to handle the request (get nodes.metrics.k8s.io)","time":"2021-02-08T10:28:49Z"}
172.20.4.1 - - [08/Feb/2021:10:28:55 +0000] "GET / HTTP/1.1" 200 6 "" "kube-probe/1.20"
执行
通过运行如下命令就可安装虚机了。安装的时候,会提示你选择哪个网卡绑定,按实际选即可。比如我的就是em1.
vagrant up
执行成功后,通过vagrant status就能看到。然后vagrant ssh [虚机名] 就能访问装好的虚机了。
[root@c0423 vm]# vagrant status
Current machine states:
master running (virtualbox)
minion1 running (virtualbox)
minion2 running (virtualbox)
minion3 running (virtualbox)
minion4 running (virtualbox)
harbor running (virtualbox)
[root@c0423 vm]# vagrant ssh master
Last login: Mon Feb 22 15:50:55 2021 from 10.0.2.2
[vagrant@master ~]$
vagrant常用指令如下:
- vagrant box add 添加box
- vagrant init 初始化 box
- vagrant up 启动虚拟机
- vagrant ssh 登录虚拟机
- vagrant box list 列出 Vagrant 当前 box 列表
- vagrant box remove 删除相应的 box
- vagrant destroy 停止当前正在运行的虚拟机并销毁所有创建的资源
- vagrant halt 关机
- vagrant package 把当前的运行的虚拟机环境进行打包为 box 文件
- vagrant plugin 安装卸载插件
- vagrant reload 重新启动虚拟机,重新载入配置文件
- vagrant resume 恢复被挂起的状态
- vagrant status 获取当前虚拟机的状态
- vagrant suspend 挂起当前的虚拟机
- vagrant global-status 查看当前 vagrant 管理的所有 vm 信息
空间问题
virtualbox默认将虚机系统装到根分区/root/VirtualBox VMs里,如根分区空间不够。可将里面内容迁移到别的地方,然后建一个软连接。移动前,需通过vagrant halt命令关闭虚机。比如我是这样弄的。
mv ~/VirtualBox\ VMs/ /home/console/vb-storage
ln -s /home/console/vb-storage/Virtualbox\ VMS ~/Virtualbox\ VMS
移动完,再通过vagrant up启动虚机。
搭建k8s
通过vagrant ssh访问各虚机,格式化和挂载新的硬盘空间。登录虚机后,默认是非root用户。可通过sudo su切换到root用户,同时也可改root密码。这里推荐使用kubeasz来搭建k8s。这是一个不错的开源搭建工具,不用*, 且楼主在不断地更新发布release。网站里有详细的搭建过程,这里不再复述。我使用了release 3.0.0安装k8s. 搭建完后,通过如下命令就能看到k8s环境。这是一个1主4从的k8s, k8s的版本是v1.20.2, 比较新。
[root@master vagrant]# k get no
NAME STATUS ROLES AGE VERSION
192.168.1.10 Ready,SchedulingDisabled master 4d1h v1.20.2
192.168.1.11 Ready node 4d1h v1.20.2
192.168.1.12 Ready node 4d1h v1.20.2
192.168.1.13 Ready node 4d1h v1.20.2
192.168.1.14 Ready node 4d1h v1.20.2
k是kubectl的别名,通过alias配置下即可
按kubeasz教程,集群每台机器的Linux内核都要升级,一般建议在4.0以上。我的升级到5.4.99。
搭建istio
软件准备
先从istio下载地址获取最新的istio,我用的是v1.9, 当前最新的。我是下载tar.gz包安装的,官方推荐的curl安装方式不行。解压后,将其bin目录放到$PATH里。然后就可以进行安装了。下面命令说明istioctl命令可用了
[root@master vagrant]# which istioctl
/data/istio-1.9.0/bin/istioctl
安装
进入解开的istio目录,然后执行如下命令即可。我采用的profile是demo, 不设置profile,默认是default. demo带了istiod, ingressgateway和egressgateway。而default只有前两个。profile有很多种,一般用这两个就行
istioctl install --set profile=demo
执行成功后,输入如下命令,出现如下结果说明就安装OK了。
[root@master vagrant]# k get po -n istio-system
NAME READY STATUS RESTARTS AGE
istio-egressgateway-65b9c8b54f-rvnzl 1/1 Running 0 3d22h
istio-ingressgateway-56d9b7fdb-mp8b8 1/1 Running 0 3d22h
istiod-89dc6db9c-96llr 1/1 Running 0 3d22h
然后还可以安装istio的kiali, prometheus和jaeger, 这样就可以通过网页方式来管理和监控istio。如何安装在官方文档都有。
注意事项
一开始安装的时候,我的ingressgateway和egressgateway总是不能ready, 排查半天,发现是因为有一台虚机的内核跳回去了,不是最新的内核5.4.99。 重新切换回去,就可以了。
[root@minion4 ~]# uname -sr
Linux 3.10.0-1160.15.2.el7.x86_64
# 强制指定内核
. 打开并编辑 /etc/default/grub并设置GRUB_DEFAULT=0
. grub2-mkconfig -o /boot/grub2/grub.cfg
. reboot
[root@minion4 ~]# uname -sr
Linux 5.4.99-1.el7.elrepo.x86_64
haproxy
因为我本机只能访问实体机IP,而虚机IP不能访问,所以k8s和istio web服务都不能远程通过浏览器访问。虽然可用vagrant进行端口映射,但这样每次都要重新加载vagrant, 不是很方便。通过在实体机安装haproxy可解决此问题。新服务只要在/etc/haproxy/haproxy.cfg添加后, 再通过systemctl restart haproxy即可。
[root@c0423 vm]# cat /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode tcp
log global
option tcplog
option dontlognull
#option http-server-close
#option forwardfor except 127.0.0.0/8
#option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# harbor
#---------------------------------------------------------------------
listen harbor
bind *:8443
balance static-rr
server h1 192.168.1.15:8443
#---------------------------------------------------------------------
# k8s-dashboard
#---------------------------------------------------------------------
listen k8s-dashboard
bind *:31225
balance roundrobin
server kd1 192.168.1.10:31225 check inter 2000 fall 2 rise 2 weight 1
server kd2 192.168.1.11:31225 check inter 2000 fall 2 rise 2 weight 1
server kd3 192.168.1.12:31225 check inter 2000 fall 2 rise 2 weight 1
server kd4 192.168.1.13:31225 check inter 2000 fall 2 rise 2 weight 1
server kd5 192.168.1.14:31225 check inter 2000 fall 2 rise 2 weight 1
#---------------------------------------------------------------------
# bookinfo
#---------------------------------------------------------------------
listen book-info
bind *:30267
balance roundrobin
server bi1 192.168.1.10:30267 check inter 2000 fall 2 rise 2 weight 1
server bi2 192.168.1.11:30267 check inter 2000 fall 2 rise 2 weight 1
server bi3 192.168.1.12:30267 check inter 2000 fall 2 rise 2 weight 1
server bi4 192.168.1.13:30267 check inter 2000 fall 2 rise 2 weight 1
server bi5 192.168.1.14:30267 check inter 2000 fall 2 rise 2 weight 1
#---------------------------------------------------------------------
# kiali
#---------------------------------------------------------------------
listen kiali
bind *:30011
balance roundrobin
server k1 192.168.1.10:30011 check inter 2000 fall 2 rise 2 weight 1
server k2 192.168.1.11:30011 check inter 2000 fall 2 rise 2 weight 1
server k3 192.168.1.12:30011 check inter 2000 fall 2 rise 2 weight 1
server k4 192.168.1.13:30011 check inter 2000 fall 2 rise 2 weight 1
server k5 192.168.1.14:30011 check inter 2000 fall 2 rise 2 weight 1
相关的服务,都是通过NodePort来实现对外访问的。 自带的kiali是没有NodePort的,是我后续加上的。我这加的是30011作为nodePort。 如下,很简单。
通过修改如下文件即可。
vim samples/addons/kiali.yaml
修改内容
spec:
ports:
- name: http
protocol: TCP
port: 20001
nodePort: 30011 #新加内容
- name: http-metrics
protocol: TCP
port: 9090
type: NodePort #新加内容
然后重新k apply -f此文件即可。
注意事项
因为实体机的SELINUX=enforcing, 导致haproxy不能bind端口,导致服务运行不起来。又不能修改/etc/sysconfig/selinux文件将其disabled, 再重启机器来解决。通过如下命令可禁止,然后haproxy就OK了
setsebool -P haproxy_connect_any=1
下面是远程访问kia的截图