本文將原虛機上部署的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
- 配置時區(qū)
使用tzselect , 選擇時區(qū) 蜀细。
將結(jié)果配置到環(huán)境變量 /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打包舟铜, 通過共享目錄給容器
配置應用
該應用比較特殊的地方在于需要根據(jù)本機的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命令 血柳,生成提交容器變更內(nèi)容 ,生成新鏡像 生兆,
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 是容器運行時執(zhí)行的命令入口合蔽, 命令需要前臺執(zhí)行击敌,否則執(zhí)行完會自動退出, 這里 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
在工作節(jié)點上 拉取該新生成的鏡像
這一步主要是因為k8s配置文件中沒有配置鏡像拉取策略刃宵。
防止node使用本地鏡像而不去取最新的鏡像衡瓶。
使用kubectl 創(chuàng)建相應資源
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
創(chuàng)建資源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