本文将原虚机上部署的redis制作镜像并使用 Kubernetes运行。
注: 原单台机器上部署了redis 伪集群, 本文记录一般应用制作镜像的过程,本例中redis服务本身不是重点。
选择基础版本镜像 centos
选择官方的centos , docker pull centos
。
使用docker运行该centos镜像
docker run -v /root/data:/data -ti centos /bin/bash
安装基本软件和 应用软件
- yum , 需要修改源 和 配置yum代理, 将相关配置文件放到宿主机的共享目录 /root/data , 共享给容器。
- 安装 net-tools , bind-utils
yum install net-tools
(ifconfig)
yum install bind-utils
(nslookup)
验证 使用 ifconfig , nslookup - 安装 vim (可选)
yum install vim
- 配置时区
使用tzselect , 选择时区 。
将结果配置到环境变量 /etc/profile 中 :
TZ='Asia/Shanghai'; export TZ
建立软连接:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
通过 date -R 验证
Thu, 28 Jun 2018 21:59:12 +0800
- 将应用redis打包, 通过共享目录给容器
配置应用
该应用比较特殊的地方在于需要根据本机的ip地址进行应用配置, 而每次容器启动后分配的地址可能不固定,因此需要自写脚本来获取ip 并 修改相应的配置文件 .
该脚本的作用在于,修改配置 并启动服务 。
if [ -x "/sbin/ifconfig" ];
then
_rhost=$(/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}')
else
_rhost=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}')
fi
_rhost=${_rhost/'addr:'/}
# _rhost="10.30.11.11"
echo "ip address: $_rhost"
echo "date zone:" `date -R`
sourceip="172.17.0.3"
# redis-slave2.conf sentinel.conf
echo "sed redis-slave2.conf ===================="
sed -i "s/$sourceip/$_rhost/" /app/redis/redis-2.8.19/config/redis-slave2.conf
cat /app/redis/redis-2.8.19/config/redis-slave2.conf
echo "sed sentinel.conf ===================="
sed -i "s/$sourceip/$_rhost/" /app/redis/redis-2.8.19/config/sentinel.conf
提交该容器制作初步镜像
- 从上述容器退出 。
- 通过
docker ps -a | grep centos
, 获取刚刚退出的容器id 。 - 使用 commit命令 ,生成提交容器变更内容 ,生成新镜像 ,
docker commit 9999bb3459bc redis-tmp
- 通过 docker images 来查看新生成的镜像 ,名称为redis-tmp ,容器IMAGE ID 为 ad8752d52fc4 。
制作dockerfile
FROM redis-tmp
MAINTAINER xxx
WORKDIR /app/redis/redis-2.8.19/bin/
EXPOSE 6379
EXPOSE 7379
EXPOSE 8379
EXPOSE 26379
ENTRYPOINT ./dockerRedisStart.sh && tail -F ./sentinel.log
FROM redis-tmp , 从上述初步镜像来作为基础镜像 。
ENTRYPOINT 是容器运行时执行的命令入口, 命令需要前台执行,否则执行完会自动退出, 这里 tail -F ./sentinel.log 是为了防止自动退出,又能打印日志。
docker build
docker build -f shenmaredis-dockerfile -t shenma-redis-tmp ./
docker build -f dockerfile文件 -t 生成的镜像名称
通过 docker images 可以查看到新生成的镜像。
镜像重命名 并 放入私有仓库 :
docker tag shenma-redis-tmp:latest node205:5000/shenma-redis:test
docker push node205:5000/shenma-redis:test
在工作节点上 拉取该新生成的镜像
这一步主要是因为k8s配置文件中没有配置镜像拉取策略。
防止node使用本地镜像而不去取最新的镜像。
使用kubectl 创建相应资源
apiVersion: apps/v1
kind: Deployment
metadata:
name: shenma-redis
labels:
app: redis
envs: develop
spec:
replicas: 1
selector:
matchLabels:
app: redis
envs: develop
template:
metadata:
labels:
app: redis
envs: develop
spec:
containers:
- name: shenma-redis
image: node205:5000/shenma-redis:test
# imagePullPolicy: Always
ports:
- containerPort: 26379
创建资源Deployment:
kubectl create -f shenma-redis-deployment.yaml
查看pods :
kubectl get pods -o wide
查看日志 :
kubectl logs -f shenma-redis-545f986bd-bp69g
删除资源:
kubectl delete -f shenma-redis-deployment.yaml
进入镜像
kubectl exec pod-name -ti /bin/bash
网友评论