0
点赞
收藏
分享

微信扫一扫

【云原生】docker+k8微服务容器化实战


 

目录

一、Docker

1.服务docker化

2.私有仓库管理

3.Docker下的服务通讯

二、服务编排

1.Kubernetes

2.Mesos

3.Swarm

三、CICD

1.Gitlab触发构建

2.Jenkins pipeline流水线

3.Kubect操作k8s集群

四、微服务入门

1.微服务入门

2.优势劣势

3.如何通讯

4.如何发现、更新和部署

五、微服务周边

1.SpringBoot

2.SpringCloud

3.Dubbo

六、微服务开发

1.服务划分

2.rpc通讯

3.跨语言调用


一、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

  • 编写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的特性:

  1. 基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
  2. 基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。
  3. 支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。
  4. 镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
  5. 图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
  6. 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
  7. 支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
  8. 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下的服务通讯

 

1. 每台机器上都有一个网卡,有的甚至有两个网卡 , ETHD 10.1.1.10/8就表示一个网卡

2. docker启动以后, 会出现一个docker0,我们可以通过ifconfig来查看

交换机一旦创建以后, 就会创建一个叫namespace的东西,名字叫做network namespace. 全名叫做网络命名空间.也就是上图中蓝色方框VethX,不同的网络命名空间会形成相互隔离,一端固定在容器内容, 成为虚拟网卡, 另一端固定在本机。

 只要多一个容器就会多一个veth。也就是说一端在容器里,另一端在本机里,作为连通的作用。 并且, 网络命名空间会将不同的网络隔离开来,各用个的。这样就实现了隔离,以及怎样与本机进行交互。这样,容器和容器之间就可以通讯了。  这解决的是容器和容器间进行通讯。 这是通过docker0网桥解决的。

二、服务编排

1.Kubernetes

kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

 安装

国内安装k8s途径

安装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来进行通信。

3.Swarm

Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。
Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。
Docker Swarm 包含两方面:一个企业级的 Docker 安全集群,以及一个微服务应用编排引擎。
集群方面,Swarm 将一个或多个 Docker 节点组织起来,使得用户能够以集群方式管理它们。
Swarm 默认内置有加密的分布式集群存储(encrypted distributed cluster store)、加密网络(Encrypted Network)、公用TLS(Mutual TLS)、安全集群接入令牌 Secure Cluster Join Token)以及一套简化数字证书管理的 PKI(Public Key Infrastructure)。我们可以自如地添加或删除节点。
编排方面,Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得易如反掌。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。
此外,甚至还可以执行滚动升级、回滚以及扩缩容操作,同样基于简单的命令即可完成。
以往,Docker Swarm 是一个基于 Docker 引擎之上的独立产品。自 Docker 1.12 版本之后,它已经完全集成在 Docker 引擎中,执行一条命令即可启用。到 2018 年,除了原生 Swarm 应用,它还可以部署和管理 Kubernetes 应用。

三、CICD

1.Gitlab触发构建

Jenkins使用配置

2.Jenkins pipeline流水线

关于流水线(Pipline)

修改之前的流水线配置

建议写好粘贴进去:

node {
    stage("拉取代码"){
        echo 'STEP 1:clone code'
    }
    stage("打包代码"){
        echo 'STEP 2:code package'
    }
    stage("上线发布"){
        echo 'STEP 3:deploy package'
    }
}

 Pipeline 语法说明

  1. 流水线支持两种语法:声明式和脚本式流水线。两种语法都支持构建持续交付流水线。且均可用在web ui或者Jenkinsfile中定义流水线,通常认为创建一个Jenkinsfile并将其检入源代码控制仓库是最佳实践。
  2. 创建jenkinsfile jenkinsfile是一个文本文件,它包含了Jenkins流水线的定义并被检入源代码控制仓库。下面的流水线实现了基本的三阶段持续交付流水线。 jenkinsfile(declarative pipeline)
pipeline{
    agent any
    stages{
        stage("Build"){
            steps{
                echo "building..."
            }
        }
        stage("Test"){
            steps{
                echo "Test..."
            }
        }
        stage("Deploy"){
            steps{
                echo "Deploy..."
            }
        }
    }
}

 

3.Kubect操作k8s集群

kubectl是k8s的客户端程序,也是k8s的命令行工具,kubectl提供了大量的子命令可以让用户和集群进行交互。

kubectl 连接 Kubernetes 集群

  • 从Kubernetes 版本页面下载最新的 kubectl 客户端。
  • 安装和设置 kubectl 客户端。

    有关详细信息,参见 安装和设置 kubectl。

  • 配置集群凭据。

    您可以在集群信息页面查看集群凭据。

    1. 登录容器服务管理控制台。
    2. 在 Kubernetes菜单下,单击集群进入 Kubernetes 集群列表页面。
    3. 选择所需的集群并单击右侧的管理。
    4. 您可以在连接信息处查看集群的连接地址。
    5. 拷贝集群凭据到本地文件中,您可创建并将集群凭据保存到 $HOME/.kube/config(kubectl 预期凭据所在的位置)。或者命名一个新的文件,如 /tmp/kubeconfig,并执行命令
       export KUBECONFIG=/tmp/kubeconfig。
    6. 执行上述操作后,您可执行以下命令,确认集群连接情况。
# kubectl cluster-info
Kubernetes Master is running at https://xxxxxx.serverless-1.kubernetes.cn-shanghai.aliyuncs.com:6443

四、小结

后期将将微服务器相关知识

举报

相关推荐

0 条评论