實 docker 平移到 k8s
目前都是 docker 容器,一臺機器大概 50 個容器,如果服務器掛了,那麼這臺機子上的容器也就不提供服務了
剛開始玩 k8s 的同學可能有很多疑問,k8s 和 docker 的關係?也不知道怎麼遷移到 k8s 上 讓 k8s 管理 docker,雖然 docker 現在要涼涼了,但是不得不承認這個工具確實好用
環境準備:
k8s 集羣(有問題的話 最新的腳本可以找我拿)
快速搭建
王思宇,公衆號:Linux 土著運維攻城獅使用 kubeadm 快速部署 kubernetes 集羣
內網用 DNS 一個(可選)
內網 DNS
王思宇,公衆號:Linux 運維開發之路內網 DNS 服務器 搞一個!(親測可用)
阿里雲鏡像倉庫(可選)
docker 容器若干
如果沒有鏡像庫就本地遷移鏡像包
1. 查看容器運行命令
需要的工具是 runlike
安裝方式
yum install python3 -y
pip3 install runlike
docker ps -a
runlike -p 508b36cfbde3
docker run \
--name=Yapi_1.99 \
--hostname=508b36cfbde3 \
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
--volume=/etc/localtime:/etc/localtime \
--volume=/home/yapi:/soft \ # 只需要看這個 掛載目錄 我們要備份這個
--network=php_net \ # 當前用的網絡類型是 macvlan 這個不用管
--privileged \
--expose=22/tcp \
--restart=always \
--label='org.opencontainers.image.created=2020-08-09 00:00:00+01:00' \
--label='org.label-schema.vendor=CentOS' \
--label='org.label-schema.schema-version=1.0' \
--label='org.label-schema.license=GPLv2' \
--label='org.label-schema.build-date=20200809' \
--label='org.opencontainers.image.licenses=GPL-2.0-only' \
--label='org.opencontainers.image.vendor=CentOS' \
--label='org.label-schema.name=CentOS Base Image' \
--label='org.opencontainers.image.title=CentOS Base Image' \
--detach=true \
192.168.1.13:180/test/jdk:1.8.0_261 \
/usr/sbin/sshd -D
很明顯 這是前任運維做好了的鏡像
用 centos7 原始鏡像裝了 openssh-server java 等服務
然後開機啓動命令爲
/usr/sbin/sshd -D
需要打包這個數據目錄 /home/yapi
2. 遷移鏡像遷移數據
# 鏡像
docker save 192.168.1.13:180/test/jdk:1.8.0_261 >jdkimage.tar
scp jdkimage.tar 192.168.1.11:/data # data爲k8s共享目錄 底層用的glusterFS
# 數據 其實就是yapi服務 遷移數據類似 如果量大建議走數據庫備份
tar zcf yapi.tar.gz /home/yapi/
scp yapi.tar.gz 192.168.1.11:/data
ssh 192.168.1.11
docker load </data/jdkimage.tar
docker tag 192.168.1.13:180/test/jdk:1.8.0_261 jdk:1.8
docker images
cd /data && tar xf yapi.tar.gz # 此時 數據目錄爲/data/yapi
# 具體的操作就是把一個服務器docker鏡像挪到另外一臺服務器上
打包鏡像用了挺長時間,裏邊東西挺多啊。
3. 寫 yaml
數據和鏡像都有了,開始編排
apiVersion: apps/v1
kind: Deployment
metadata:
name: yapi
spec:
selector:
matchLabels:
app: yapi
replicas: 1 # web服務一般都可以指定多個
template:
metadata:
labels:
app: yapi
spec:
nodeSelector: # 指定pod創建在哪個節點
type: db
containers:
- name: yapi
image: jdk:1.8 # 剛纔打tag的鏡像
volumeMounts:
- name: data
mountPath: /soft # 對應容器內部目錄
- name: localtime
mountPath: /etc/localtime
ports:
- containerPort: 3000 # yapi服務對外服務端口
env:
- name: TZ
value: Asia/Shanghai
volumes:
- name: localtime
hostPath:
path: /etc/localtime
- name: data
hostPath:
path: /data/yapi
---
apiVersion: v1
kind: Service
metadata:
name: yapi
spec:
ports:
- name: yapi
protocol: TCP
port: 3000
targetPort: 3000
selector:
app: yapi
sessionAffinity: None
type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: yapi
spec:
rules:
- host: "yapi.pinuc.tech" # 外部訪問域名,然後用dns解析到任意集羣IP
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: yapi
port:
number: 3000
kubectl apply -f yapi.yaml
kubectl get all | grep yapi
pod/yapi-55d6457956-crp9v 1/1 Running 0 62m
service/yapi NodePort 10.101.193.160 <none> 3000:32497/TCP 60m
deployment.apps/yapi 1/1 1 1 62m
replicaset.apps/yapi-55d6457956 1 1 1 62m
kubectl get ing | grep yapi
yapi nginx yapi.pinuc.tech 192.168.1.10,192.168.1.11,192.168.1.14,192.168.1.15 80 62m
由於服務沒有啓動
需要進入容器啓動服務,也可以繼續定製該容器,讓它運行時就啓動
啓動 yapi 的命令爲
kubectl exec -it yapi-55d6457956-crp9v -- /bin/bash # 進入pod 由於該pod裏邊還有一個容器就直接進入這個容器了
[root@yapi-55d6457956-crp9v /]# nohup /soft/node-v14/bin/node /soft/yapi/vendors/server/app.js & # 啓動
監聽3000端口
然後訪問 http://yapi.pinuc.tech/
其實就是用一樣的鏡像 用域名訪問即可(因爲 ip 會變)
如果是數據庫可以選擇 dump 或者打包 data
唯一注意的一點是 遷移之前一定要進容器裏看裏邊在跑什麼~ 測試成功之後在 docker rm
over~
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ixth113GE8w-3OuYXI3Wow