Docker与Kubernetes实现自动化部署!
Docker与Kubernetes实现自动化部署!
前言
随着云计算和微服务架构的兴起,容器化技术和编排工具在现代软件开发中变得越来越重要
Docker 和 Kubernetes 是其中的两大热点技术,它们共同为企业提供了高效、可靠的自动化部署解决方案
本文将描述发展历程以及Docker 和 Kubernetes的核心概念,通过一个具体的实践案例,详细介绍如何使用 Java 开发一个简单的 Web 应用,并将其容器化部署到 Kubernetes 集群中
发展历程
物理机部署
早期,各个程序运行在物理服务器上
由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配不均匀的问题
比如:在同一台物理服务器上运行多个应用程序,可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降
可以将每个应用程序部署在不同的物理服务器上来解决这个问题,但是有的应用程序利用率不高时,会造成物理服务器资源的浪费,并且维护成本会变得很高
虚拟机部署
后来,引入了虚拟化技术
虚拟化技术允许在单个物理服务器的 CPU 上运行多台虚拟机(VM)
虚拟化能使应用程序在不同VM之间被彼此隔离,且能提供一定程度的安全性,因为应用程序不会被另一个应用程序随意访问
虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处
虽然虚拟化部署解决物理机部署资源浪费严重、扩展性差的问题,但VM运行需要完整操作系统开销依旧很大并且管理也很麻烦
容器部署
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS),容器比起 VM 被认为是更轻量级的、且与 VM 类似
每个容器都具有自己的文件系统、CPU、内存、进程空间等,容器部署更轻量、隔离性更好、不同环境下可移植
演进的过程如下图:
Docker与Kubernetes
Docker 是一个开源的容器化平台,旨在使开发、部署和运行应用程序变得更加高效和一致
它通过使用容器技术,将应用程序及其依赖项打包在一起,形成一个轻量级、可移植的容器,可以在不同的环境中无缝运行
通过build(构建镜像)、pull(拉取镜像)、run(运行镜像)等命令来进行使用
可以简单的类比maven学习,它也是存在远程、本地仓库,通常从远程仓库拉取镜像到本地,再放入容器中运行
通过编写dockerfile制作镜像,制作后需要放入仓库才能被其他机器拉取,同时可以通过监听代码源、编写脚本的方式实现CICD自动化部署
下面这张流程图非常清晰的说明docker是如何工作的(图片来源网络)
当容器逐渐增多时,不方便管理,而Kubernetes就是用于进行管理容器的平台
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化,中间有8个单词又简称k8s
k8s的节点分为master节点和工作节点worker,master节点负责控制平面,调度程序以及节点状态检测
worker节点实际部署容器用来工作,Pod是worker节点上资源最小单位,用来部署容器执行工作
节点内还有各种组件,更多可查看官网
环境搭建
演示流程需要先创建一个项目,将项目打包过后再制作成镜像,然后把镜像放入仓库中,最后使用k8s时能够通过仓库拉取镜像运行
创建项目
创建SpringBoot项目,引用Web依赖,更多请查看项目代码
@RestController
public class IndexController {
@GetMapping("/index")
public String index(){
return "Hello CaiCai";
}
}
使用maven将其打为jar包后,本地测试 localhost:8080/index 输出 Hello CaiCai
制作镜像
将jar包上传至Linux,在其目录下编写dockerfile文件 vim dockerfile
# 基础镜像
FROM maven:3.8-jdk-8
# author
MAINTAINER caicai
# 挂载目录
VOLUME /home/k8s
# 创建目录
RUN mkdir -p /home/k8s
# 指定路径
WORKDIR /home/k8s
# 复制jar文件到路径
COPY ./SpringBoot-k8s.jar /home/k8s/SpringBoot-k8s.jar
# 启动
ENTRYPOINT ["java","-jar","SpringBoot-k8s.jar"]
使用命令构建镜像 docker build -t k8s_demo:1.0 .
本地制作完镜像后可以使用命令启动容器进行测试 docker run -d -p 8080:8080 k8s_demo:1.0
(记得开放端口)
推送镜像到仓库
Docker仓库通常有Docker Hub公共仓库、Harbor私有仓库、阿里云仓库等(演示使用阿里云镜像仓库)
首先需要申请镜像仓库(设置仓库为公有),申请的过程中需要先绑定代码源GitHub,绑定代码源的好处是可以感知代码提交时自动构建镜像实现CICD自动化部署
同时也可以取消勾选自动构建镜像,手动进行构建镜像
申请完仓库后就可以开始推送镜像到仓库
#登陆 需要输入阿里云的密码
docker login --username=[你的用户名] registry.cn-hangzhou.aliyuncs.com
#将本地镜像image id和版本号进行替换
docker tag [本地镜像的imageId] registry.cn-hangzhou.aliyuncs.com/tcl_start/k8s_demo:[镜像版本号]
#推送
docker push registry.cn-hangzhou.aliyuncs.com/tcl_start/k8s_demo:[镜像版本号]
推送完成后,可以拉取镜像进行测试
docker pull registry.cn-hangzhou.aliyuncs.com/tcl_start/k8s_demo:1.0
k8s搭建及使用
对于k8s简单的搭建可以使用minikube
对于x86的Linux可以使用以下命令安装
#下载
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
#安装
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
#无法使用命令 说明没配环境变量 ,要将/usr/local/bin加入环境变量
minikube start
其他系统或情况参考官方文档
如果不想那么麻烦搭建k8s环境也可以使用在线平台,比如 play-with-k8s
或 killercoda
使用play-with-k8s演示:登陆GitHub账号后,会创建四小时的会话,可以手动创建多节点搭建集群
在这个界面中,点击左边的 ADD NEW INSTANCE 就可以创建一个新节点
shell命令行以及提示可以通过命令来进行初始化:
#初始化master节点(只有master节点执行)
kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16
#初始化节点网络(所有节点都要执行)
kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
#创建一个nginx案例(测试使用,可以不执行)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml
我们先创建node1/2/3 三个节点搭建集群,其中node1初始化为master节点
(记住成功后返回的join命令以及token,工作节点加入时使用)
在master节点中执行 kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
在工作节点中执行 kubeadm join 192.168.0.13:6443 --token omctpz.nhn87miej7xzox4o \ --discovery-token-ca-cert-hash sha256:f566766baef1ad5d709c81463d2f0676d1166c4b02912ec4e389b708f00cab21
加入集群
所有节点加入集群后,在master节点中使用 kubectl get nodes
进行查看
k8s中的资源可以使用yaml文件配置,准备先用nginx案例进行测试
vi nginx.yaml
编写以下配置文件(以下文件中分别是Service和Deployment)
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
使用kubectl apply -f nginx.yaml
创建服务,并通过kubectl get services
查看服务,最后访问nginx服务IP返回响应说明测试成功
接着再使用 vi k8s-demo.yaml
编写我们镜像的服务
apiVersion: v1
kind: Service
metadata:
name: k8s-demo-service
spec:
selector:
app: k8s-demo
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-demo-deployment
spec:
replicas: 3
selector:
matchLabels:
app: k8s-demo
template:
metadata:
labels:
app: k8s-demo
spec:
containers:
- name: k8s-demo
image: registry.cn-hangzhou.aliyuncs.com/tcl_start/k8s_demo:1.0
ports:
- containerPort: 8080
最后再使用kubectl apply -f k8s-demo.yaml
创建服务进行测试,至此我们的演示流程结束
要实现自动化部署CICD,还可以使用Jenkins实现代码源变动构建镜像k8s管理部署,同时也可以使用云服务厂商提供的功能
总结
通过本文的实践,我们不仅掌握了 Docker 和 Kubernetes 的核心概念和应用,还成功实现了从 Web 应用开发到k8s部署的全流程
希望本文能为同学们提供有价值的参考,帮助大家在实际项目中更好地利用这些技术,提高开发效率和系统可靠性
最后(点赞、收藏、关注求求啦~)
我是菜菜,热爱技术交流、分享与写作,喜欢图文并茂、通俗易懂的输出知识
有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~
关注菜菜,分享更多技术干货,公众号:菜菜的后端私房菜
- 点赞
- 收藏
- 关注作者
评论(0)