微服务管理(完整)

前言:

分享一篇学微服务管理的过程

一,etcd入门

1,简介

1.1,etcd是什么

etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。

官网上的一段描述:

A distributed, reliable key-value store for the most critical data of a distributed system

etc是一个分布式,键值对存储系统,用于分布式的关键数据的存储。

1.2,特点

1,简单的接口,通过标准的HTTP API进行调用,也可以使用官方提供的 etcdctl 操作存储的数据

2,键值对存储。

3,有监听机制,可以监听特定键的变化,并作出响应

1.3,使用场景

  • 服务发现(Service Discovery)
  • 消息发布与订阅
  • 负载均衡
  • 分布式通知与协调
  • 分布式锁

1.4,关键字

Raft:etcd所采用的保证分布式系统强一致性的算法。

Node:一个Raft状态机实例。

Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。

Cluster:由多个Member构成可以协同工作的etcd集群。

Peer:对同一个etcd集群中另外一个Member的称呼。

Client: 向etcd集群发送HTTP请求的客户端。

WAL:预写式日志,etcd用于持久化存储的日志格式。

snapshot:etcd防止WAL文件过多而设置的快照,存储etcd数据状态。

Proxy:etcd的一种模式,为etcd集群提供反向代理服务。

Leader(领导者):Raft算法中通过竞选而产生的处理所有数据提交的节点。

Follower(跟随者):竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。

Candidate:当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始Leader竞选。

Term:某个节点成为Leader到下一次竞选开始的时间周期,称为一个Term。

Index:数据项编号。Raft中通过Term和Index来定位数据。

1.5,工作原理

第1部分是HTTP Server: 用于处理用户发送的API请求,以及其它etcd节点的同步与心跳信息请求

第2部分是Store:用于处理etcd支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现

第3部分是Raft:Raft强一致性算法的具体实现,是etcd的核心

第4部分是WAL:Write Ahead Log(预写式日志),是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。

在WAL中,所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照;Entry表示存储的具体日志内容

1.6,获取

2. 安装

2.1 etcd安装前介绍

  • etcd在生产环境中一般推荐集群方式部署
  • etcd使用的2个默认端口号:2379和2380
    2379:用于客户端通信(类似于sqlserver的1433/oracle的1521/mysql的3306)
    2380:用于与集群中的Peer通信
  • 因为etcd是go语言编写的,安装只需要下载对应的二进制文件,并放到合适的路径就行。

2.2 安装

1) 创建并切换到下载目录

复制代码
mkdir /usr/local/mytools && cd /usr/local/mytools
  1. 下载,

    wget https://github.com/etcd-io/etcd/releases/download/v3.4.3/etcd-v3.4.3-linux-amd64.tar.gz

下载比较慢,课件中提供。

  1. 解压文件到当前目录

    tar xzvf etcd-v3.4.3-linux-amd64.tar.gz

  2. 切换至etcd根目录,运行查看命令ls,里面会有一些文档和2个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端

    cd etcd-v3.4.3-linux-amd64 && ls

  3. 将etcd和etcdctl二进制文件复制到/usr/local/bin目录, 这样系统中可以直接调用etcd/etcdctl这两个程序

    cp etcd etcdctl /usr/local/bin

  4. 查看etcd版本

    etcd --version

  5. 设置etcdctl版本(v2/v3)

注意:etct3.4.3默认使用v3命令所以步骤7可省略,之前版本此步骤不可少,例如:v3.3.10

复制代码
vi /etc/profile

# 最后一行指定etcdctl命令的版本为v3
export ETCDCTL_API=3

# 刷新环境变量
source /etc/profile
#查看当前etcdctl的版本信息
#v2版本命令和v3命令是不一样的,例如:
#v2查看版本号
etcdctl -version或 etcdctl -v
#v3查看版本号
etcdctl version
# 更多命令帮助可以查询
etcdctl --help  

环境变量配置示意图:

2.3 启动

输入命令etcd,即可启动一个单节点的etcd服务,ctrl+c即可停止服务

复制代码
etcd

1.name表示节点名称,默认为default。 2.data-dir 保存日志和快照的目录,默认为当前工作目录default.etcd/目录下。 3.在http://localhost:2380和集群中其他节点通信。 4.在http://localhost:2379提供客户端交互。 5.heartbeat为100ms,该参数的作用是leader多久发送一次心跳到followers,默认值是100ms。 6.election为1000ms,该参数的作用是重新投票的超时时间,如果follow在该时间间隔没有收到心跳包,会触发重新投票,默认为1000ms。 7.snapshot count为10000,该参数的作用是指定有多少事务被提交时,触发截取快照保存到磁盘。 8.集群和每个节点都会生成一个uuid。 9.启动的时候会运行raft,选举出leader

2.4 创建一个etcd服务

  1. 建立etcd相关目录(即数据文件和配置文件的保存位置)
    /etc目录是整个Linux系统的中心,其中包含所有系统管理和维护方面的配置文件,所以etcd的配置也放在这里

    mkdir -p /var/lib/etcd/ && mkdir -p /etc/etcd/

  2. 创建etcd配置文件,详见课件中的"etcd-单机版.conf"

    vim /etc/etcd/etcd.conf

  3. 创建systemd配置文件, 详见:课件中的"etcd-单机版.service"

    vim /etc/systemd/system/etcd.service

4) 启动/停止/查看etcd服务

复制代码
## 1.重新加载systemd服务
systemctl daemon-reload

## 2.设置开机自启动
systemctl enable etcd 

## 3.启动etcd
systemctl start etcd

## 4.查看etcd运行状态
systemctl status etcd

## 5.停止服务
systemctl stop etcd

## 6.重启etcd
systemctl restart etcd

3. 常用操作

1) 如何获取帮助

复制代码
etcdctl -h
  1. put

    etcdctl put /testdir/testkey "Hello world"

支持的选项包括

--ttl '0' 该键值的超时时间(单位为秒),不配置(默认为0)则永不超时

--swap-with-value value 若该键现在的值是value,则进行设置操作

--swap-with-index '0' 若该键现在的索引值是指定索引,则进行设置操作

  1. get

    etcdctl get /testdir/testkey

--sort 对结果进行排序

--consistent 将请求发给主节点,保证获取内容的一致性。

  1. del

    清空数据

    etcdctl del / --prefix

    #删除所有/test前缀的节点
    etcdctl del /test --prefix

5)watch

复制代码
#1. 增加一个key,(客户端窗口1)
etcdctl put key1 "hello"

#2. 打开一个新的客户端窗口2,监听key1的变化
etcdctl watch key1

#3. 回到窗口1,向key1 中put新值
etcdctl put key1 "hello work"

# 4. 此时可以在窗口2中看到监听输出


# 查看版本信息
curl http://127.0.0.1:2379/version

二,etcd集群

1. ETCD集群方式

1) 静态发现

预先已知 Etcd 集群中有哪些节点,在启动时直接指定好 Etcd 的各个 node 节点地址

2) Etcd 动态发现

通过已有的 Etcd 集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制

3)DNS 动态发现

通过 DNS 查询方式获取其他节点地址信息

2. 环境准备

在虚拟机中创建三台centos系统,分别命名为etcd-node-1,etcd-node-2, etcd-node-3

在本示例中,三台机器的ip地址分别为:

机器 ip
etcd-node-1 192.168.229.132
etcd-node-2 192.168.229.133
etcd-node-3 192.168.229.134

注意:

1)为了方便选举,机器一般是奇数个。偶数个容易出现等额选票,进入下一轮选举,效率比较低。

2)在虚拟机中进行测试时,需要注意将ip地址的租约设置长一些,最长为63天。尽量避免ip地址改变,否则集群配置文件要重新配置。

3. 安装etcd

在上面准备的三台虚拟机中安装etcd。

1) 上传etcd-v3.4.3-linux-amd64.tar.gz,在课件中已经提供

  1. 创建目录

    mkdir -p /usr/local/mytools

  2. 解压到指定目录

    tar -xzvf etcd-v3.4.3-linux-amd64.tar.gz -C /usr/local/mytools && cd /usr/local/mytools/etcd-v3.4.3-linux-amd64

  3. 将安装目录下的etcdctl拷贝到/usr/local/bin下

    [root@localhost mytools]# ls
    etcd-v3.4.3-linux-amd64
    [root@localhost mytools]# cd etcd-v3.4.3-linux-amd64/
    [root@localhost etcd-v3.4.3-linux-amd64]# ls
    Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
    [root@localhost etcd-v3.4.3-linux-amd64]# cp etcd etcdctl /usr/local/bin

5)查看版本,确认安装成功

复制代码
[root@localhost etcd-v3.4.3-linux-amd64]# etcd -version
etcd Version: 3.4.3
Git SHA: 3cf2f69b5
Go Version: go1.12.12
Go OS/Arch: linux/amd64
  1. 创建etcd相关目录即数据文件(即数据文件和配置文件的保存目录)

    mkdir -p /var/lib/etcd/ && mkdir -p /etc/etcd/

  2. 编辑节点node-0配置文件

    vim /etc/etcd/etcd.conf

说明:修改/etc/etcd/etcd.conf文件要先删除/var/lib/etcd目录下保存的数据,再重新启用服务!!!,命令如下:

cd /var/lib/etcd && rm -rf *


注2:ETCD3.4版本中ETCDCTL_API=3和etcd --enable-v2=false成为了默认配置

flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API,为了兼容flannel,将默认开启v2版本,故配置文件中还要设置:ETCD_ENABLE_V2="true"

配置文件内容如下(课件中也提供了"etcd-集群版-v1.0.0.conf"):

复制代码
#########################################################
######  请根据各节点实际情况修改配置:1/3/4/5/6/7  ######
#########################################################
#[Member]
#1.节点名称,必须唯一
ETCD_NAME="etcd01"

#2.设置数据保存的目录
ETCD_DATA_DIR="/var/lib/etcd"

#3.用于监听其他etcd member的url
ETCD_LISTEN_PEER_URLS="http://192.168.183.161:2380"

#4.该节点对外提供服务的地址
ETCD_LISTEN_CLIENT_URLS="http://192.168.183.161:2379,http://127.0.0.1:2379"

#[Clustering]
#5.对外公告的该节点客户端监听地址
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.183.161:2379"

#6.该节点成员对等URL地址,且会通告群集的其余成员节点
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.183.161:2380"

#7.集群中所有节点的信息
ETCD_INITIAL_CLUSTER="etcd01=http://192.168.183.161:2380,etcd02=http://192.168.183.162:2380,etcd03=http://192.168.183.163:2380"

#8.创建集群的token,这个值每个集群保持唯一
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"

#9.初始集群状态,新建集群的时候,这个值为new;
ETCD_INITIAL_CLUSTER_STATE="new"

#10.flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API
#   为了兼容flannel,将默认开启v2版本,故配置文件中设置 
ETCD_ENABLE_V2="true"
  1. 将节点配置为一个etcd服务

    vim /etc/systemd/system/etcd.service

配置文件内容(课件资料中"etcd-集群版-v1.0.0.service"也有示例):

复制代码
[Unit]
Description=Etcd Server
Documentation=https://github.com/etcd-io/etcd
After=network.target

[Service]
User=root
Type=notify
## 根据实际情况修改EnvironmentFile和ExecStart这两个参数值
## 1.EnvironmentFile即配置文件的位置,注意"-"不能少
EnvironmentFile=-/etc/etcd/etcd.conf
## 2.ExecStart即etcd启动程序位置
ExecStart=/usr/local/bin/etcd
Restart=always
RestartSec=10s
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

9)centos,设置防火墙

复制代码
 firewall-cmd --zone=public --add-port=2379/tcp --permanent
 firewall-cmd --zone=public --add-port=2380/tcp --permanent
 
#重启防火墙:
firewall-cmd --reload

#查询有哪些端口是开启的:
firewall-cmd --list-port
  1. 启动,与重启

    重新加载服务

    systemctl daemon-reload

    #设置开机启动
    systemctl enable etcd

    #启动etcd
    systemctl start etcd

    查看状态

    systemctl status etcd

    停止etcd服务

    systemctl stop etcd

    重启etcd服务

    systemctl restart etcd




如果启动失败,可以使用如下命令检查原因:

复制代码
## 显示概要
systemctl status etcd.service 

## 查看启动详情
journalctl -xe

## 显示实时日志
journalctl -f

## 查看本机监听端口
netstat -tunlp|grep etcd

journalctl -xe -u etcd //查看日志细节 
netstat -nal //查看接口

分析命令主要包括:

systemctl list-unit-files 列出所有可用的Unit

systemctl list-units 列出所有正在运行的Unit

systemctl --failed 列出所有失败单元

systemctl mask httpd.service 禁用服务

systemctl unmask httpd.service

systemctl kill httpd 杀死服务

cat /var/log/messages | grep nginx

systemctl查看完整非截断日志显示详细信息详细日志用

systemctl status etcd.service -l

systemctl status etcd -l

接下来部署第二台,第三台服务器, 步骤与第一台一样,但要注意服务名称不能冲突,及ip地址的配置。

将三个机器部署完成后,依次启动。可以通过"journalctl -f"日志:如:

  • 可以按照上面的配置将etcd设置为开机启动(systemctl enable etcd),在这里为方便演示暂时没有配置。

4. 测试集群

复制代码
# 查看集群信息
etcdctl member list

# 以列表的方式查看集群信息
etcdctl member list -w table

# 集群状态
etcdctl endpoint health
etcdctl endpoint status

http命令

复制代码
[root@localhost ~]# etcdctl --endpoints=http://192.168.229.132:2379,http://192.168.229.133:2379,http://192.168.229.134:2379 endpoint health
http://192.168.229.134:2379 is healthy: successfully committed proposal: took = 33.371525ms
http://192.168.229.132:2379 is healthy: successfully committed proposal: took = 54.681694ms
http://192.168.229.133:2379 is healthy: successfully committed proposal: took = 55.89755ms
[root@localhost ~]# 

[root@localhost ~]# etcdctl --endpoints=http://192.168.229.133:2379 member list -w table
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |  NAME  |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
| 281f82fb01c86d63 | started | etcd01 | http://192.168.229.132:2380 | http://192.168.229.132:2379 |      false |
| 4a5c02e83634b7b4 | started | etcd03 | http://192.168.229.134:2380 | http://192.168.229.134:2379 |      false |
| 94e7f6917bafdf5a | started | etcd02 | http://192.168.229.133:2380 | http://192.168.229.133:2379 |      false |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
[root@localhost ~]#

向etcd中存放数据,及获取数据

复制代码
[root@localhost ~]# etcdctl --endpoints=http://192.168.229.133:2379 put /user 'zs'
OK
[root@localhost ~]# etcdctl --endpoints=http://192.168.229.134:2379 get /user
/user
zs
[root@localhost ~]# etcdctl get /user
/user
zs
[root@localhost ~]# 
  • 向192.168.229.133机器put值,通过92.168.229.134,及本机也可以正常获取值,说明集群成功。

三,docker跨主机访问

1. Docker跨主机通讯的常用方式

Pipework、Flannel、Weave、Open vSwitch(虚拟交换机)、Calico, 其中 Pipework、Weave、Flannel是使用的最多。

2. Flannel简介

Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,覆盖网络(Overlay Network)工具,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。

在默认的情况下,在同一宿主机中的各个Docker容器可以相互通信,但处于不同宿主机的docker容器之间是不能通讯的(相当于处在不同的网段,不能直接通讯),可以使用Flannel来解决这个问题,使得不同宿主机中的Docker容器可以互通。

  • 数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端。
  • Flannel通过Etcd服务维护了一张节点间的路由表,该张表里保存了各个节点主机的子网网段信息。
  • 源主机的flanneld服务将原本的数据内容UDP封装后(也可以通过其他方式封装)根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一样的由docker0路由到达目标容器。

Flannel支持多种Backend协议,但是不支持运行时修改Backend。官方推荐使用以下Backend:

  • VXLAN,性能损耗大概在20~30%;
  • host-gw, 性能损耗大概10%,要求Host之间二层直连,因此只适用于小集群
  • UDP, 建议只用于debug,因为性能低,如果网卡支持 enable udp offload,直接由网卡进行拆包解包,可以显著提升性能
  • ali-vpc:使用阿里云VPC route table 创建路由,适用于阿里云上运行的容器

Flannel使用etcd存储配置数据和子网分配信息。flannel 启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,然后尝试去注册它。etcd也存储这个每个主机对应的ip。flannel使用etcd的watch机制监视 /coreos.com/network/subnets 下面所有元素的变化信息,并且根据它来维护一个路由表。

etcd可以理解成springcloud中的注册中心,用于服务注册和发现,这里是节点(即宿主机)注册和发现。

注意:
etcd的v2版本何v3版本并不兼容,Flannel使用的是v2版本,请特别注意版本问题!!!

如: v2

ETCDCTL_API=2 etcdctl set key value

ETCDCTL_API=2 etcdctl ls /

ETCDCTL_API=2 etcdctl del / --prefix
v3:

ETCDCTL_API=3 etcdctl put key value

ETCDCTL_API=3 etcdctl get /

ETCDCTL_API=3 etcdctl del / --prefix
如果使用v2向etcd中保存数据,则需要用v2来获取,否则获取不到。

配置示例

1) 启动etcd集群

依次启动etcd集群中的每个节点

复制代码
[root@localhost ~]# systemctl start etcd

2) 检测etcd集群是否正常

复制代码
[root@localhost ~]# etcdctl member list -w table
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  |  NAME  |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
| 281f82fb01c86d63 | started | etcd01 | http://192.168.229.132:2380 | http://192.168.229.132:2379 |      false |
| 4a5c02e83634b7b4 | started | etcd03 | http://192.168.229.134:2380 | http://192.168.229.134:2379 |      false |
| 94e7f6917bafdf5a | started | etcd02 | http://192.168.229.133:2380 | http://192.168.229.133:2379 |      false |
+------------------+---------+--------+-----------------------------+-----------------------------+------------+
[root@localhost ~]# 

注: 该命令在etcd集群中的任何节点都应该正常获取etcd集群节点的数据


3)环境说明:

组要安装:etcd、flannel、docker, 如果没有安装docker请自行参考docker第一次课的课件进行安装。


4)安装flannel

  • 下载flannel,为了方面课件已经准备了flannel-v0.11.0-linux-amd64.tar.gz,上传到linux即可

  • 创建安装目录,并将flannel压缩文件解压到安装目录

    [root@localhost ~]# mkdir -p /opt/flannel
    [root@localhost ~]# tar xzf flannel-v0.11.0-linux-amd64.tar.gz -C /opt/flannel

    [root@localhost ~]# cd /opt/flannel
    [root@localhost flannel]# ls
    flanneld mk-docker-opts.sh README.md

flanneld为主要的执行文件,sh脚本用于生成Docker启动参数


  1. 为flannel创建一个systemd服务,用于后台启动

首先在创建一个flanneld.service,该文件的内容在课件中有参考(注意需要按自己的环境配置ip):

复制代码
vim /etc/systemd/system/flanneld.service

[Unit]
Description=Flanneld
After=network.target
After=network-online.target
Wants=network-online.target
##1.flannel服务需要先于Docker启动,后于etcd启动
After=etcd.service
Before=docker.service

[Service]
User=root
##2.ExecStart即flanneld启动程序位置
##3.--etcd-endpoints参数为ectd集群客户端地址
##4.--iface参数为要绑定的网卡的IP地址,或是网卡名(ifconfig查看获得)请根据实际情况修改
ExecStart=/opt/flannel/flanneld \
--etcd-endpoints=http://192.168.229.132:2379,http://192.168.229.133:2379,http://192.168.229.134:2379 \
--etcd-prefix=/coreos.com/network \
--iface=ens33 \
--ip-masq
Restart=on-failure
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target

6) 配置环境变量,指定使用flannel v2 的api

复制代码
vim /etc/profile
复制代码
export ETCDCTL_API=2

使环境变量生效

复制代码
source /etc/profile

注: etcd的v2和v3版本的api是不兼容的,flannel中使用了v2版本。


7) 向etcd注册网段,供flanneld使用

注:运行前请确定etcd集群正常启动。

命令如下:

ETCDCTL_API=2 etcdctl --endpoints "http://192.168.229.132:2379,http://192.168.229.133:2379,http://192.168.229.134:2379" \

set /coreos.com/network/config '{"NetWork":"10.0.0.0/16","SubnetMin": "10.0.1.0", "SubnetMax": "10.0.20.0","Backend": {"Type": "vxlan"}}'

复制代码
[root@localhost flannel]# ETCDCTL_API=2 etcdctl --endpoints "http://192.168.229.132:2379,http://192.168.229.133:2379,http://192.168.229.134:2379" \>        set /coreos.com/network/config '{"NetWork":"10.0.0.0/16","SubnetMin": "10.0.1.0", "SubnetMax": "10.0.20.0","Backend": {"Type": "vxlan"}}'
{"NetWork":"10.0.0.0/16","SubnetMin": "10.0.1.0", "SubnetMax": "10.0.20.0","Backend": {"Type": "vxlan"}}
[root@localhost flannel]# 

检查是否可以正常获取值

命令如下:

ETCDCTL_API=2 etcdctl --endpoints "http://192.168.229.132:2379,http://192.168.229.133:2379,http://192.168.229.134:2379" get /coreos.com/network/config

复制代码
[root@localhost flannel]# ETCDCTL_API=2 etcdctl --endpoints "http://192.168.229.132:2379,http://192.168.229.133:2379,http://192.168.229.134:2379" get /coreos.com/network/config
{"NetWork":"10.0.0.0/16","SubnetMin": "10.0.1.0", "SubnetMax": "10.0.20.0","Backend": {"Type": "vxlan"}}
[root@localhost flannel]# 

8)flanneld服务启用/自启/停止/重启

复制代码
systemctl daemon-reload     #重新加载服务 
systemctl enable flanneld    #设置开机启动
systemctl start flanneld       #启动flannel   
systemctl stop flanneld       #停止flanne
systemctl status flanneld     #查看状态
systemctl restart flanneld    #重启flannel

注:为便于演示启动过程,在etcd配置集群时暂时没用配置开机启动,所以此处也暂时不对flannel进行开机启动,如果flannel需要开机自启,可先将etcd集群设置自启。


9)配置Docker

在各个节点安装好Docker,然后更改Docker的启动参数,使其能够使用flannel进行IP分配,以及网络通讯。

  • 在Flannel运行之后,会生成一个环境变量文件,包含了当前主机要使用flannel通讯的相关参数

    [root@localhost flannel]# cat /run/flannel/subnet.env
    FLANNEL_NETWORK=10.0.0.0/16
    FLANNEL_SUBNET=10.0.19.1/24
    FLANNEL_MTU=1450
    FLANNEL_IPMASQ=true
    [root@localhost flannel]#

  • 创建目录,用于存放下一步需要生成的docker环境配置文件

    mkdir -p /usr/flannel

  • 创建Docker运行参数
    使用flannel提供的脚本将subnet.env转写成Docker启动参数,目前时不存在的,转换之后会生成。

    [root@localhost flannel]# /opt/flannel/mk-docker-opts.sh -d /usr/flannel/docker_opts.env -c
    [root@localhost flannel]#
    [root@localhost flannel]# cat /usr/flannel/docker_opts.env
    DOCKER_OPTS=" --bip=10.0.19.1/24 --ip-masq=false --mtu=1450"
    [root@localhost flannel]#

--bip=10.0.19.1/24,即为docker0虚拟网卡的地址

--ip-masq=false 为网桥上的IP地址开启IP伪装

注意:网络有资料将docker_opts.env放在/run/flannel目录下,但run目录下重启系统后docker_opts.env文件会自动消失,建议将docker_opts.env放在其他目录,如:/usr/flannel,其他的配置需要做相应改动(/lib/systemd/system/docker.service 中的EnvironmentFile)

  • 修改Docker启动参数
    编辑 systemd service 配置文件

    vim /lib/systemd/system/docker.service

##下面是docker.service要修改的2个地方

##1.Service节中,指定启动参数所在的文件位置(这个配置是新增的)

EnvironmentFile=/usr/flannel/docker_opts.env

##在原有ExecStart后面添加$DOCKER_OPTS

##修改前

#ExecStart=/usr/bin/dockerd

##2.修改后

ExecStart=/usr/bin/dockerd $DOCKER_OPTS

注意:该截图上的EnvironmentFile配置为没有将docker_opts.env放到/usr/flannel/下的配置截图。仅供参考,为说明配置项在整个配置文件中的位置。

  • 重新加载systemd配置,并重启Docker即可

    systemctl daemon-reload && systemctl restart docker && systemctl status docker

  • 重启之后查看网络配置

    ifconfig


10) 按上面相同的步骤配置其他两台虚拟机


11) 测试flannel网络

  • 下载一个centos的镜像

    docker pull centos

  • 设置防火墙规则,否则不同主机的docker容器的通讯,会被防火墙禁止

iptables -P INPUT ACCEPT && iptables -P FORWARD ACCEPT && iptables -F && iptables -L -n

  • 启动容器

    [root@localhost flannel]# docker run -it centos /bin/bash

  • 在集群中的两外两台机器下载centos镜像,设置防火墙,运行容器,步骤与上面的相同。

  • 查看centos容器的ip地址,在其他的机器中进行测试。

    node-1:


node-2:


node-1 新建一个连接窗口,测试同一台苏州机上的容器通讯

四,docker-compose

1. compose作用

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排,通过编写docker-compose文件可对多个服务同时进行启动/停止/更新(可定义依赖,按顺序启动服务) 。

docker-compose将所管理的容器分为3层结构:

project 1 一个微服务项目

service N 由N个微服务组成

container N 而每个微服务又由N个节点组成

一个微服务架构的系统有多个服务组成,一个服务可以启动多台机器集群。

使用compose基本上是一个三步过程:

1)用dockerfile,或者镜像定义应用程序的环境,以便在任何地方复制。

2)在docker-compose.yml中定义组成应用程序的服务,以便它们可以在单独的环境中一起运行。

3)运行docker compose up启动并运行整个应用程序。

官网

2. docker-componse安装

复制代码
# 下载
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 2. 赋权
chmod +x /usr/local/bin/docker-compose

# 3. 在/usr/bin 目录下创建连接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 4. 检查版本号
docker-compose --version

3. 配置示例

该示例通过配置nginx + tomcat(3台)集群,来演示docker-compose的基本使用。

3.1 docker-compose.yml示例

官网

复制代码
version: "3.9"  # optional since v1.27.0services:
services:
  frontend:
    image: awesome/webapp
    ports:
      - "443:8043"
    networks:
      - front-tier
      - back-tier
    configs:
      - httpd-config
    secrets:
      - server-certificate

  backend:
    image: awesome/database
    volumes:
      - db-data:/etc/data
    networks:
      - back-tier

volumes:
  db-data:
    driver: flocker
    driver_opts:
      size: "10GiB"

configs:
  httpd-config:
    external: true

secrets:
  server-certificate:
    external: true

networks:
  # The presence of these objects is sufficient to define them
  front-tier: {}
  back-tier: {}

注1:Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用

3.2 准备工作

1) 准备需要的挂载目录,用于挂载nginx配置文件,日志,tomcat的部署目录,日志等

复制代码
# nginx挂载目录
mkdir -p /opt/nginx/conf/ /opt/nginx/www /opt/nginx/logs

# tomcat挂载目录
mkdir -p /opt/tomcat/webapps/ROOT /opt/tomcat/conf /opt/tomcat/logs

2)在宿主机/opt/tomcat/webapps/ROOT目录下创建一个用于测试的html文件。

复制代码
<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"/> 
    <title>Nginx+tomcat集群</title> 
    </head> 
    
    <body> 
        <h1>Nginx+tomcat集群部署示例</h1> 
    </body> 
<html>
  1. 配置nginx的配置文件
复制代码

3)docker-compose.yml文件,可以从课件中上传

复制代码
version: '3.9'
services:
  
  tomcat01:
    container_name: tomcat01
    image: tomcat
    volumes:
      - /opt/tomcat/webapps:/usr/local/tomcat/webapps
    networks:
      mynet: 
        ipv4_address: 192.168.0.10
        
  tomcat02:
    container_name: tomcat02
    image: tomcat
    volumes:
      - /opt/tomcat/webapps:/usr/local/tomcat/webapps
    networks:
      mynet: 
        ipv4_address: 192.168.0.11

  tomcat03:
    container_name: tomcat03
    image: tomcat
    volumes:
      - /opt/tomcat/webapps:/usr/local/tomcat/webapps
    networks:
      mynet: 
        ipv4_address: 192.168.0.12

  nginx:
    #定义主机名
    container_name: mynginx
    #使用的镜像
    image: nginx
    #容器的映射端口
    ports:
      - 80:80
    depends_on:
      - tomcat01
      - tomcat02
      - tomcat03
    #定义挂载点
    volumes:
      - /opt/nginx/www:/usr/share/nginx/html
      - /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /opt/nginx/logs:/var/log/nginx
    #指定容器网络
    networks:
      mynet: 
        ipv4_address: 192.168.0.20
    #docker 重启后,容器自启动
    restart: always
    
networks:
  mynet:
    ipam: 
      driver: default
      config: 
        - subnet: "192.168.0.0/24"

4) 使用docker-compose运行容器

复制代码
docker-compose up -d

4. 常用命令

复制代码
  1)docker-compose up:构建并启动容器
     #启动单个服务:
     docker-compose up 服务名称  #服务名称来自于docker-compose.yml中services指定的容器服务名
     #启动多个服务:
     docker-compose up
     #后台启动服务
     docker-compose up -d
  
  2)docker-compose down:停止和删除容器、网络、卷、镜像

  3)docker-compose start [服务名称]:启动指定服务或启动所有服务
  
  4)docker-compose stop [服务名称]:停止指定服务或停止所有服务

  5)docker-compose ps:列出所有运行容器

  6)docker-compose exec:进入指定容器
相关推荐
江米小枣tonylua9 小时前
译:设计生产级 RAG 架构
架构
怕浪猫15 小时前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
怕浪猫15 小时前
哪些软件对 Chrome DevTools Protocol 频繁使用
人工智能·架构·前端框架
Jack201 天前
HarmonyOS APP事件驱动大揭秘
架构
米丘1 天前
微前端之 Web Components 完全指南
微服务·html
秋播1 天前
国内本地WSL2编译rancher源码
云原生
Colin草率地做慢慢地改1 天前
关于QuickStore这个项目的重构(2)- 数据库建表文件
后端·面试·架构
candyTong1 天前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
唐某人丶2 天前
从画架构图开始:架构分析与进阶指南
架构