使用vagrant搭建istio环境

背景

笔者最近需搭建一个开发用的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。
centos7-virtualbox
通过如下命令将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的截图
kiali

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值