业务容器化优势
① 提高资源利用率、节省IT成本支出。
② 提高部署效率(降低人工成本支出),实现基于kubernetes实现微服务的快速部署与交付、容器的批量调度与秒级启动。
③ 实现横向扩容、灰度部署、回滚、链路追踪、服务治理等。
④ 可根据业务负载进行自动弹性伸缩。
⑤ 容器将环境和代码打包在镜像内,保证了测试与生产运行环境的一致性。
⑥ 紧跟云原生社区技术发展的步伐,不给公司遗留技术债,为后期技术升级夯实了基础。
⑦ 为个人储备前沿技术,提高个人level
业务容器化案例一
业务规划
流程介绍 1 开发代码 2 推送到gitlab 3 kenkins 构建包 4 构建镜像 5 推送到harbor 6 k8s 灰度升级 滚动升级
业务镜像分层
每个业务镜像 都是基于官方的基础镜像 二次修改的
层级构建
-
官方基础镜像
-
公司基础镜像
- telnet
- ssh
- 运维需要的东西
- 或者是安全加固的东西
-
业务基础镜像
- 根据不同的开发栈 加入SDK
- python java go nginx
-
业务镜像
- 打入不同业务的程序 应用 代码
- nginx 打入配置文件
镜像分层的好处
前面3部都是相对固定的 每次只需要更新代码到容器中 衍生出不同版本的业务镜像
操作案例-Kubernetes运行Zookeeper集群并基于PVC实现数据持久化
操作步骤
构建镜像
step1 创建两个仓库
harbor.linuxarchitect.io/harbor/proj…
pub-images(公共镜像) 和 magedu 业务镜像
打基础镜像
docker pull elevy/slim_java:8
docker tag elevy/slim_java:8 harbor.linuxarchitect.io/baseimages/slim_java:8
docker push harbor.linuxarchitect.io/baseimages/slim_java:8
配置镜像加速 cr.console.aliyun.com/cn-hangzhou…
vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://$random_id.mirror.aliyuncs.com"] }
构建业务镜像
cd /opt/01-jiege/k8s-data/dockerfile/web/magedu/zookeeper;
docker build -t harbor.linuxarchitect.io/magedu/zookeeper:v3.4.14 .
docker push harbor.linuxarchitect.io/magedu/zookeeper:v3.4.14
测试镜像运行
docker run -ti --rm harbor.linuxarchitect.io/magedu/zookeeper:v3.4.14
step2 创建动态类
参考这个文档 创建一个storageclass
step3 部署zk
zookeeper.yaml
apiVersion: v1
kind: Service
metadata:
name: zookeeper
namespace: magedu
spec:
ports:
- name: client
port: 2181
selector:
app: zookeeper
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper1
namespace: magedu
spec:
type: NodePort
ports:
- name: client
port: 2181
nodePort: 32181
- name: followers
port: 2888
- name: election
port: 3888
selector:
app: zookeeper
server-id: "1"
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper2
namespace: magedu
spec:
type: NodePort
ports:
- name: client
port: 2181
nodePort: 32182
- name: followers
port: 2888
- name: election
port: 3888
selector:
app: zookeeper
server-id: "2"
---
apiVersion: v1
kind: Service
metadata:
name: zookeeper3
namespace: magedu
spec:
type: NodePort
ports:
- name: client
port: 2181
nodePort: 32183
- name: followers
port: 2888
- name: election
port: 3888
selector:
app: zookeeper
server-id: "3"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-dynamic-zk-1
namespace: magedu
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-dynamic-zk-2
namespace: magedu
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs-dynamic-zk-3
namespace: magedu
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
---
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
name: zookeeper1
namespace: magedu
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
server-id: "1"
spec:
volumes:
- name: data
emptyDir: {}
- name: wal
emptyDir:
medium: Memory
containers:
- name: server
image: harbor.linuxarchitect.io/magedu/zookeeper:v3.4.14
imagePullPolicy: Always
env:
- name: MYID
value: "1"
- name: SERVERS
value: "zookeeper1,zookeeper2,zookeeper3"
- name: JVMFLAGS
value: "-Xmx2G"
ports:
- containerPort: 2181
- containerPort: 2888
- containerPort: 3888
volumeMounts:
- mountPath: "/zookeeper/data"
name: zookeeper-datadir-pvc-1
volumes:
- name: zookeeper-datadir-pvc-1
persistentVolumeClaim:
# claimName: zookeeper-datadir-pvc-1
claimName: pvc-nfs-dynamic-zk-1
---
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
name: zookeeper2
namespace: magedu
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
server-id: "2"
spec:
volumes:
- name: data
emptyDir: {}
- name: wal
emptyDir:
medium: Memory
containers:
- name: server
image: harbor.linuxarchitect.io/magedu/zookeeper:v3.4.14
imagePullPolicy: Always
env:
- name: MYID
value: "2"
- name: SERVERS
value: "zookeeper1,zookeeper2,zookeeper3"
- name: JVMFLAGS
value: "-Xmx2G"
ports:
- containerPort: 2181
- containerPort: 2888
- containerPort: 3888
volumeMounts:
- mountPath: "/zookeeper/data"
name: zookeeper-datadir-pvc-2
volumes:
- name: zookeeper-datadir-pvc-2
persistentVolumeClaim:
# claimName: zookeeper-datadir-pvc-2
claimName: pvc-nfs-dynamic-zk-2
---
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
name: zookeeper3
namespace: magedu
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
server-id: "3"
spec:
volumes:
- name: data
emptyDir: {}
- name: wal
emptyDir:
medium: Memory
containers:
- name: server
image: harbor.linuxarchitect.io/magedu/zookeeper:v3.4.14
imagePullPolicy: Always
env:
- name: MYID
value: "3"
- name: SERVERS
value: "zookeeper1,zookeeper2,zookeeper3"
- name: JVMFLAGS
value: "-Xmx2G"
ports:
- containerPort: 2181
- containerPort: 2888
- containerPort: 3888
volumeMounts:
- mountPath: "/zookeeper/data"
name: zookeeper-datadir-pvc-3
volumes:
- name: zookeeper-datadir-pvc-3
persistentVolumeClaim:
# claimName: zookeeper-datadir-pvc-3
claimName: pvc-nfs-dynamic-zk-3