关注IT
关注系统玩家

CentOS手动配置Storage Driver 为 direct-lvm

系统玩家阅读(93)评论(0)

Device Mapper是基于内核的框架,支持Linux上的许多高级卷管理技术。Docker的devicemapper存储驱动程序利用此框架的精简配置和快照功能进行映像和容器管理。本文将Device Mapper存储驱动程序称为devicemapper,并将内核框架称为Device Mapper。

对于支持它的系统,Linux内核中包含支持。但是,Docker需要使用特定的配置。例如,在RHEL或CentOS操作系统中,Docker将默认为overlayoverlay官方不建议在生产中使用。

该devicemapper驱动程序使用专用于Docker的块设备,并在块级而非文件级进行操作。这些设备可以通过将物理存储添加到Docker主机来扩展,并且比在操作系统级别使用文件系统性能更好。

配置用于生产的direct-lvm驱动模式

CentOS安装好Docker后,默认Storage Driver为devicemapper的loop-lvm模式,这种模式从性能和稳定性上都不可靠,此模式仅适用于测试环境。

配置direct-lvm模式

生产环境使用devicemapper存储驱动程序的主机必须使用direct-lvm模式。此模式使用块设备来创建精简池。这比使用loop-lvm设备更快,更有效地使用系统资源,并且块设备可以根据需要扩增。

在Docker 17.06及更高版本中,Docker可以为您管理块设备,简化direct-lvm模式的配置。这仅适用于新的Docker设置,并且只能使用一个块设备。

如果您需要使用多个块设备,需要手动配置direct-lvm模式。

选项 描述 需要? 默认 示例
dm.directlvm_device The path to the block device to configure for direct-lvm. Yes dm.directlvm_device="/dev/xvdf"
dm.thinp_percent The percentage of space to use for storage from the passed in block device. No 95 dm.thinp_percent=95
dm.thinp_metapercent The percentage of space to for metadata storage from the passed=in block device. No 1 dm.thinp_metapercent=1
dm.thinp_autoextend_threshold The threshold for when lvm should automatically extend the thin pool as a percentage of the total storage space. No 80 dm.thinp_autoextend_threshold=80
dm.thinp_autoextend_percent The percentage to increase the thin pool by when an autoextend is triggered. No 20 dm.thinp_autoextend_percent=20
dm.directlvm_device_force Whether to format the block device even if a filesystem already exists on it. If set to false and a filesystem is present, an error is logged and the filesystem is left intact. No false dm.directlvm_device_force=true

编辑daemon.json文件并设置适当的选项,然后重新启动Docker以使更改生效。以下daemon.json设置了上表中的所有选项。

{
  "storage-driver": "devicemapper",
  "storage-opts": [
    "dm.directlvm_device=/dev/xdf",
    "dm.thinp_percent=95",
    "dm.thinp_metapercent=1",
    "dm.thinp_autoextend_threshold=80",
    "dm.thinp_autoextend_percent=20",
    "dm.directlvm_device_force=false"
  ]
}

手动配置DIRECT-LVM模式

假定有一 100G 空闲块设备 /dev/sdb 。设备标识符和音量大小在您的环境中可能不同,您应该在整个过程中替换您自己的值。

停止docker

sudo systemctl stop docker

安装依赖

RHEL / CentOS的:device-mapper-persistent-data,lvm2,和所有的依赖

把整块硬盘创建物理卷(PV)

sudo pvcreate /dev/sdb

创建dockervg卷组(VG)

sudo vgcreate dockervg /dev/sdb

划分三个逻辑卷(LV),分别用于:docker_data,docker_metadata

sudo lvcreate --wipesignatures y -n data dockervg -L 35G
sudo lvcreate --wipesignatures y -n metadata dockervg -L 1G

转换为thin pool

sudo lvconvert -y --zero n -c 512K --thinpool dockervg/data --poolmetadata dockervg/metadata

配置自动扩展

cat>>/etc/lvm/profile/dockervg-data.profile<<EOF
activation {
    thin_pool_autoextend_threshold=80
    thin_pool_autoextend_percent=20
}
EOF

划分一个逻辑卷(LV),用于docker_dir

sudo lvcreate --wipesignatures y -n dockerdir dockervg -l+100%FREE

应用以上配置

lvchange --metadataprofile dockervg-data dockervg/data

启用磁盘空间监控

lvs -o+seg_monitor

映射相应目录

mkfs -t xfs /dev/dockervg/dockerdir
mkdir -p /var/lib/docker 
mount /dev/dockervg/dockerdir /var/lib/docker
cat>> /etc/fstab <<EOF
/dev/dockervg/dockerdir /var/lib/docker xfs defaults 0 0
EOF

设置Docker启动参数

echo 'DOCKER_OPTS="--config-file=/etc/docker/daemon.json"' > /etc/default/docker
mkdir /etc/docker
cat>>/etc/docker/daemon.json<<EOF
{
  "storage-driver": "devicemapper",
   "storage-opts": [
     "dm.thinpooldev=/dev/mapper/dockervg-data",
     "dm.use_deferred_removal=true",
     "dm.use_deferred_deletion=true"
   ]
}
EOF

存储池扩容

场景一:假定现在有一块100G的块设备 /dev/sdc

通过pvdisplay查看卷组与物理卷/块设备的对应关系

sudo pvdisplay |grep docker
PV Name               /dev/sdb
VG Name               docker

通过vgextend命令进行卷组扩容

sudo vgextend docker /dev/sdc
info: Physical volume "/dev/sdc" successfully created.
info: Volume group "docker" successfully extended

给逻辑卷(LV)扩容

sudo lvextend -l+100%FREE  -n docker/thinpool
resize2fs /dev/docker/docker
-l+100%FREE: 表示使用全部空闲空间,改为-L 10G指定扩展大小;
-n docker/thinpool: 指定逻辑卷名(卷组/逻辑卷名)

激活逻辑卷(LV)

# LV扩容重启后,可能会出现“Non existing device" 的提示,需要对LV卷进行激活操作:
sudo lvchange -ay docker/thinpool

rancher machine-driver

系统玩家阅读(81)评论(0)

machine-driver 有两种类型,一种是内置在rancher-server镜像里的;另一种是外置的,rancher server运行起来后联网下载的。

内置/外置驱动

在主机驱动界面可以看到有内置说明的驱动,没有内置说明的均为外置驱动。

激活驱动

如果驱动处于inactive,可以点击右上角激活按钮激活驱动

修改内置驱动地址

默认情况下,内置驱动默认路径为local://,可以通过API查看

点击右上角编辑 更改默认地址,可以设置为一个http地址

修改外置驱动地址

外置驱动为一个URL连接,可以直接更改

添加自定义驱动

如果有自定义驱动,可以通过添加主机驱动添加进rancher server,可以只填下载URL。

驱动列表

外置驱动 aliyunecs: https://github.com/orangedeng/rancher-machine-driver/raw/master/Aliyun/docker-machine-driver-aliyunecs.tgz

cloudca: https://objects-east.cloud.ca/v1/5ef827605f884961b94881e928e7a250/docker-machine-driver-cloudca/v1.0.2/docker-machine-driver-cloudca_v1.0.2_linux-amd64.zip

ecl: https://github.com/mittz/docker-machine-driver-ecl/releases/download/v1.0.0/docker-machine-driver-ecl-v1.0.0-linux-amd64.tar.gz

hetzner: https://github.com/JonasProgrammer/docker-machine-driver-hetzner/releases/download/0.2.7/docker-machine-driver-hetzner_0.2.7_linux_amd64.tar.gz

interoutevdc: https://github.com/Interoute/docker-machine-driver-interoutevdc/releases/download/v1.1/docker-machine-driver-interoutevdc_linux-amd64.tar.gz

oneandone: https://github.com/1and1/docker-machine-driver-oneandone/releases/download/v1.1.1/docker-machine-driver-oneandone-linux-amd64-v1.1.1.tar.gz

opennebula: https://github.com/OpenNebula/docker-machine-opennebula/releases/download/release-0.2.0/docker-machine-driver-opennebula.tgz

p2pub: https://github.com/iij/docker-machine-driver-p2pub/releases/download/1.0/docker-machine-driver-p2pub-linux-amd64.zip

packet: https://github.com/packethost/docker-machine-driver-packet/releases/download/v0.1.2/docker-machine-driver-packet_linux-amd64.zip

profitbricks: https://github.com/profitbricks/docker-machine-driver-profitbricks/releases/download/v1.3.3/docker-machine-driver-profitbricks-v1.3.3-linux-amd64.tar.gz

qingcloud: http://machine-driver.oss-cn-shanghai.aliyuncs.com/qingcloud/driver/v1.0.1/docker-machine-driver-qingcloud-linux-amd64.tar.gz

ubiquity: https://github.com/ubiquityhosting/docker-machine-driver-ubiquity/releases/download/v0.0.2/docker-machine-driver-ubiquity_linux-amd64

vultr: https://github.com/janeczku/docker-machine-vultr/releases/download/v1.2.0/docker-machine-driver-vultr-v1.2.0-linux-amd64.tar.gz

内置驱动由rancher维护,集成在一个驱动包中: amazonec2 azure digitalocean exoscale generic google openstack rackspace softlayer vmwarevcloudair vmwarevsphere

https://github.com/rancher/machine-package/releases/download/v0.13.0/docker-machine.tar.gz

搭建web服务

用nginx或者httpd搭建一个web服务器,把驱动压缩包放在web根目录下就可以了。

MAC 下为应用添加TAB补全功能

系统玩家阅读(374)评论(0)

这些并非原创,只是用到了做个总结,记录一下。

安装bash-completion

在为其他软件配置之前,我们先配置bash-completion,安装bash-completion需要用到brew,如果没有安装可以执行以下命令安装:
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” (这里是英文引号)
参考链接:https://brew.sh/index_zh-cn.html

安装bash-completion:

brew install bash-completion
执行:brew info  bash-completion  得到以下内容:
hongxiaoludeMacBook-Pro:~ hongxiaolu$ brew info  bash-completion
bash-completion: stable 1.3 (bottled)
Programmable completion for Bash 3.2
https://bash-completion.alioth.debian.org/
Conflicts with:
bash-completion@2 (because Differing version of same formula)
/usr/local/Cellar/bash-completion/1.3_3 (189 files, 608.2KB) *
Poured from bottle on 2017-10-24 at 22:37:05
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/bash-completion.rb
==> Caveats
Add the following line to your ~/.bash_profile:
[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
Bash completion has been installed to:
/usr/local/etc/bash_completion.d
我们把 [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion 放进 ~/.bash_profile

为MAC 添加 ll 命令

编辑~/.bash_profile 文件,放入:alias ‘ll=ls -lAF’

为git 增加TAB 补全

curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o /usr/local/etc/bash_completion.d/git-completion.bash-completion

为Docker 增加TAB补全

因为MAC上安装了DOCKER,所以其实已经有completion文件:
cd /usr/local/etc/bash_completion.d
ln -s /Applications/Docker.app/Contents/Resources/etc/docker.bash-completion
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-machine.bash-completion
ln -s /Applications/Docker.app/Contents/Resources/etc/docker-compose.bash-completion

问题检查

如果配置过程中出现bash: 404:: command not found 错误,可以通过命令:
bash -lxe
显示结果中,搜索bash: 404:: command not found  很容易定位到出问题的命令。

Ubuntu 16.04 禁用启用虚拟内存swap

系统玩家阅读(700)评论(0)

一、不重启电脑,禁用启用swap,立刻生效
# 禁用命令
sudo swapoff -a
# 启用命令
sudo swapon -a
# 查看交换分区的状态
sudo free -m
二、重新启动电脑,永久禁用Swap
用vi修改/etc/fstab文件,在swap分区这行前加 # 禁用掉,保存退出
reboot
sudo free -m

Rancher部署Traefɪk实现微服务的快速发现

系统玩家阅读(585)评论(0)

⊆Traefik 是什么?

Traefɪk 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Rancher,Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动、动态的刷新配置文件,以实现快速的服务发现。

特性

  • 它非常快
  • 无需安装其他依赖,通过Go语言编写的单一可执行文件
  • 支持 Rest API
  • 多种后台支持:Rancher,Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, 并且还会更多
  • 后台监控, 可以监听后台变化进而自动化应用新的配置文件设置
  • 配置文件热更新。无需重启进程
  • 正常结束http连接
  • 后端断路器
  • 轮询,rebalancer 负载均衡
  • Rest Metrics
  • 支持最小化 官方 docker 镜像
  • 后台支持SSL
  • 前台支持SSL(包括SNI)
  • 清爽的AngularJS前端页面
  • 支持Websocket
  • 支持HTTP/2
  • 网络错误重试
  • 支持Let’s Encrypt (自动更新HTTPS证书)
  • 高可用集群模式

清爽的界面

Traefik 拥有一个基于AngularJS编写的简单网站界面。

以上内容转自:https://traefik.cn

Rancher-Traefik部署

为了保证Traefik 资源不受其他服务的影响,我们可以通过指定专机专用的方式,让Traefik服务独自运行在某一台节点上。

PS:专机专用功能,目前只适用于 Rancher 自动调度容器。

一、运行 Rancher Server 并添加 Rancher-Agent 专机专用节点

  1. 通过http://rancher-server:8080 地址登录 WEB;
  2. 功能定位到 基础设施|主机,并点击添加主机,复制生成的命令来添加一台 Rancher-Agent;
  3. 主机成功添加后,页面定位到 基础设施|主机 ,找到需要的主机,在主机视图的右上角,点击三个点的省略号,再点击编辑;
  4. 在主机编辑视图中,分别在标签与容器标签需求中添加  traefik_lb=true  ;                                                 PS:第一个标签:Traefik 服务在启动时会检查主机是否有traefik_lb=true 标签,只有带有这个标签的主机才能安装Traefik服务。第二个容器标签需求:这个就是专机专用的功能,通过设置traefik_lb=true这个标签,只有带有traefik_lb=true标签的服务才能运行到这个节点上。

二、进入商店(Catalog) 搜索并安装Traefik应用

  1. 标签设置好之后,进入商店搜索Traefik并安装;
  2. 点击查看详情进入配置界面,这里我们把 http port 端口改为80 ,其他配置保持默认。最后点击启动;
  3. 进入 应用|用户 视图,可以看到Traefik应用已正常运行;
  4. 进入 基础架构| 主机  视图下,可以看到Traefik运行在指定主机上;

三、运行 demo应用

  1. 新建一个名为 demo 的空应用栈;
  2. 在 demo 中添加一个名为 nginx 的服务,把数量设置为4,
  3. 在标签设置中,添加如下几条标签:
  4. traefik.enable = true  可以理解为是否把此服务注册到traefik的一个开关; traefik.domain = test.local  一个适用于所有服务访问的主域名,可以设置多个用逗号隔开;traefik.alias = nginx  服务别名,可以理解为主域名下的二级域名,可以设置多个用逗号隔开;traefik.port = 80  告诉traefik 服务暴露的端口号;
  5. PS:新增一个标签 :traefik_lb=true
  6. Traefik默认强制开启健康检查,所有只有健康的服务才会被注册到Traefik上.在健康检查中配置健康检查
  7. 服务正常运行

四、demo-nginx 服务配置

  1. Traefik有服务管理控制台,默认端口8000.
  2.  在控制台中可以看到访问地址:nginx.demo.test.local,nginx.test.local,以前当前后端 健康server 数目
  3. 测试访问 :nginx.demo.test.local,   nginx.test.local

 

 

 

 

 

 

 

 

 

Rancher 部署 K8S 所需镜像列表

系统玩家阅读(702)评论(0)

Rancher1.6.5 部署 K8S1.6.6:

rancher/server:v1.6.5
registry.cn-shenzhen.aliyuncs.com/rancher_cn/k8s:v1.6.6-rancher1-4
rancher/etcd:v2.3.7-13
rancher/network-manager:v0.7.7
rancher/net:v0.11.5
rancher/lb-service-rancher:v0.7.8
busybox:latest
rancher/kubernetes-agent:v0.6.3
rancher/scheduler:v0.8.2
rancher/agent:v1.2.5
rancher/network-manager:v0.7.4
rancher/metadata:v0.9.2
rancher/kubectld:v0.6.8
rancher/kubernetes-auth:v0.0.4
rancher/net:v0.11.3
rancher/dns:v0.15.1
rancher/kubernetes-agent:v0.6.2
rancher/lb-service-rancher:v0.7.4
registry.cn-shenzhen.aliyuncs.com/rancher_cn/kubernetes-dashboard-amd64:v1.6.1
registry.cn-shenzhen.aliyuncs.com/rancher_cn/k8s-dns-sidecar-amd64:1.14.2
registry.cn-shenzhen.aliyuncs.com/rancher_cn/k8s-dns-kube-dns-amd64:1.14.2
registry.cn-shenzhen.aliyuncs.com/rancher_cn/k8s-dns-dnsmasq-nanny-amd64:1.14.2
rancher/healthcheck:v0.3.1
registry.cn-shenzhen.aliyuncs.com/rancher_cn/tiller:v2.3.0
rancher/net:holder
registry.cn-shenzhen.aliyuncs.com/rancher_cn/heapster-grafana-amd64:v4.0.2
registry.cn-shenzhen.aliyuncs.com/rancher_cn/heapster-influxdb-amd64:v1.1.1
registry.cn-shenzhen.aliyuncs.com/rancher_cn/heapster-amd64:v1.3.0-beta.1
rancher/etcd:v2.3.7-11
rancher/etc-host-updater:v0.0.2
registry.cn-shenzhen.aliyuncs.com/rancher_cn/pause-amd64:3.0

Rancher1.6.7 部署 K8S1.7.2:

rancher/server:v1.6.7

registry.cn-shenzhen.aliyuncs.com/rancher_cn/k8s:v1.7.2-rancher7
rancher/etcd:v2.3.7-13
rancher/metadata:v0.9.3
rancher/network-manager:v0.7.7
rancher/net:v0.11.5
rancher/kubectld:v0.8.2
rancher/kubernetes-auth:v0.0.7
rancher/etc-host-updater:v0.0.3
rancher/lb-service-rancher:v0.7.8
busybox:latest
rancher/kubernetes-agent:v0.6.3
rancher/scheduler:v0.8.2
rancher/agent:v1.2.5
rancher/dns:v0.15.1
registry.cn-shenzhen.aliyuncs.com/rancher_cn/kubernetes-dashboard-amd64:v1.6.1
registry.cn-shenzhen.aliyuncs.com/rancher_cn/k8s-dns-sidecar-amd64:1.14.2
registry.cn-shenzhen.aliyuncs.com/rancher_cn/k8s-dns-kube-dns-amd64:1.14.2
registry.cn-shenzhen.aliyuncs.com/rancher_cn/k8s-dns-dnsmasq-nanny-amd64:1.14.2
rancher/healthcheck:v0.3.1
registry.cn-shenzhen.aliyuncs.com/rancher_cn/tiller:v2.3.0
rancher/net:holder
registry.cn-shenzhen.aliyuncs.com/rancher_cn/heapster-grafana-amd64:v4.0.2
registry.cn-shenzhen.aliyuncs.com/rancher_cn/heapster-influxdb-amd64:v1.1.1
registry.cn-shenzhen.aliyuncs.com/rancher_cn/heapster-amd64:v1.3.0-beta.1
registry.cn-shenzhen.aliyuncs.com/rancher_cn/pause-amd64:3.0

 

Rancher 下通过vxlan 网络进行 K8S 1.6.5-1.6.10的部署

系统玩家阅读(1293)评论(0)

环境配置:
Rancher:v1.6.5
Docker:1.12.3
OS:ubuntu 16.04.03

PS:

1、K8S 1.6.6不支持docker1.12.6和1.13.1;

2、配置好各节点间的 hosts 文件(很重要);

3、如果是克隆的主机,请检查有没有 /var/lib/rancher/state/ 这个文件夹,如果有则删除;

4、如果以前有通过 Rancher安装过K8S,请执行命令:docker volume rm etcd && rm -rf /var/etcd/

步骤:

一、系统设置中更改catalog 地址为自定义地址,如图1:

二、地址添加完后,进入环境管理,添加环境模板

三、模板添加完后,添加环境

第13步部跳过

   四、切换到新环境,并添加主机

复制生成的代码在 主机上运行

五、最后状态

Docker Error: Unable to remove filesystem

系统玩家阅读(365)评论(0)

Some container-based utilities, such as Google cAdvisor, mount Docker system directories, such as /var/lib/docker/, into a container. For instance, the documentation for cadvisor instructs you to run the cadvisor container as follows:

$ sudo docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  google/cadvisor:latest

When you bind-mount /var/lib/docker/, this effectively mounts all resources of all other running containers as filesystems within the container which mounts /var/lib/docker/. When you attempt to remove any of these containers, the removal attempt may fail with an error like the following:

Error: Unable to remove filesystem for
74bef250361c7817bee19349c93139621b272bc8f654ae112dd4eb9652af9515:
remove /var/lib/docker/containers/74bef250361c7817bee19349c93139621b272bc8f654ae112dd4eb9652af9515/shm:
Device or resource busy

The problem occurs if the container which bind-mounts /var/lib/docker/ uses statfsor fstatfs on filesystem handles within /var/lib/docker/ and does not close them.

Typically, we would advise against bind-mounting /var/lib/docker in this way. However, cAdvisor requires this bind-mount for core functionality.

If you are unsure which process is causing the path mentioned in the error to be busy and preventing it from being removed, you can use the lsof command to find its process. For instance, for the error above:

$ sudo lsof /var/lib/docker/containers/74bef250361c7817bee19349c93139621b272bc8f65

Rancher体系下容器日志采集

系统玩家阅读(569)评论(0)


引言

文档参考http://www.cnrancher.com/rancher-logging/

一个完整的容器平台,容器日志收集也是很重要的一环。尤其在微服务架构大行其道状况下,程序的访问监控、健康状态检查很多都依赖日志信息的收集,由于Docker的存在,让容器平台中的日志收集和传统方式很多不一样,日志的输出和收集与以前也大有不同。本文就此探讨一下,Rancher平台内如何做容器日志收集。

现状

纵览当前容器日志收集的各种解决方案,无非就是两种方式:一、直接采集Docker标准输出,通过Docker的日志驱动(log driver)可以发送到相应的收集程序中;二、非标准输出,延续传统的日志写入方式,容器内的服务将日志直接写到Log文件中,通过Docker volume映射形式,将日志文件映射到Host上,日志采集程序直接收集映射出来的Log文件。三、通Journald 收集二进制日志数据。

PS:

标准输出:即通过docker logs查看到的日志信息。Ubuntu OS下,这些信息默认保存在/var/lib/docker/containers路径下以容器ID为名的文件夹下并以容器ID为前缀的 -json.log 文件中。

非标准输出:根据Docker容器的特性,容器启动后必须有一个服务保持前台运行。如果一个容器要运行多个服务,那么按照启动顺序,前面的服务就必须得后台运行。 所以,默认情况下这些后台运行的服务产生的日志将无法以标准输出获取,产生的日志默认会存放于/var/log 目录下。

第一种方式足够简单,直接配置相关的日志驱动(Log driver)就可以,但是这种方式也有些劣势:

  1. 当主机的容器密度比较高的时候,对Docker Engine的压力比较大,毕竟容器标准输出都要通过Docker Engine来处理。
  2. 尽管原则上,我们希望遵循一容器部署一个服务的原则,但是有时候特殊情况不可避免容器内有多个业务服务,这时候很难做到所有服务都标准输出日志,这就需要用到传统的方式收集log日志。
  3. 虽然我们可以选择很多种Log Driver,但是有些Log Driver会破坏Docker原生的体验,比如,日志输出到其他日志服务器后,docker logs将无法看到容器日志。

基于以上考虑,一个完整的日志收集方案必须要同时满足标准输出收集和日志卷(非标准输出)收集或者通过journald 收集二进制日志数据
。当然完整的日志体系中,并不仅仅是采集,还需要有日志存储和UI展现。日志存储有很多种开源的实现,这个一般用户都会有自己钟情的选择。而UI展现更是各家有各家的需求,很难形成比较好的标准,一般都是通过定制化方式解决。所以此文主要展现的方案是日志采集方案,当然在存储和UI展现上会对接开源实现,没有特殊需求的情况下,也可以拥有一个完整的体验。

Rancher下的解决方案(json-file驱动)

方案介绍

如上面图中所示,日志存储和UI展现可以直接使用ElasticSearch & Kibana。日志采集方面如之前所分析,需要对接两种采集模式(标准输出日志和非标准输出),本方案中,日志采集这部分采用Fluentd & Logging Helper的组合。Fluentd是很通用的日志采集程序,拥有优异的性能,相对Logstash来说同等压力下,其内存消耗要少很多。

为了要保证Dokcer和Rancher体验的完整性,之所以Docker Log Driver选择Json-file或者Journald,其原因:一、json-file和journald相对来说比较常用;二、这两种驱动下,docker logs依然可以有内容输出,保证了体验的完整性。

实现流程

方案实现流程:Fluentd对接Json-file或者Journald驱动,获取标准输出日志数据或者二进制日志数据; Logging Helper可以理解为Fluentd的助手,它可以识别容器日志卷(非标准输出)映射的路径,并通知Fluentd进行采集。 Fluentd收集数据后,接着数据被传递并存储到ES,最后Kibana将ES中的数据直接展示出来。

下面开始说明,整个方案的部署过程。先用一张图来描述整体的部署结构,如下:


方案部署

ElasticSearch & Kibana部署

通过web登录Rancher,进入应用商店,搜索ElasticSearch,推荐安装2.x版本。


点击查看详情, 进去后修改一下最后的Public port,默认为80端口, 改为其他端口避免端口冲突。

接着再进入应用商店搜索Kibana.

配置选项中,需选择Elasticsearch-clients

最后的Public port 根据实际情况进行修改,避免冲突。

服务正常启动后,可以通过这个端口访问Kibana web 页面。

Rancher logging服务部署

目前Rancher logging不在官方仓库中,所以需要使用Rancher logging 需要添加自定义商店地址。 点击小图管理|系统设置 进入, 点击添加应用商店,

名称:rancher -logging

地址: https://github.com/niusmallnan/rancher-logging-catalog.git

分支:master

最后点击保存,并返回应用商店。在应用商店中输入log进行搜索:

点击查看详情进去,进入配置页面:在本示例中,除了Elasticsearch source 如图配置外,其他保持默认:

以上部署完成之后,部署一些应用并产生一些访问日志,就可以在Kibana的界面中看到:

若要使用日志卷方式,则需要在Service启动的时候配置Volume,Volume name需要匹配之前设定的Volume Pattern:

Rancher通过Aliyun-slb服务对接阿里云SLB

系统玩家阅读(388)评论(0)


概要

阿里云SLB介绍就不再叙述,这里简要说明几个问题:

1、阿里云SLB只是负载均衡器,没有反向代理功能。,无法实现类似nginx 或者haproxy反向代理后端功能;

2、SLB所在区域必须与ECS服务器所在区域相同。

Rancher的安装也不再叙述,具体安装方法请关注Rancher公众账号或者浏览Rancher中国官方博客。以下文章基于一套已经搭建好的Rancher系统。

Aliyun-slb
服务安装

添加Aliyun-slb应用商店

通过Rancher_server-ip:8080登录WEB后,在系统管理|系统设置中添加一个自定义商店。

名称:SLB

地址:https://github.com/niusmallnan/slb-catalog.git

版本:master

保存后,在应用商店|全部 中搜索slb可以看到相应的应用。

Aliyun-slb安装

点击详情后进入配置界面:

名称:保持默认;

描述:可选;

配置选择

SLB Access Key ID:
AccessKey管理器中查看;

SLB Secret Access Key:AccessKey管理器中查看;

SLB Region:SLB所在区域。进入SLB首页后,选中你SLB服务所在的区域,查看浏览器的地址。比如,如果是华南区,查看浏览器地址,那么cn-shenzhen就是它的区域;

Aliyun VPC ID:VPC ID,进入VPC网络首页,找到你ECS绑定的VPC网络并点击进去,页面的中间有一个ID;

ECS Private IP Lookup :这个地方需要选择true,原因后面讲解;

最后点击启动,等待应用启动完成。

Aliyun SLB配置

登录阿里云控制台,进入负载均衡首页。右上角点击创建负载均衡,根据需要创建好负载均衡后,如图:

点击负载均衡名称进入负载均衡配置界面,点击左侧监听,接着点击右上角添加监听。

如下图,因为接下来要启动一个nginx服务来演示,所以这里前端通过http协议监听8888端口,后端(ECS服务器)容器映射到8888端口上;

宽带和调度算法保持默认;

虚拟服务器组:把多个运行相同服务的主机捆绑在一起,这个适用于手动配置SLB,Aliyun SLB动态配置不需要勾选;

高级配置保持默认;

监控检测中端口设置8888,其他默认;

其他的保持默认,返回负载均衡列表。

配置好的负载均衡如下图:

因为Aliyun SLB应用动态注册可用的服务信息到负载均衡实例上,后端服务器这里就不需要设置。

现在,我们回到前面讲到的ECS Private IP Lookup 开关,如果设置没有打开,ECS服务器的IP地址无法传递给负载均衡实例,最后会导致负载均衡实例无法动态获取到后端服务器。

示例服务配置

接下来创建一个nginx应用栈并创建一个nginx服务。创建服务的时候有几个地方要设置:

1、端口映射

服务映射到宿主机的端口必须与负载均衡里面配置的端口相同;

2、服务容器标签

创建容器的时候需要指定一个标签:io.rancher.service.external_lb.endpoint=xxxx, 后面的XXXX为创建的负载均衡实例ID,这个ID在负载均衡首页可以看到。


nginx服务跑起来之后,我们看Aliyun SLB服务的日志:

我起了两个nginx实例分别运行在两台主机上。

现在可以正常访问了。进入负载均衡首页查看,已经获取到后端服务器了。

负载均衡测试

首先修改nginx默认页面的内容并刷新,因为默认为轮询,所以每刷新一次页面就会变化:

原理

Aliyun-slb通过API与阿里云平台对接, Rancher中启动服务时添加一个标签来表示这个服务需要使用阿里云负载均衡,启动的应用需要映射宿主机端口。 Aliyun-slb会根据创建的应用映射的宿主机端口去检测阿里云负载均衡有没有监听相应的端口。如果端口检测通过,那么Aliyun-slb会把服务的相关参数传递给负载均衡,否则会提示刷新配置失败,负载均衡没有监听某某端口。

Ranche下Ceph RBD应用使用

系统玩家阅读(432)评论(0)


操作步骤

Ceph 服务端安装

如果没有Ceph 服务器,可以通过容器运行一个Ceph 服务器 DEMO环境:

docker run -d –net=host -v /etc/ceph:/etc/ceph -e MON_IP=172.18.0.11 -e CEPH_PUBLIC_NETWORK=172.18.0.0/24 ceph/demo:tag-build-master-jewel-ubuntu-16.04

IP地址根据实际情况修改。

Ceph 服务容器所在宿主机/etc/ceph路径下所有文件复制到Rancher 环境下所有节点的相同路径下。

Rancher下Ceph应用安装

应用商店添加

进入 系统管理 |系统设置 添加一个名为Ceph的自定义商店

名称:Ceph

地址:https://github.com/niusmallnan/rancher-rbd-catalog.git

分支:master

Ceph应用安装

进入应用商店,搜索RBD进行安装。安装完成后:

再进 系统架构|存储 查看:

安装测试应用

应用安装

新建一个名为myapp的空应用栈并添加服务:

红色线框为配置重点:

使用驱动卷插件与使用本地卷驱动有所区别, 使用本地卷驱动添加卷 时应该写 /AA/BB:/CC/DD,前后都要为路径; 使用驱动卷插件 时应该写为 A:/BB/CC 。 这个的A为一个卷名,不能是路径。

因为我们是Ceph存储,这里需要填卷驱动为:rancher-rbd 。部署好之后如图:

查看 基础架构|存储

数据存储测试

在容器中向/root 目录下新建一个文件:

现在这个容器位于node2上, 接着把这个服务容器删除,删除后myapp应用栈为空:

接着,在空的应用栈中添加一个服务,并手动调度容器运行到其他节点上。

PS:新建的服务,参数中的卷名与卷映射路径必须相同,卷驱动也要相同。

服务运行成功,运行在node1上

查看 基础架构|存储

进入容器的/root目录查看创建的文件

文件依然存在,说明文件不是存在本地,证明Ceph存储对接成功。

Rancher-Prometheus部署说明文档

系统玩家阅读(969)评论(0)


演示环境说明

整个演示环境由2台阿里云云服务器组成,相关信息说明如下:

服务器名称 IP地址 OS 角色
rancher-node1 172.18.0.4 ubuntu 16.04.2 LTS (4.4.0) Rancher_server
rancher-node2 172.18.0.4 ubuntu 16.04.2 LTS (4.4.0) Agent

Rancher安装

Rancher具体的安装步骤不在这里叙述。

PS:Prometheus 要向Rancher获取数据,那么Rancher需要配置两样参数:

1、映射指定端口:-p 9108: 9108;

2、通过环境变量开启日志输出功能:-e CATTLE_PROMETHEUS_EXPORTER=true ;

如果是新安装Rancher,添加以上两个参数就可以;如果是已经安装好的Rancher中安装Prometheus,就需要进行升级Rancher。下面简单说一下没有外接数据库的情况下,通过数据卷升级Rancher:

执行: docker create –volumes-from rancher-server –name rancher-data rancher/server:stable 创建容器卷


创建新Rancher容器 (新容器名不要与旧容器名相同)

sudo docker run -d –restart=unless-stopped –volumes-from rancher-data -e CATTLE_PROMETHEUS_EXPORTER=true –name rancher -p 8080:8080 -p 9108:9108 rancher/server:stable

Rancher配置好之后,如下所示:


Prometheus部署

搜索Prometheu

通过rancher_server-ip进入WEB页面后,点击应用商店(Catalog)进入,页面右上角输入prometheus搜索应用。


点击查看详情进入配置界面,

配置Prometheus

配置界面的上部分为Prometheus部署的简单介绍,下部分为参数设置界面:

模板版本:默认最新版本,可选择其他版本;

应用名:默认为Prometheus,可更改为自定义名;

描述:可选;

配置选项:rancher_server IP地址,如果有LB需要填写LB地址,这个地址是用于Rancher传输数据给

Prometheus,这里只需填写ip 地址 不加前缀。


配置好后点击启动。

正常运行后,应用栈如下:


服务说明:

Cadvisor:收集、聚合、处理以及导出运行态容器相关信息。它会在每个节点上运行一个实例;

Node-exporter:这个工具会收集主机的基础信息, 每个节点都会运行一个实例;

Prometheus-rancher-exporter:可以理解为Prometheus与Rancher对接的插件。通过这个工具,Prometheus可获取到与Rancher环境有关的的应用栈、服务和API的使用情况。这个服务只运行一个容器;

Prometheus:Prometheus定时向Node-exporter、Cadvisor、Prometheus-rancher-exporter pull数据并保存在本地。此服务会启动两个应用实例,一个是
Prometheus server,一个是配置管理容器,管理Prometheus的配置文件

Grafana:Grafana通过API向将Prometheus获取数据并可视化。服务启动后会创建两个容器实例,一个是Grafana服务本身,一个是Grafana服务所需的cache容器;

Prometheus的简单使用说明

Prometheus应用栈部署好之后,会映射出两个端口:3000端口为grafana访问端口,9090端口为Prometheus访问端口。

grafana访问

通过主机IP:3000可以直接访问Grafana,默认用户名和密码为 admin/admin。

Rancher-k8s加速安装文档

系统玩家阅读(465)评论(0)


概要

很多同学正常部署k8s环境后 无法进入Dashboard,基础设施应用栈均无报错。但通过查看 基础架构|容器 发现并没有Dashboard相关的容器。

因为k8s在拉起相关服务(如Dashboard、内置DNS等服务)是通过应用商店里面的YML文件来定义的,YML文件中定义了相关的镜像名和版本。而Rancher部署的k8s应用栈属于k8s的基础框架,相关的镜像通过dockerhub/rancher 仓库拉取。

默认Rancher-catalog k8s YML中 服务镜像都是从谷歌仓库拉取,在没有科学上网的情况下,国内环境几乎无法成功拉取镜像。

为了解决这一问题,优化中国区用户的使用体验,我们修改了http://git.oschina.net/rancher/rancher-catalog仓库中的YML文件,将相关的镜像也同步到国内仓库,通过替换默认商店地址来实现加速部署。

环境准备:

整个演示环境由以下4台本地虚拟机组成,相关信息说明如下:

主机名 IP地址 描述 / OS 角色
rancher_server_node 192.168.1.15 ubuntu16.04/内核4.4.0 Rancher_server
rancher_k8s_node1 192.168.1.16 ubuntu16.04/内核4.4.0 k8s-node
rancher_k8s_node2 192.168.1.17 ubuntu16.04/内核4.4.0 k8s-node
rancher_k8s_node3 192.168.1.18 ubuntu16.04/内核4.4.0 k8s-node

操作说明

具体演示操作说明如下:

Step Action
1、直接运行Rancher_server:

Sudo docker run -d –restart always –name rancher_server -p 8080:8080 rancher/server:stable && sudo docker logs -f rancher-server

容器初始化完成后,通过主机IP:8080访问WEB

2、添加变量启动Rancher_server:

Sudo docker run -d –name rancher-server -p 8080:8080 –restart=unless-stopped -e DEFAULT_CATTLE_CATALOG_URL='{“catalogs”:{“library”:{“url”:”http://git.oschina.net/rancher/rancher-catalog.git”,”branch”:”k8s-cn”}}}’ \

rancher/server:stable && sudo docker logs -f rancher-server

变量的作用后面介绍。 Rancher基本配置:

因为Rancher修改过的设置参数无法同步到已创建的环境,所以在创建环境前要把相关设置配置好。比如,如果你想让Rancher默认去拉取私有仓库的镜像,需要配置registry.default= 参数等。

应用商店(Catalog)地址配置:在系统管理\系统设置中,找到应用商店。禁用Rancher 官方认证仓库并按照下图配置。


PS:回到最开始的启动命令,如果以第二种方式启动,这个地方就会被默认配置好。所以,根据自己的情况选择哪一种配置方式, 最后点击保存。  Kubernetes环境配置查看对比:

重启并进入WEB后,选择环境管理。如图:


在环境模板中,找到Kubernetes 模板,点击后边的,接着点击编辑配置。


以下是Rancher-k8s的默认配置对比,图一为默认商店的参数,图二为自定义商店的参数。



这里只是查看参数不做相关修改。点击cancel返回模板编辑页面。 在这里,根据需要可以定制组件,比如可以把默认的ipsec网络改为vxlan网络等,这里不再叙述。 最后点保存或者cancle返回环境管理界面
 添加环境:

在环境管理界面中,点击页面上方的添加环境按钮:


填写环境名称,选择环境模板(Kubernetes),点击创建。创建后:


PS:default环境由于没有添加host,会显示Unhealthy。

切换模板


等待添加主机



 添加主机:


如上图,进入添加主机界面

指定用于注册这台主机的公网IP。如果留空,Rancher会自动检测IP注册。通常在主机有唯一公网IP 的情况下这是可以的。如果主机位于防火墙/NAT设备之后,或者主机同时也是运行rancher/server容器的主机时,则必须设置此IP。

以上这段话会在添加主机页面显示,这段话的意思就是:如果准备添加的节点有运行Rancher-server容器,那么在添加节点的时候就要输入节点可被直接访问的主机IP地址(如果做的Rancher-HA,那么每台运行Rancher-server的节点都要添加主机IP地址),如果不添加主机IP地址,那么在添加节点后获取到的地址很可能会是Rancher-server容器内部的私网地址,导致无法使各节点通信。所以需要注意一下!

本示例三个节点都没有运行rancher_server,所以直接复制生成的代码,在三个节点执行。


节点添加成功,应用栈创建完毕,正在启动服务:


镜像拉取中





到此为止,k8s就部署完成。

 



服务容器查看:点击基础架构|主机


对比基础设施中kubernetes 应用栈,可以发现有以下容器是不在应用栈中的:


这些应用是在k8s框架运行起来之后,再通过YML配置文件拉起的k8s服务,比如Dashboard服务


那些点击提示服务不可达的。 可以先看看有没有此服务容器。

接下来在k8s中简单部署一个应用。 k8s应用部署:

进入k8s的Dashboard后,默认显示的是default 命名空间。

可以通过下拉箭头切换到kube-system命名空间,这里显示了CPU、内存使用率,以及一些系统组件的运行状况。


应用部署:

页面右上角点击create 按钮,进入部署配置界面 ,并简单做一写设置:

注:在service中,如果选择Internal
将需要ingress功能,ingress类似于LB的功能,这个后续讲解。这里我们选择External

最后点击deploy .点击deploy后将会跳转到部署状态界面,如图:

部署完成后显示状态:


页面右侧点击service



可以看到部署的服务以及访问信息。


返回Rancher,进入基础设施


可以看到自动增加了一个kubernetes-loadbalancers 应用栈。 这个应用栈的信息是通过k8s传递到Rancher,所以在部署应用后,在Rancher中很容易找到服务访问点。