一、Docker
1.服务docker化
部署user-service
- 编写Dockfile文件
#源镜像
FROM golang:1.13
#设置工作目录
WORKDIR $GOPATH/src
RUN mkdir user-service
COPY user-service $GOPATH/src/user-service
#切换工作目录
WORKDIR $GOPATH/src/user-service
RUN mkdir log
#暴露端口
EXPOSE 9090
#最终运行docker的命令
ENTRYPOINT ["nohup","./user-service",">log/log.log", "&"]
- 编写build.sh脚本
#!/bin/bash
rm -rf user-service
go build .
docker build -t mic-user-service -f Dockerfile .
执行build.sh构建镜像
- 编写start.sh脚本
#!/bin/bash
docker stop mic_user_service
docker rm mic_user_service
docker run -p 9090:9090 --name mic_user_service -v /usr/local/docker/micservice/user-service/log:/go/src/user-service/log -d mic-user-service
启动容器 ./start.sh
user-server服务依赖mysql服务,请访问 docker搭建mysql
部署user-edge-service
- 编写Dockfile文件
#源镜像
FROM golang:1.13
#设置工作目录
WORKDIR $GOPATH/src
RUN mkdir user-edge-service
COPY user-edge-service $GOPATH/src/user-edge-service
COPY config.ini $GOPATH/src/user-edge-service
#切换工作目录
WORKDIR $GOPATH/src/user-edge-service
RUN mkdir log
#暴露端口
EXPOSE 9091
#最终运行docker的命令
ENTRYPOINT ["nohup","./user-edge-service",">/dev/null", "&"]
- 编写build.sh脚本
#!/bin/bash
rm -rf user-edge-service
go build .
docker build -t mic-user-edge-service:latest
执行build.sh构建镜像
- 编写start.sh脚本
#!/bin/bash
docker stop mic_user_edge_service
docker rm mic_user_edge_service
docker run -p 9091:9091 --name mic_user_edge_service -v /usr/local/docker/micservice/user-edge-service/log:/go/src/user-edge-service/log -d mic-user-edge-service
启动容器 ./start.sh
- 访问user-edge-service服务测试
使用docker-compose编排容器
上面的方式需要一个一个单独启动容器服务,我们可以是用docker-compose来管理容器
- 安装docker-compose
yum install docker-conpose
- 编写docker-compose.yml
version: '3'
networks:
default:
external:
name: micservice-network
services:
mysql:
image: mysql:5.7
ports:
- 3306:3306
volumes:
- /usr/local/docker/mysql/conf:/etc/mysql
- /usr/local/docker/mysql/logs:/var/log/mysql
- /usr/local/docker/mysql/data:/var/lib/mysql
environment:
- TZ="Asia/Shanghai"
redis:
image: redis:5.0.4
ports:
- 6379:6379
volumes:
- /usr/local/docker/redis/logs:/usr/local/redis/logs
- /usr/local/docker/redis/redis.conf:/etc/redis_default.conf
- /usr/local/docker/redis/data:/data
environment:
- TZ="Asia/Shanghai"
mongo:
image: mongo:latest
ports:
- 27017:27017
volumes:
- /usr/local/docker/mongo/data:/data/db
- /usr/local/docker/mongo/conf/mongodb.cnf:/etc/mongo.conf
environment:
- TZ="Asia/Shanghai"
user-service:
image: mic-user-service:latest
ports:
- 9090:9090
volumes:
- /usr/local/docker/micservice/user-service/log:/go/src/user-service/log
environment:
- TZ="Asia/Shanghai"
user-edge-service:
image: mic-user-edge-service:latest
ports:
- 9091:9091
links:
- user-service
volumes:
- /usr/local/docker/micservice/user-edge-service/log:/go/src/user-edge-service/log
environment:
- TZ="Asia/Shanghai"
- 相关命令
#启动所有服务
docker-compose up -d
#启动某个
docker-compose up user-service -d
# 停止所有容器服务
docker-compose stop
2.私有仓库管理
什么是 Harbor ?
- Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。
- Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。
- Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。
Harbor的特性:
- 基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
- 基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。
- 支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。
- 镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
- 图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
- 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
- 支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
- Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。
Harbor的构成:
Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件。
1)Proxy: Harbor 的 Registry、 UI、Token 服务等组件,都处在nginx反向代理后边。该代理将来自浏览器、docker clients
的请求转发到后端不同的服务上。
2)Registry:负责储存Docker 镜像,并处理Docker push/pull命令。由于要对用户进行访问控制,即不同用户对Docker 镜像
有不同的读写权限,Registry 会指向一个Token 服务,强制用户的每次Docker pull/push 请求都要携带一个合法的Token,
Registry会通过公钥对Token进行解密验证。
3)Core services:Harbor的核心功能,主要提供以下3个服务:
- UI (harbor-ui) :提供图形化界面,帮助用户管理Registry上的镜像 (image) ,并对用户进行授权。
- WebHook:为了及时获取Registry上image 状态变化的情况,在Registry上配置 Webhook, 把状态变化传递给 UI 模块。
- Token 服务:负责根据用户权限给每个Docker push/pull 命令签发Token。 Docker 客户端向Registry 服务发起的请求,如果不包含Token,会被重定向到 Token 服务,获得 Token 后再重新向Registry 进行请求。
4)Database (harbor -db) :为core services提供数据库服务,负责储存用户权限、审计日志、Docker 镜像分组信息等数据。
5)Job services:主要用于镜像复制,本地镜像可以被同步到远程Harbor实例上。
6)Log collector (harbor-log) :负责收集其他组件的日志到一个地方。
3.Docker下的服务通讯
-
每台机器上都有一个网卡,有的甚至有两个网卡 , ETHD 10.1.1.10/8就表示一个网卡
-
docker启动以后, 会出现一个docker0,我们可以通过ifconfig来查看
交换机一旦创建以后, 就会创建一个叫namespace的东西,名字叫做network namespace. 全名叫做网络命名空间.也就是上图中蓝色方框VethX,不同的网络命名空间会形成相互隔离,一端固定在容器内容, 成为虚拟网卡, 另一端固定在本机。
只要多一个容器就会多一个veth。也就是说一端在容器里,另一端在本机里,作为连通的作用。 并且, 网络命名空间会将不同的网络隔离开来,各用个的。这样就实现了隔离,以及怎样与本机进行交互。这样,容器和容器之间就可以通讯了。 这解决的是容器和容器间进行通讯。 这是通过docker0网桥解决的。
二、服务编排
1.Kubernetes
kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
安装
国内安装k8s途径
- 使用kubeadmin离线安装
- 使用阿里公有云平台k8s
- 通过yum官方仓库
- 二进制包形式安装,kubeasz
安装kubeadmin加载k8s镜像
# 以下命令在三台虚拟机执行 yz10 yz20 yz21
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install
k8s离线部署
10.211.55.10 yz10 Master节点
10.211.55.20 yz20 Node节点
10.211.55.21 yz21 Node节点
# 1. 调整时区
timedatectl set-timezone Asia/Shanghai
# 2. 关闭selinux和防火墙
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
# 3. k8sadmin镜像下载附带对应的docker
# 4. 镜像上传到每个节点
mkdir -p /usr/local/k8s-install
scp -r kubernetes-1.14 root@yz10:/usr/local/k8s-install
# 5. 安装docker,记得配置加速器
tar -xf docker-ce-18.09.tar.gz
cd docker
yum localinstall -y *.rpm
# 6. 确认cgroup为 cgroupfs
docker info|grep cgroup
# 7. 安装kubeadm
tar -xf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
# 8. 关闭交换区
swapoff -a #关闭
vi /etc/fstab
# 注释这行 永久关闭
#/dev/mapper/centos-swap swap swap defaults 0 0
# 9. 配置网桥
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
# 10. 通过镜像安装k8s
docker load -i k8s-114-images.tar.gz
docker load -i flannel-dashboard.tar.gz
2.Mesos
Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核。Mesos最初由加州大学伯克利分校的是AMPLab开发的,后在Twitter得到广泛使用。
Mesos是一个分布式的架构,具有主从关系,master和slave。Zookeeper能做到首领选举(选mesos的master)等功能。要注意的是zookeeper也需要选举master。应用程序跑在frameworks上,它也是分布式的软件,包括scheduler和executor。图中蓝色部分是mesos本身,白色部分是需要自己开发的framework。这些需要自己开发的framework也需要考虑高可用性的问题,这算是mesos的缺点之一。Mesos使用protocol buffer和libprocess来进行通信。
1)zookeeper做为leader election。每个master起来的时候都要向zookeeper的quorum注册znode。
2)master主要用于管理slave node的状态,知道slave在哪儿,有哪些资源,同时知道各个框架的信息。比如Hadoop和MPI框架的基本信息。master还可以发resource offer。如果master down了,zookeeper可以马上从standby master里面选一个。因为几个master里面共享的东西很少,不需要数据的同步。
3)slave负责运行任务,同时不断的向master发消息,报告可用资源和在运行的任务的状态。这两种消息并不相同,报告任务状态的消息保证一定delivery,而其他消息并不保证。
4)framwork是一个分布式的应用,包括scheduler和executor。其中scheduler部分要和master紧密通信,接受master发送的offer,scheduler收到offer后决定是不是要跑某个task。executor真正的去执行任务。Offer的发送由master决定。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
4)framwork是一个分布式的应用,包括scheduler和executor。其中scheduler部分要和master紧密通信,接受master发送的offer,scheduler收到offer后决定是不是要跑某个task。executor真正的去执行任务。Offer的发送由master决定。
[外链图片转存中…(img-5QNmSJmT-1714172716503)]
[外链图片转存中…(img-rEioPfgv-1714172716503)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!