通过私有Docker仓库在K8S环境上部署应用程序教程
- 需求描述
最近项目组在做了一个自助缴费相关的车道项目,根据前期架构设计、部署安装模式设计、自动升级设计、负载均衡设计相关思路。最终敲定的需求是要在一个无外网的内部局域网服务器群上进行K8S(Kubernetes)环境部署,然后在这个K8S环境上通过构建私有的Docker镜像仓库来进行业务程序的部署升级负载均衡。
目前主要以在公司的kubeedge测试环境上进行部署操作的演示。
Host Name | IP | CPU | Memory | OS | 备注 |
kubeedge-k8s-master-1 | 192.162.130.87 | 1x2 | 4G | CentOS 7 | 公司虚拟服务器 |
kubeedge-k8s-worker-001 | 192.162.130.88 | 1x2 | 4G | CentOS 7 | 公司虚拟服务器 |
kubeedge-cloudcore-1 | 192.162.130. 89 | 1x2 | 4G | CentOS 7 | 公司虚拟服务器 |
kubeedge-edgecore-001 | 192.162.123.101 | 2x4 | 8G | CentOS 7 | 物理机 |
kubeedge-edgecore-002 | 192.162.123.102 | 2x4 | 8G | CentOS 7 | 物理机 |
kubeedge-proxy-1 | 192.162.123.217 | 1x1 | 1G | Windows | 物理机 |
整个测试环境有三台物理机服务器,三台虚拟服务器。针对如何安装kubeedge边缘云集群环境这里不再介绍。本文主要介绍如何让在kubeedge环境上部署业务程序。
业务系统名称 | 对外暴露端口 | 部署的节点服务器 | 备注 |
计费服务(duty-auto) | 8087 | edgecore-001、edgecore-002 |
|
特情服务(duty-manual) | 8081 | edgecore-001、edgecore-002 |
|
特情处理前端服务(duty-sp) | 8081 | edgecore-001、edgecore-002 |
|
图片及流水上传服务(duty-gate) | 8080 | edgecore-001、edgecore-002 |
|
部署私有Docker仓库 | 5000 | kubeedge-k8s-worker-001 |
|
.... |
|
|
|
业务程序主要部署在edgecore-001、edgecore-002这个两个边缘节点上。
- 主要部署操作流程
1、流程概述
整个部署流程主要分为以下3个大的步骤:
(1)在kubeedge-k8s-worker-001节点服务器上安装私有Docker仓库
(2)对要目标程序进行Docker镜像处理,将duty-auto、duty-manul等程序打包成Docker镜像,推送到指定的Docker仓库。
(3)在kubernetes环境上通过自动获取私有仓库目标镜像进行业务程序需部署。
2、worker-001节点安装私有Docker仓库
在这里我们使用Docker官方提供的Registry作为我们的私有仓库。使用Registry搭建私有仓库相对比较简单。所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。
在这里我们将仓库服务器部署在kubeedge-k8s-worker-001节点上,在master节点去下载这些镜像。
主机名 | 角色 | 备注 |
kubeedge-k8s-worker-001 192.162.130.88:5000 | registry-server(镜像仓库服务器) | 部署registry容器 |
kubeedge-edgecore-001 kubeedge-edgecore-002 | registry-consumer(镜像仓库客户端) | 从registry服务器上下载镜像 |
2.1 首先下载Registry镜像并启动创建本地私有仓库
docker pull registry
然后,运行一个Registry镜像仓库的容器实例,也就是创建一个我们自己的私有仓库。默认使用5000端口作为似有仓库请求端口。
docker run -d -v /edc/images/registry:/var/lib/registry -p 5000:5000
--restart=always --name xdp-registry registry
执行完创建实例的语句后,可以在客户端查看仓库中的所有镜像。
curl http://192.162.130.88:5000/v2/_catalog
我这个仓库里目前已经上传了两个镜像。
注:在进行以下操作之前我们需要给每个可能会访问到Docker仓库的客户端服务器进行配置一下私有仓库的可信任设置让我们可以通过HTTP直接访问。
在客户端服务器上需要在 /etc/docker文件下修改daemon.json文件。在insecure-registries标签后增加一行 "your-server-ip:5000"。
在本次部署测试环境中两个边缘节点kubeedge-edgecore-001 kubeedge-edgecore-002是需要向仓库下载镜像,所以要在这两个节点上增加这个配置。
PS:如果不设置可信任源,又没有配置HTTPS证书,那么会遇到这个错误:error: Get https://ip:port/v1/_ping: http: server gave HTTP response to HTTPS client.
2.2 构建程序镜像上传到Docker仓库
(1) 首先选择一个带有Docker环境的机器,(这里我选择的是kubeedge-edgecore-001,在操作过程中可以选择任何一个内网内的机器)用来手动打Docker镜像。
(2)在这个机器上创建一个单独的文件夹docker,同时在这个文件夹下创建一个Dockerfile文件。并将要打包的Jar复制到相同目录下。
(3)编写Dockerfile文件内容
#指定以openjdk:8-alpine为基础镜像,来构建此镜像,可以理解为运行的需要基础环境
FROM openjdk:8-jdk-alpine
#WORKDIR指令用于指定容器的一个目录, 容器启动时执行的命令会在该目录下执行。 WORKDIR /duty
#将当前duty-auto-1.0.0-SNAPSHOT.jar 复制到容器根目录下并重命名为docker-duty-auto.jar
ADD duty-auto-1.0.0-SNAPSHOT.jar docker-duty-auto.jar
#指定容器需要映射到宿主机器的端口
EXPOSE 8087
#设置container启动时执行的操作
ENTRYPOINT ["java","-jar","/duty-auto-1.0.0-SNAPSHOT.jar","-Dfile.encoding=utf-8"]
(4)编写好Dockerfile文件内容后开始执行docker build命令进行镜像构建。
docker build -f Dockerfile -t docker_duty_auto:v1.1 .
#docker_duty_auto:构建出来的镜像名称;
#v1.1:镜像版本号
注意:命令最后的“.”千万不能省略。
(5)使用docker images 命令查看构建好的镜像
(6)给我们需要上传到Docker仓库的镜像设置TAG(这一步不可省略)
#docker tag 镜像名称:镜像版本 私有镜像仓库地址:端口/镜像名称:镜像版本
docker tag docker_duty_auto:v1.1 192.162.130.88:5000/docker_duty_auto:v1.1
(7)将构建好的镜像推送到指定仓库
docker push 192.162.130.88:5000/docker_duty_auto:v1.1
(8)可以远程查看我们的仓库有没有推送上去的镜像
curl http://192.162.130.88:5000/v2/docker_duty_auto/tags/list
3、在K8S环境上部署我们的应用程序
这一步的最关键就是配置K8S的部署yam文件。首先我们需要在kubeedge-k8s-master-1服务器root根目录下创建对应服务的部署yam文件。
这里主要介绍duty-auto.yaml文件。具体每个字段含义这里也不做过多解释,下一节附上详解。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: duty-auto
name: duty-auto
namespace: ah-station
spec:
replicas: 2
selector:
matchLabels:
k8s-app: duty-auto
template:
metadata:
labels:
k8s-app: duty-auto
name: duty-auto
spec:
nodeSelector:
kubernetes.io/os: linux
node: edgecore
containers:
- name: ah-station
image: 192.162.130.88:5000/docker_duty_auto:v1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8087
protocol: TCP
livenessProbe:
failureThreshold: 3
tcpSocket:
port: 8087
initialDelaySeconds: 180
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 30
resources:
requests:
cpu: 100m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: duty-auto
name: duty-auto
namespace: ah-station
spec:
type: LoadBalancer
selector:
k8s-app: duty-auto
ports:
- name: duty-auto
port: 8087
protocol: TCP
targetPort: 8087
externalIPs:
- 192.162.123.101
- 192.162.123.102
配置好duty-auto.yaml文件后,我们在kubeedge-k8s-master-1节点上使用 kubectl apply -f duty-auto.yaml 命令执行部署操作。
执行成功后通过浏览器访问dashboard管理面板可以看到指定的程序容器已经部署到相应节点上了。
https://dashboard.kubeedge-k8s/#
这样我们整个部署便宣告完成了。可以在访问对应节点的应用程序了。
- 辅助介绍
1、yam文件详解