Docker与Kubernetes实现自动化部署!

举报
菜菜的后端私房菜 发表于 2024/11/26 09:14:45 2024/11/26
【摘要】 Docker与Kubernetes实现自动化部署! 前言随着云计算和微服务架构的兴起,容器化技术和编排工具在现代软件开发中变得越来越重要Docker 和 Kubernetes 是其中的两大热点技术,它们共同为企业提供了高效、可靠的自动化部署解决方案本文将描述发展历程以及Docker 和 Kubernetes的核心概念,通过一个具体的实践案例,详细介绍如何使用 Java 开发一个简单的 We...

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组件

环境搭建

演示流程需要先创建一个项目,将项目打包过后再制作成镜像,然后把镜像放入仓库中,最后使用k8s时能够通过仓库拉取镜像运行

创建项目

创建SpringBoot项目,引用Web依赖,更多请查看项目代码

@RestController
public class IndexController {
    @GetMapping("/index")
    public String index(){
        return "Hello CaiCai";
    }
}

使用maven将其打为jar包后,本地测试 localhost:8080/index 输出 Hello CaiCai

测试spring boot.png

制作镜像

将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 .

构建镜像.png

本地制作完镜像后可以使用命令启动容器进行测试 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:[镜像版本号]

推送镜像.png

推送完成后,可以拉取镜像进行测试

docker pull registry.cn-hangzhou.aliyuncs.com/tcl_start/k8s_demo:1.0

拉取镜像.png

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-k8skillercoda

使用play-with-k8s演示:登陆GitHub账号后,会创建四小时的会话,可以手动创建多节点搭建集群

play-with-k8s

在这个界面中,点击左边的 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节点

初始化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返回响应说明测试成功

测试nginx.png

接着再使用 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部署的全流程

希望本文能为同学们提供有价值的参考,帮助大家在实际项目中更好地利用这些技术,提高开发效率和系统可靠性

最后(点赞、收藏、关注求求啦~)

我是菜菜,热爱技术交流、分享与写作,喜欢图文并茂、通俗易懂的输出知识

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多技术干货,公众号:菜菜的后端私房菜

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。