0%

Ambari 管理 Docker 方法

本文主要介绍在不改变 Ambari 现有整体框架逻辑的情况下,管理 Docker 镜像的方法,可以像普通服务一样进行安装、启停、状态监控等功能。

测试环境

  • Centos 7.4
  • Ambari 2.7.1
  • HDP 3.0.1.0

准备环境

安装 Docker

  • 卸载旧版本
1
yum remove docker  docker-common docker-selinux docker-engine
  • 设置 yum 源
    以下二选一,均可用

    1
    2
    3
    yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)

    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
  • 查看可用版本

    1
    yum list docker-ce --showduplicates | sort -r
  • 安装
    使用 yum install docker-ce-版本号 进行安装,这里安装 18.03.1.ce 版本。

    1
    yum -y install docker-ce-18.03.1.ce
  • 启动 Docker 并设置开机自启

1
2
systemctl start docker
systemctl enable docker

配置仓库

  • 修改配置文件
    1
    vim /etc/docker/daemon.json
    配置如下内容
1
2
3
4
{
"registry-mirrors": ["http://10.180.XXX.XXX:9090"],
"insecure-registries": ["10.180.XXX.XXX:9090"]
}
  • 重启docker
1
systemctl restart docker
  • 测试登录
1
docker login 10.180.XXX.XXX:9090

保证输入账号密码后能正常登录。

制作镜像

这里以 ZooKeeper server 为例制作 Docker 镜像。

解压 rpm 包

1
rpm2cpio zookeeper_3_0_1_0_187-3.4.6.3.0.1.0-187.noarch.rpm |cpio -idv

编写 Dockerfile

Dockerfile 内容如下,这里使用 openjdk 8 作为基础镜像,这里的镜像源为:insight/openjdk:8-jre

1
2
3
4
5
FROM insight/openjdk:8-jre

COPY usr /usr

ENTRYPOINT ["/usr/hdp/3.0.1.0-187/zookeeper/bin/zkServer.sh","start-foreground"]

拉取 openjdk 镜像

1
docker pull insight/openjdk:8-jre

查看镜像

1
docker images

构建镜像

1
docker build -t insight/zookeeper:3.4.6 .

查看镜像

1
docker images

上传镜像

通过 docker tag 重命名镜像,使之与 registry 匹配

1
docker tag insight/zookeeper:3.4.6 10.180.210.148:9090/insight/zookeeper:3.4.6

登录(只需一次)

1
docker login 10.180.xxx.xxx:9090

push镜像

1
docker push 10.180.xxx.xxx:9090/insight/zookeeper:3.4.6

修改 Stacks 文件

Ambari 管理 Docker 的关键在于 Stacks 文件,通过修改服务响应安装、启动、停止等脚本达到管理效果。

这里修改ambari-server\src\main\resources\stacks\HDP\3.0\services\ZOOKEEPER\package\scripts\params_linux.pyambari-server\src\main\resources\stacks\HDP\3.0\services\ZOOKEEPER\package\scripts\zookeeper_server.py 中两个文件。

配置文件

params_linux.py 中添加 docker 相关配置

1
2
3
4
5
6
7
8
9
# docker parameters
zk_server_docker_name = "zkName"
zk_server_host_port = "2181"
zk_server_container_port = "2181"
zk_server_host_conf_dir = "/usr/hdp/3.0.1.0-187/zookeeper/conf"
zk_server_docker_conf_dir = "/usr/hdp/3.0.1.0-187/zookeeper/conf"
zk_server_image_name = "insight/zookeeper"
zk_server_image_version = "3.4.6"
root_user = "root"

安装

zookeeper_server.py 中修改 install 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
def install(self, env):
# self.install_packages(env)
self.configure(env)

Logger.info("Starting pull ZooKeeper image ...")

import params

image_name = params.zk_server_image_name
image_version = params.zk_server_image_version
install_cmd = format("docker pull {image_name}:{image_version}")
Execute(install_cmd, user=params.root_user)
Logger.info("Pull ZooKeeper image success !")

启动

zookeeper_server.py 中修改 start 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
def start(self, env, upgrade_type=None):
import params
env.set_params(params)
self.configure(env, upgrade_type=upgrade_type)
# zookeeper_service(action='start', upgrade_type=upgrade_type)

Logger.info("Starting ZooKeeper ...")
zkName = params.zk_server_docker_name
hport = params.zk_server_host_port
cport = params.zk_server_container_port
image_name = params.zk_server_image_name
image_version = params.zk_server_image_version
hconf = params.zk_server_host_conf_dir
cconf = params.zk_server_docker_conf_dir
hdata = params.zk_data_dir
cpu = params.zk_server_cpu_value
memory = params.zk_server_heapsize_value

try:
stop_cmd = format("docker stop {zkName} && docker rm {zkName}")
Execute(stop_cmd, user=params.root_user)
except:
Logger.info("ZooKeeper is not running .")

start_cmd = format("docker run -d --name {zkName} "
"--network host "
"-v {hconf}:{cconf} "
"-v {hdata}:{hdata} "
"--cpus {cpu} -m {memory} "
"{image_name}:{image_version}")

if params.kerberos_security_enabled:
start_cmd = format("docker run -d --name {zkName} "
"--network host "
"-p {hport}:{cport} "
"-v {hconf}:{cconf} "
"-v {hdata}:{hdata} "
"-v {keytabs_dir}:{keytabs_dir} "
"-v {krb5_conf_dir}:{krb5_conf_dir} "
"--cpus {cpu} -m {memory} "
"{image_name}:{image_version}")

Execute(start_cmd, user=params.root_user)
Logger.info("Started ZooKeeper success !")

Logger.info("Starting write pid ...")
pid_file = params.zk_pid_file
get_pid = "docker top " + zkName + " | awk '{print $2}' | sed -n '2p' > " + pid_file
Execute(get_pid, user=params.root_user)
Logger.info("Write pid success !")

这里主要涉及获取参数,拼接启动命令(包括 kerberos 环境),写入 pid 文件等步骤。

停止

zookeeper_server.py 中修改 stop 方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def stop(self, env, upgrade_type=None):
import params
env.set_params(params)
# zookeeper_service(action='stop', upgrade_type=upgrade_type)

Logger.info("Start stop ZooKeeper ...")
zkName = params.zk_server_docker_name

status = 1
try:
status_cmd = format("docker ps -a | grep {zkName}")
Execute(status_cmd, user=params.root_user)
except:
status = 0

if status:
stop_cmd = format("docker stop {zkName} && docker rm {zkName}")
Execute(stop_cmd, user=params.root_user)
Logger.info("Stopped ZooKeeper ...")

# delete pid file
Logger.info("Start delete pid file ...")
File(params.zk_pid_file, action="delete")
Logger.info("Delete pid file success ...")

主要包括检测 docker 镜像是否存在,如果存在就停掉并删除,并且删除 pid 文件。

状态

这里的状态检测可完全使用之前的方法,不必修改。

1
2
3
4
def status(self, env):
import status_params
env.set_params(status_params)
check_process_status(status_params.zk_pid_file)

安装测试

替换脚本

1
2
3
4
5
6
7
8
9
10
cd /var/lib/ambari-server/resources/stacks/HDP/3.0/services/ZOOKEEPER
cd package/scripts/

rm -rf params_linux.py*
rm -rf zookeeper_server.py*

# 上传修改后的脚本

chmod 755 params_linux.py
chmod 755 zookeeper_server.py

重启 ambari

全部节点

1
2
3
## 清除缓存
rm -rf /var/lib/ambari-agent/cache/*
rm -rf /var/lib/ambari-agent/tmp/*

重启 Ambari server

Server 节点:

1
ambari-server restart

重启 Ambari agent

全部节点:

1
ambari-agent restart

安装

安装步骤与普通版本一样,然后可以进行相应的测试使用。

参考资料