文章目录

  • 一:搭建前端LB负载均衡+keepalived
    • 1.1 环境优化
    • 1.2 yum 安装nginx(两个lb都做)
    • 1.3 添加四层转发 upstream(两个lb都做)
    • 1.4 开启nginx(两个lb都做)
    • 1.5 本地验证一下(两个lb都做)
  • 二:接下来部署keepalived服务
    • 2.1 安装keepalived
    • 2.2 编辑keepalived配置文件
    • 2.3 编辑检查nginx脚本
    • 2.4 开启keepalived,是否设置自启动自己考虑
    • 2.5 使用ip a可以查看到虚拟IP
  • 三:将k8s中的node节点关于apiserver地址指向为vip
    • 3.1 这样node去找master就会去找vip
    • 3.2 重启服务kubelet、proxy
    • 3.3 替换完成直接自检
  • 四:验证apiserver漂移地址
  • 五:重新开启lb1nginx
  • 六:查看lb1上的关于nginx的k8s日志
  • 七:创建pod测试
    • 7.1 此时node节点docker状态
    • 7.2 使用kubectl创建pod
    • 7.3 查看pod日志,发现有报错
    • 7.4 查看pod网络,这也可以查看出此pod被部署到哪个node上
    • 7.5 在node02节点上可以直接访问容器nginx
    • 7.6 此时查看容器日志

一:搭建前端LB负载均衡+keepalived

lb 装两个服务,nginx,keepalived

vip也将会成为api server地址,被绑定

node指向apiserver——vip

node指向apiserver的IP若为物理地址,则需要指定多个,且后期若是增改master节点,还会增加工作量

1.1 环境优化

LB1

[root@localhost ~]# hostnamectl set-hostname lb1
[root@localhost ~]# su
[root@lb1 ~]# systemctl stop NetworkManager
[root@lb1 ~]# systemctl disable NetworkManager
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
Removed symlink /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service.
[root@lb1 ~]# setenforce 0
[root@lb1 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@lb1 ~]# iptables -F

LB2

[root@localhost ~]# hostnamectl set-hostname lb2
[root@localhost ~]# su
[root@lb2 ~]# systemctl stop NetworkManager
[root@lb2 ~]# systemctl disable NetworkManager
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
Removed symlink /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service.
[root@lb2 ~]# setenforce 0
[root@lb2 ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@lb2 ~]# iptables -F

1.2 yum 安装nginx(两个lb都做)

[root@lb1 ~]# echo -e '[nginx]\nname=nginx.repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0' > /etc/yum.repos.d/nginx.repo
[root@lb1 ~]# yum makecache
[root@lb1 ~]# yum install nginx -y

1.3 添加四层转发 upstream(两个lb都做)

另外一一个节点也是如此操作

nginx用来做四层负载

再events和http之间加入stream配置

[root@lb1 ~]# vim /etc/nginx/nginx.conf
events {worker_connections  1024;
}
stream {log_format  main    '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';access_log /var/log/nginx/k8s-access.log main;upstream k8s-apiserver {server 192.168.247.149:6443;server 192.168.247.148:6443;#两个master地址,apiserver端口号6443}server {listen 6443;proxy_pass k8s-apiserver;}
}http {
[root@lb1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

1.4 开启nginx(两个lb都做)

[root@lb1 ~]# systemctl start nginx
[root@lb1 ~]# systemctl status nginx
● nginx.service - nginx - high performance web serverLoaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)Active: active (running) since Sat 2020-05-02 18:02:40 CST; 5s agoDocs: http://nginx.org/en/docs/Process: 29485 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)Main PID: 29488 (nginx)Tasks: 2CGroup: /system.slice/nginx.service├─29488 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf└─29489 nginx: worker processMay 02 18:02:40 lb1 systemd[1]: Starting nginx - high performance web server...
May 02 18:02:40 lb1 systemd[1]: Started nginx - high performance web server.
[root@lb1 ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

1.5 本地验证一下(两个lb都做)

二:接下来部署keepalived服务

2.1 安装keepalived

[root@lb1 ~]# yum install keepalived -y

2.2 编辑keepalived配置文件

[root@lb1 ~]# mkdir /abc
[root@lb1 ~]# mount.cifs //192.168.0.88/linuxs /abc
Password for root@//192.168.0.88/linuxs:
[root@lb1 ~]# cp /abc/k8s/keepalived.conf /etc/keepalived/keepalived.conf
cp: overwrite ‘/etc/keepalived/keepalived.conf’? y
[root@lb1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {# 接收邮件地址notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}# 邮件发送地址notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id NGINX_MASTER
}vrrp_script check_nginx {script "/etc/check_nginx.sh"        #这个配置文件后面会编辑
}   vrrp_instance VI_1 {state MASTERinterface ens32     #指定物理网口virtual_router_id 51 # VRRP 路由 ID实例,每个实例是唯一的priority 100    # 优先级,备服务器设置 90advert_int 1    # 指定VRRP 心跳包通告间隔时间,默认1秒authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.247.100/24    #指定虚拟IP}track_script {          #监控脚本check_nginx}
}

第二个lb的虚拟路由IP不要一致,state为BACKUP,其他一样

vrrp_instance VI_1 {state BACKUPinterface ens32virtual_router_id 52priority 90

2.3 编辑检查nginx脚本

这个脚本会将keepalived和nginx结合在一起

[root@lb1 ~]# vim /etc/nginx/check_nginx.shcount=$(ps -ef |grep nginx |egrep -cv "grep|$$")
#这个变量是建厂nginx是否开启,如果没有开启,那么就关闭keepalived
if [ "$count" -eq 0 ];then/etc/init.d/keepalived stop
fi
[root@lb1 ~]# chmod +x /etc/nginx/check_nginx.sh

2.4 开启keepalived,是否设置自启动自己考虑

先启动lb1节点master,然后在启动lb2节点backup

[root@lb1 ~]# systemctl start keepalived.service

2.5 使用ip a可以查看到虚拟IP

此时虚拟IP在lb1上

[root@lb1 ~]# ip a
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:ef:81:b6 brd ff:ff:ff:ff:ff:ffinet 192.168.247.145/24 brd 192.168.247.255 scope global noprefixroute dynamic ens32valid_lft 5355394sec preferred_lft 5355394secinet 192.168.247.100/24 scope global secondary ens32

三:将k8s中的node节点关于apiserver地址指向为vip

3.1 这样node去找master就会去找vip

[root@node01 ~]# cd /k8s/cfg/
[root@node01 cfg]# ls
bootstrap.kubeconfig  kubelet.config      kube-proxy
kubelet               kubelet.kubeconfig  kube-proxy.kubeconfig
[root@node01 cfg]# vim bootstrap.kubeconfig server: https://192.168.247.100:6443
[root@node01 cfg]# vim kubelet.kubeconfig server: https://192.168.247.100:6443
[root@node01 cfg]# vim kube-proxy.kubeconfig server: https://192.168.247.100:6443

3.2 重启服务kubelet、proxy

[root@node01 cfg]# systemctl restart kubelet.service
[root@node01 cfg]# systemctl restart kube-proxy.service

3.3 替换完成直接自检

[root@node01 cfg]# grep 100 *
bootstrap.kubeconfig:    server: https://192.168.247.100:6443
kubelet.kubeconfig:    server: https://192.168.247.100:6443
kube-proxy.kubeconfig:    server: https://192.168.247.100:6443

四:验证apiserver漂移地址

备注:先在lb1节点关掉nginx,再在lb2查看虚拟IP是否生效

若是检测到nginx发现关闭,keepalived会自动关闭

[root@lb1 ~]# pkill nginx
[root@lb1 ~]# ps -ef |grep nginx |egrep -cv "grep|$$"
0
[root@lb1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:ef:81:b6 brd ff:ff:ff:ff:ff:ffinet 192.168.247.145/24 brd 192.168.247.255 scope global noprefixroute dynamic ens32valid_lft 5354179sec preferred_lft 5354179secinet6 fe80::d8f:d3dc:3ef7:446/64 scope link noprefixroute valid_lft forever preferred_lft forever

这时vip已经不在lb1上

查看lb2,发现出现

[root@lb2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:df:af:4e brd ff:ff:ff:ff:ff:ffinet 192.168.247.146/24 brd 192.168.247.255 scope global noprefixroute dynamic ens32valid_lft 5354144sec preferred_lft 5354144secinet 192.168.247.100/24 scope global secondary ens32

五:重新开启lb1nginx

要先开启nginx,然后再开启keepalived

此时发现vip又回到了lb1

[root@lb1 ~]# systemctl restart nginx
[root@lb1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:ef:81:b6 brd ff:ff:ff:ff:ff:ffinet 192.168.247.145/24 brd 192.168.247.255 scope global noprefixroute dynamic ens32valid_lft 5354038sec preferred_lft 5354038secinet 192.168.247.100/24 scope global secondary ens32

nginx站点/usr/share/nginx/html

六:查看lb1上的关于nginx的k8s日志

里面有192.168.247.144node02和143node01去访问192.168.247.148master2,原因是重启了服务

[root@lb1 ~]# tail -f /var/log/nginx/k8s-access.log
192.168.247.143 192.168.247.148:6443 - [02/May/2020:19:03:52 +0800] 200 3842
192.168.247.144 192.168.247.148:6443 - [02/May/2020:19:06:29 +0800] 200 1122
192.168.247.144 192.168.247.148:6443 - [02/May/2020:19:06:29 +0800] 200 1122
[root@lb2 ~]# tail -f /var/log/nginx/k8s-access.log
192.168.247.143 192.168.247.148:6443 - [02/May/2020:19:05:02 +0800] 200 1566

七:创建pod测试

7.1 此时node节点docker状态

node01

[root@node01 cfg]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
39f034a2f24e        centos:7            "/bin/bash"         3 days ago          Up 3 days                               beautiful_jennings
[root@node01 cfg]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   5e35e350aded        5 months ago        203MB

node02

[root@node02 cfg]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   5e35e350aded        5 months ago        203MB
[root@node02 cfg]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fea29d0ff39b        centos:7            "/bin/bash"         3 days ago          Up 3 days                               kind_burnell

在部署flannel组件时为了测试不同节点间的容器可以互联互通时创建

7.2 使用kubectl创建pod

run 在集群中运行一个指定的镜像

[root@master1 cfg]# kubectl run nginx --image=nginx
kubectl run --generator=deployment/apps.v1beta1 is DEPRECATED and will be removed in a future version. Use kubectl create instead.
deployment.apps/nginx created
[root@master1 cfg]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
nginx-dbddb74b8-sx4m6   1/1     Running   0          49s

pod有在run运行状态前,还有一个containercreating创建状态

kubectl controls the Kubernetes cluster manager. Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/Basic Commands (Beginner):create         从文件或stdin创建资源。expose         使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes Servicerun            在集群中运行一个指定的镜像set            为 objects 设置一个指定的特征Basic Commands (Intermediate):explain        查看资源的文档get            显示一个或更多 resourcesedit           在服务器上编辑一个资源delete         按文件名、stdin、资源和名称删除资源,或按资源和标签选择器删除资源Deploy Commands:rollout        管理资源的推出scale          为 Deployment, ReplicaSet, Replication Controller 或者 Job 设置一个新的副本数量autoscale      自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量Cluster Management Commands:certificate    修改 certificate 资源.cluster-info   显示集群信息top            Display Resource (CPU/Memory/Storage) usage.cordon         标记 node 为 unschedulableuncordon       标记 node 为 schedulabledrain          Drain node in preparation for maintenancetaint          更新一个或者多个 node 上的 taintsTroubleshooting and Debugging Commands:describe       显示一个指定 resource 或者 group 的 resources 详情logs           输出容器在 pod 中的日志attach         Attach 到一个运行中的 containerexec           在一个 container 中执行一个命令port-forward   Forward one or more local ports to a podproxy          运行一个 proxy 到 Kubernetes API servercp             复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.auth           Inspect authorizationAdvanced Commands:apply          通过文件名或标准输入流(stdin)对资源进行配置patch          使用 strategic merge patch 更新一个资源的 field(s)replace        通过 filename 或者 stdin替换一个资源wait           Experimental: Wait for a specific condition on one or many resources.convert        在不同的 API versions 转换配置文件Settings Commands:label          更新在这个资源上的 labelsannotate       更新一个资源的注解completion     Output shell completion code for the specified shell (bash or zsh)Other Commands:alpha          Commands for features in alphaapi-resources  Print the supported API resources on the serverapi-versions   Print the supported API versions on the server, in the form of "group/version"config         修改 kubeconfig 文件plugin         Provides utilities for interacting with plugins.version        输出 client 和 server 的版本信息Usage:kubectl [flags] [options]Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

7.3 查看pod日志,发现有报错

[root@master1 cfg]# kubectl logs nginx-dbddb74b8-sx4m6
Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log nginx-dbddb74b8-sx4m6)

创建一个集群角色用户,系统中的匿名用户,并给其一个admin权限,只需要授权一次就可以

[root@master1 cfg]# kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
clusterrolebinding.rbac.authorization.k8s.io/cluster-system-anonymous created

此时便可以查看日志了

7.4 查看pod网络,这也可以查看出此pod被部署到哪个node上

[root@master1 cfg]# kubectl get pods -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE              NOMINATED NODE
nginx-dbddb74b8-sx4m6   1/1     Running   0          16m   172.17.42.3   192.168.247.144   <none>

在node02节点上

此时有三个容器,一个刚刚创建的,一个是容器仓库,还有一个是之前测试flannel

[root@node02 cfg]# docker ps -a
CONTAINER ID        IMAGE                                                                 COMMAND                  CREATED             STATUS              PORTS               NAMES
6eff0af2c578        nginx                                                                 "nginx -g 'daemon of…"   16 minutes ago      Up 16 minutes                           k8s_nginx_nginx-dbddb74b8-sx4m6_default_cd5a2ea4-8c68-11ea-a668-000c29db840b_0
c4ca11690aa1        registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0   "/pause"                 16 minutes ago      Up 16 minutes                           k8s_POD_nginx-dbddb74b8-sx4m6_default_cd5a2ea4-8c68-11ea-a668-000c29db840b_0
fea29d0ff39b        centos:7                                                              "/bin/bash"              3 days ago          Up 3 days                               kind_burnell
[root@node02 cfg]# docker images
REPOSITORY                                                        TAG                 IMAGE ID            CREATED             SIZE
nginx                                                             latest              602e111c06b6        8 days ago          127MB
centos                                                            7                   5e35e350aded        5 months ago        203MB
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64   3.0                 99e59f495ffa        3 years ago         747kB

7.5 在node02节点上可以直接访问容器nginx

[root@node02 cfg]# curl 172.17.42.3
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>

7.6 此时查看容器日志

[root@master1 cfg]# kubectl logs nginx-dbddb74b8-sx4m6
172.17.42.1 - - [02/May/2020:11:52:45 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

实操:搭建前端LB负载均衡+keepalived并指定apiserver的vip相关推荐

  1. Linux平台上搭建apache+tomcat负载均衡集群

    传统的Java Web项目是通过tomcat来运行和发布的.但在实际的企业应用环境中,采用单一的tomcat来维持项目的运行是不现实的.tomcat 处理能力低,效率低,承受并发小(1000左右).当 ...

  2. 搭建集群负载均衡系统

    声明:本文是参考大量网上资料以及tigerlei自己的实际操作而写的笔记,仅供大家参考,绝非原创. 搭建集群负载均衡系统 负载均衡集群是在应用服务器高负载的情况下,由多台节点提供可伸缩的,高负载的服务 ...

  3. 高并发系统搭建:web负载均衡

    高并发系统搭建:web负载均衡 所谓的负载均衡就是让多个请求尽量均衡的分配到不同的机器上面去 1. HTTP负载均衡 当用户的请求发来之后,web服务器通过修改HTTP响应报头中的Location标记 ...

  4. 运维企业专题(3)LB负载均衡介绍

    1.LB是什么?有哪些主要的方式? LB--负载均衡(Load Balancing ) 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数 ...

  5. haproxy keepalived_详解mycat+haproxy+keepalived搭建高可用负载均衡mysql集群

    概述 目前业界对数据库性能优化普遍采用集群方式,而oracle集群软硬件投入昂贵,mysql则比较推荐用mycat去搭建数据库集群,下面介绍一下怎么用mycat+haproxy+keepalived搭 ...

  6. nginx集群_使用Nginx+Tomcat+keepalived 搭建高性能高可用性负载均衡集群

    在互联网项目中,往往面临着高用户量.高并发的问题,造成服务器的压力非常大,特别是电商项目,以淘宝天猫为例,近年双十一的成交量屡创新高,可想而知淘宝天猫的服务器面临的并发量有多大,单一服务器肯定承受不住 ...

  7. 图文教程,Nginx+Keepalived(双机热备)介绍已经搭建高可用负载均衡环境

    上一次分享了Nginx相关的应用场景如下: ​Nginx介绍以及一些应用场景说明 在实际使用,单机版的Nginx就不能满足高可用的要求了,在这种情况下,我们使用Nginx+Keepalived(双机热 ...

  8. 使用LVS和Keepalived搭建高可用负载均衡服务器集群

    目录 1.什么是LVS和Keepalived 2.负载均衡服务器集群示例环境搭建及安装配置 2.1.环境网络拓扑结构 2.2.安装ipvsadm软件 2.3.安装keepalived 2.4.配置网络 ...

  9. nginx实现请求的负载均衡 + keepalived实现nginx的高可用

    前言 使用集群是网站解决高并发.海量数据问题的常用手段.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求.这种 ...

最新文章

  1. SOR迭代求解线性方程组代码实现
  2. 学Android的学习规划
  3. cygwin/gcc与MinGW
  4. idea配置的导入导出
  5. Qt工作笔记-Qt文档阅读笔记-setMouseTracking(无需按下移动使得widget获取鼠标位置)
  6. 比特飞解决方案大汇总,你的贴身家教
  7. java shiro登录实例_使用Shiro实现登录成功后跳转到之前的页面
  8. git版本库--常用命令
  9. php中嵌套html代码和html代码中嵌套php方式
  10. 3-1067. 试密码
  11. ROS的学习(十二)用C++写一个简单的发布者
  12. android简单日记案例,android日记本实现源代码
  13. 2021版手机号验证最新正则表达式
  14. Stuck Stack成过去时,OpenStack升级还可以这样玩?!
  15. 小米9开发版自带root吗_怎么获取root权限-小米CC9和小米CC9美图版刷入MIUI开发版,获取完美ROOT权限功能...
  16. win10无线断开无法连接服务器,简单几步解决win10wifi一直断开连接不上的问题
  17. 学术篇 | 不同需求的认知控制揭示了语义记忆和情景记忆提取共享的神经机制
  18. 多玩网总裁李学凌:在腾讯阴影下
  19. mysql数据同构_异构、同构 异步、同步
  20. 野火buildroot

热门文章

  1. Dell安装windows10elementaryOS5.1双系统
  2. 如果程序员这份工作做到了35岁你们会选择裸辞嘛?万一失业了怎么在短时间内恢复,并快速精准找到高薪工作?
  3. Laya Script
  4. 深度学习_深度学习基础_评价指标ROC、AUC、AP、mAP详解
  5. 函数练习220216
  6. Python实验报告四 python基础试题练习
  7. 无线蓝牙模块增加传输距离的几个小技巧
  8. 1073: 青蛙爬井
  9. 双绞线传输器的传输原理是怎样的?怎么接线?
  10. FastDFS分布式文件系统详解