master节点部署pod_小伙!Kubernetes 部署如此简单,你看完全明白了

18dacb75c670ff8198b5366353166ee2.png

将项目迁移到k8s平台是怎样实现的?

  1. 制作镜像
  2. 控制器管理Pod
  3. Pod数据持久化
  4. 暴露应用
  5. 对外发布应用
  6. 日志/监控

2e44646a790f980f8f4693fe6a787154.png

1、制作镜像分为三步

  • 第一基础镜像,是基于哪个操作系统,比如Centos7或者其他的
  • 第二步中间件镜像,比如服务镜像,跑的像nginx服务,tomcat服务
  • 第三步项目镜像,它是服务镜像之上的,将你的项目打包进去,那么这个项目就能在你这个服务镜像里面运行了

一般运维人员都是提前将镜像做好,而开发人员就能直接拿这个镜像去用,这个镜像一定要符合现在环境部署的环境。

2、控制器管理 pod

也就是k8s去部署这个镜像了,一般我们都会去拿控制器去部署,用的最多的就是 deployment

  • Deployment:无状态部署
  • StatefulSet:有状态部署
  • DaemonSet:守护进程部署
  • Job & CronJob:批处理

无状态和有状态的有什么区别?

有状态的是有身份的,比如网络ID、存储、这个两个是提前规划好的,有序启动/停止

持久化与非持久化

3、Pod 数据持久化

pod数据持久化主要是因对一个应用程序说的,比如开发一个项目,这个项目有没有落地到本地文件,如果有落的话,就保证他持久的有了,那就必须要用到pod数据的持久化了。

7b7b9b74c31d908cd037af7ec9034e16.png

容器部署过程中一般有以下三种数据:

  • 启动时需要的初始数据,可以是配置文件
  • 启动过程中产生的临时数据,该临时数据需要多个容器间共享
  • 启动过程中产生的持久化数据

4、暴露应用

在 k8s中,部署一个deployment,它是无法对外进行访问的,即其他应用程序要想访问部署的deployment,它找不到该怎么去访问。为什么去这么讲,因为deployment一般都是多副本的去部署,有可能会分布在不同的节点之上,而且重建 pod ip也会变,重新发布一下也会变了,所以没有办法去固定去访问哪个pod,即使固定了,其他的pod也访问不了。

要想做到多个 pod 都去提供服务的话,前面有必须要加一个负载均衡,提供一个访问入口,只有访问这个统一入口,才能转发到后端多个pod上,只要访问这个Cluster IP就能转发到后端的pod上。

afbf3398416352ace4938ca66184174a.png

Service

  • Service 定义了 Pod 的逻辑集合和访问这个集合的策略
  • Service 引入为了解决Pod的动态变化,提供服务发现和负载均衡
  • 使用 CoreDNS 解析 Service 名称

5、对外发布应用

24e00a68269af2e8a4b5fd7af044c402.png

暴露出去之后呢,也就是需要让用户去访问,比如搭建一个电商网站,让用户去访问,ingress相对于service,它是一个互补的状态,弥补了各自,service主要提供了集群内部的访问,也可以暴露一个TCP/UDP的端口,而ingress主要是一个7层的转发,也就是提供一个统一的入口,只要访问ingress controller,它就能帮你转发你部署所有的项目,也就是所有的项目都使用域名去访问。

9298c0dd3f975a68f4910434a4d7b12f.png

首先开发者将代码部署到你的代码仓库中,主流的用的Git或者gitlab,提交完代码通过CI/CD平台需要对代码进行拉取、编译、构建,产生一个War包,然后交给Ansible然后发送到云主机上/物理机,然后通过负载均衡将项目暴露出去,然后会有数据库,监控系统,日志系统来提供相关的服务。

cbbfde0d725dd39bc75363f26434f543.png

首先也是开发将代码放在代码仓库,然后通过jenkins去完成拉取代码,编译,上传到我们的镜像仓库。

这里是将代码打包成一个镜像,而不是可以执行的war或者jar包,这个镜像包含了你的项目的运行环境和项目代码,这个镜像可以放在任何docker上去run起来,都可以去访问,首先得保证能够在docker上去部署起来,再部署到k8s上,打出来的镜像去放在镜像仓库中,来集中的去管理这些镜像。

因为每天会产生几十个或者上百个镜像,必须通过镜像仓库去管理,这里可能会去写一个脚本去连接k8smaster,而k8s会根据自己的部署去调度这些pod,然后通过ingress去发布我们的应用,让用户去访问,每个ingress会关联一组pod,而service会创建这组pod的负载均衡,通过service去区分这些节点上的Pod。

然后数据库是放在集群之外,监控系统日志系统也可以放在k8s集群放在去部署,也可以放在之外,我们是放在k8s集群内的,也不是特别敏感,主要用来运维和开发调试用的,不会影响到我们的业务,所以我们优先去k8s中去部署。

现在以部署一个JAVA项目到我们的k8s中

一、安装一个openjdk

[root@k8s-master ~]# yum -y install java-1.8.0-openjdk.x86_64 maven
[root@k8s-master ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

然后我们将代码拉到本地一般Dockerfile中跟我们的代码都放在同一目录下,

[root@k8s-master tomcat-java-demo-master]# ls
db  Dockerfile  LICENSE  pom.xml  README.md  src
[root@k8s-master tomcat-java-demo-master]# vim Dockerfile
FROM lizhenliang/tomcat
LABEL maintainer zhaochengcheng
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/*.war /usr/local/tomcat/webapps/ROOT.war

二、进行编译

这里我们需要配置maven的国内源,这样的话就比较快一点

[root@k8s-master CI]# vim /etc/maven/settings.xml
<mirror>      <id>central</id>      <mirrorOf>central</mirrorOf>      <name>aliyun maven</name>  <url>https://maven.aliyun.com/repository/public</url> </mirror>  
</mirrors>
[root@k8s-master tomcat-java-demo-master]# mvn clean package -D maven test.skip=true  
[root@k8s-master tomcat-java-demo-master]# ls  
db Dockerfile LICENSE pom.xml README.md src target  
[root@k8s-master tomcat-java-demo-master]# cd target/  
[root@k8s-master target]# ls  
classes generated-sources ly-simple-tomcat-0.0.1-SNAPSHOT ly-simple-tomcat-0.0.1-SNAPSHOT.war maven-archiver maven-status  
[root@k8s-master tomcat-java-demo-master]# cd target/

我们就使用这个编译好的war包,然后打成镜像,上传到我们的Harbor仓库里

[root@k8s-master target]# ls
classes            ly-simple-tomcat-0.0.1-SNAPSHOT      maven-archivergenerated-sources  
ly-simple-tomcat-0.0.1-SNAPSHOT.war  maven-status[root@k8s-master tomcat-java-demo-master]# docker build -t 192.168.30.24/library/java-demo:latest .

三、上传到镜像仓库

[root@k8s-master tomcat-java-demo-master]# docker login 192.168.30.24
Username: admin
Password:
Error response from daemon: Get https://192.168.30.24/v2/: dial tcp 192.168.30.24:443: connect: connection refused

这里报错,其实我们需要在每台docker下都要写入对harbor仓库的信任才可以,后面上传镜像也会用

[root@k8s-master java-demo]# vim /etc/docker/daemon.json
{        "registry-mirrors":["http://f1361db2.m.daocloud.io"],     "insecure-registries": ["192.168.30.24"]}

再等录一下push就可以了

[root@k8s-master tomcat-java-demo-master]# docker push 192.168.30.24/library/java-demo:latest

a03143815ce64cafa2f3213ce3368ac9.png

四、控制器管理pod

编写deployment,一般项目都写到自定义的命名空间下,名称写项目名称,方便记忆,name: tomcat-java-demo
namespace: test

另外就是下一个项目名称,这里分为多个,一般有很多的组件组成,所以下面可以写个app的名称,比如组件1、2、3,起码标签有这两个维度
project: www
app: java-demo

另外就是镜像拉取,在哪个仓库去下载,这里我建议镜像仓库的项目名称和我们定义的是一种,避免混了。我重新打个标签,并传到我们的私有镜像仓库中

[root@k8s-master java-demo]# docker tag 192.168.30.24/library/java-demo  192.168.30.24/tomcat-java-demo/java-demo[root@k8s-master java-demo]# docker push 192.168.30.24/tomcat-java-demo/java-demo:latest

镜像地址也改一下地址

imagePullSecrets:  - name: registry-pull-secret  
containers:  - name: tomcat  
image: 192.168.30.24/tomcat-java-demo/java-demo:latest

现在开始创建 yaml

创建项目的命名空间

[root@k8s-master java-demo]# vim namespace.yaml  
apiVersion: v1  
kind: Namespace  
metadata:  
name: test  [root@k8s-master java-demo]# kubectl create -f namespace.yaml  
namespace/test created  
[root@k8s-master java-demo]# kubectl get ns  
NAME STATUS AGE  
default Active 22h  
kube-node-lease Active 22h  
kube-public Active 22h  
kube-system Active 22h  
test Active 5s

创建一个secret来保证我们harbor镜像仓库的认证信息,这里一定要写上我们的项目的命名空间。

[root@k8s-master java-demo]# kubectl create secret docker-registry registry-pull-secret --docker-username=admin --docker-password=Harbor12345 --docker-email=111@qq.com --docker-server=192.168.30.24 -n test  
secret/registry-pull-secret created  
[root@k8s-master java-demo]# kubectl get ns  
NAME STATUS AGE  
default Active 23h  
kube-node-lease Active 23h  
kube-public Active 23h  
kube-system Active 23h  
test Active 6m39s  
[root@k8s-master java-demo]# kubectl get secret  
NAME TYPE DATA AGE  
default-token-2vtgm kubernetes.io/service-account-token 3 23h  
registry-pull-secret kubernetes.io/dockerconfigjson 1 46s  [root@k8s-master java-demo]# vim deployment.yaml  
apiVersion: apps/v1beta1  
kind: Deployment  
metadata:  
name: tomcat-java-demo  
namespace: test  
spec:  
replicas: 3  
selector:  
matchLabels:  
project: www  
app: java-demo  
template:  
metadata:  
labels:  
project: www  
app: java-demo  
spec:  
imagePullSecrets:  - name: registry-pull-secret  
containers:  - name: tomcat  
image: 192.168.30.24/tomcat-java-demo/java-demo:latest  
imagePullPolicy: Always  
ports:  - containerPort: 8080  
name: web  
protocol: TCP  
resources:  
requests:  
cpu: 0.5  
memory: 1Gi  
limits:  
cpu: 1  
memory: 2Gi  
livenessProbe:  
httpGet:  
path: /  
port: 8080  
initialDelaySeconds: 60  
timeoutSeconds: 20  
readinessProbe:  
httpGet:  
path: /  
port: 8080  
initialDelaySeconds: 60  
timeoutSeconds: 20  [root@k8s-master java-demo]# kubectl get pod -n test  
NAME READY STATUS RESTARTS AGE  
tomcat-java-demo-6d798c6996-fjjvk 1/1 Running 0 2m58s  
tomcat-java-demo-6d798c6996-lbklf 1/1 Running 0 2m58s  
tomcat-java-demo-6d798c6996-strth 1/1 Running 0 2m58s

另外就是暴露一个Service,这里的标签也要保持一致,不然他找不到相应的标签就提供不了服务,这里我们是使用ingress来访问发布应该,直接使用ClusterIP就可以

[root@k8s-master java-demo]# vim service.yaml  
apiVersion: v1  
kind: Service  
metadata:  
name: tomcat-java-demo  
namespace: test  
spec:  
selector:  
project: www  
app: java-demo  
ports:  - name: web  
port: 80  
targetPort: 8080  [root@k8s-master java-demo]# kubectl get pod,svc -n test  
NAME READY STATUS RESTARTS AGE  
pod/tomcat-java-demo-6d798c6996-fjjvk 1/1 Running 0 37m  
pod/tomcat-java-demo-6d798c6996-lbklf 1/1 Running 0 37m  
pod/tomcat-java-demo-6d798c6996-strth 1/1 Running 0 37m  NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE  
service/tomcat-java-demo ClusterIP 10.1.175.191 <none> 80/TCP 19s

测试访问我们的项目,是可以的,现在要发布出去通过ingress

测试访问我们的项目,是可以的,现在要发布出去通过ingress

[root@k8s-master java-demo]# curl 10.1.175.191  
<!DOCTYPE html>  
<html>  
<head lang="en">  
<meta charset="utf-8">  
<meta http-equiv="X-UA-Compatible" content="IE=edge">  
<title>把美女带回家应用案例</title>  
<meta name="description" content="把美女带回家应用案例">  
<meta name="keywords" content="index">

现在部署一个ingress-nginx的控制器,这个网上都可以找到,官方也有,我这里是按DaemonSet的方式去部署的,所以每个节点都会跑一个控制器。

[root@k8s-master java-demo]# kubectl get pod -n ingress-nginx
NAME                             READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-g95pp   1/1     Running   0          3m6s
nginx-ingress-controller-wq6l6   1/1     Running   0          3m6s

发布应用

这里注意两点,第一个就是网站域名,一个是service的命名空间。

[root@k8s-master java-demo]# kubectl get pod,svc -n test  
NAME READY STATUS RESTARTS AGE  
pod/tomcat-java-demo-6d798c6996-fjjvk 1/1 Running 0 53m  
pod/tomcat-java-demo-6d798c6996-lbklf 1/1 Running 0 53m  
pod/tomcat-java-demo-6d798c6996-strth 1/1 Running 0 53m  NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE  
service/tomcat-java-demo ClusterIP 10.1.175.191 <none> 80/TCP 16m  
[root@k8s-master java-demo]# vim service.yaml  
[root@k8s-master java-demo]# kubectl create -f ingress.yaml  
apiVersion: extensions/v1beta1  
kind: Ingress  
metadata:  
name: tomcat-java-demo  
namespace: test  
spec:  
rules:  - host: java.maidikebi.com  
http:  
paths:  - path: /  
backend:  
serviceName: tomcat-java-demo  
servicePort: 80

另外我这边是测试的,所以绑定我本地的hosts来进行访问,在hosts文件里面加入域名和和节点ip就能访问到我们的项目了。

来源:Kubernetes运维之部署主流JAVA应用

  • 升职加薪必备!运维工程师打怪升级进阶成神之路
  • 我没有开挂的人生!自律和坚持,是我走IT之路的唯一捷径
  • 全网最新、最全Linux面试题(2020版)!
  • 史上最全、最新的Redis面试题(2020最新版)!
  • 赞!7000 字学习笔记,MySQL 从入门到放弃

如有错误或其它问题,欢迎小伙伴留言评论、指正。如有帮助,欢迎点赞+转发分享。

更多相关开源技术文章,请持续关注民工哥知乎技术专栏。

我是民工哥,一个爱折腾的IT技术老司机,欢迎关注我,我们一起学习,共同成长!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++从入门到精通_资料下载:从入门到精通,手把手教你学DSP

学习一个东西首先是了解它&#xff0c;比如DSP到底是什么&#xff1f;用在什么地方&#xff1f;怎么用&#xff1f;和单片机特点有那些相同与不同&#xff1f;开发需要注意什么&#xff1f;想了解清楚这些问题自然就清楚比较清楚的认识DSP。DSP&#xff0c;因为它是用来做数据处…

php mysql存中文,PHP+MySQL存储数据常见中文乱码问题小结

PHPMySQL存储数据常见中文乱码问题小结本文实例总结了PHPMySQL存储数据常见中文乱码问题。分享给大家供大家参考&#xff0c;具体如下&#xff1a;PHPMySQL出现中文乱码的常见原因:1. MYSQL数据库的编码是utf8,与PHP网页的编码格式不一致,就会造成MYSQL中的中文乱码。2. 使用MY…

dbf文件怎么创建_ThinkPHP6开发博客实战入门(三),创建admin后台入口

打开创建的应用根目录&#xff1a;E:phpstudy_proWWWp(注意&#xff0c;往后我所说的根目录就是此路径)简单说一下tp6的目录结构app应用目录主要存放控制器文件&#xff1b;config配置目录主要存放全局配置文件&#xff1b;public入口目录主要存放入口或者资源文件&#xff1b;…

没有返回值的方法mock怎么写_【方法】小学生怎么写读书笔记?

什么是读书笔记读书笔记&#xff0c;是指人们在阅读书籍或文章时&#xff0c;遇到值得记录的东西和自己的心得、体会&#xff0c;随时随地把它写下来的一种文体。古人有条著名的读书治学经验&#xff0c;叫做读书要做到&#xff1a;眼到、口到、心到、手到。这“手到”就是读书…

php e error,E_ERROR定义与用法汇总

前言最近由于项目需要&#xff0c;需要读取一个含有中文的txt文档&#xff0c;完了还要保存文件。文档之前是由base64编码&#xff0c;导致所有汉字读取显示乱码。项目组把base64废弃之后&#xff0c;先后出现两个错误&#xff1a;ascii codec cant encode characters in posit…

delphi中的函数传参如何传枚举参数_我是这样使用SpringBoot(API传参)

spring boot 传参spring boot 中的Controller或者RestController接收参数的方法是一样的。这章目标是对几种常用的传参都写个例子。创建package: com.biboheart.demos.api&#xff0c;这个包里放置API接口的RestController在com.biboheart.demos.api包中创建一个class: ParamCo…

ssh-copy-id命令不存在_Redis(三)- 常见命令

步骤1:5种数据类型步骤2:String 字符串步骤3:List 列表步骤4:Hash 字典&#xff0c;哈希表步骤5:Set 集合步骤6:Sorted Set 有序集合步骤7:官方命令手册步骤 1 : 5种数据类型Redis目前有5种数据类型&#xff0c;分别是&#xff1a;String&#xff08;字符串&#xff09;List&am…

matlab中极大似然估计法的应用程序,matlab用fmincon函数求极大似然估计

%l1_s分别是不同实验条件下的数据&#xff0c;下面的函数为极大既然函数的负值&#xff0c;先用fmincon求解&#xff0c;运行出错了。function [l1_s,l2_s,l3_s,l4_s,l5_s,l6_s] readandevaluate(filename)global l1_s l2_s l3_s l4_s l5_s l6_s;filename li_s.xlsx;l1_s xl…

python 字符串替换_学完Python打算出去找工作,怕找不到?看完这篇你可以提高通过率...

面试题目一&#xff1a;Python是如何进行类型转换的&#xff1f;1 函数 描述 2 int(x [,base ]) 将x转换为一个整数 3 long(x [,base ]) 将x转换为一个长整数 4 float(x ) 将x转换到一个浮点数 5 complex(real [,imag ]) 创建一个复数 6 str(x ) 将对象 x 转换为字符串 7 repr(…

matlab bmp hsi,matlab中RGB与HSI图像转化

姓名&#xff1a;边颖超学号&#xff1a;19021210974编程实现RGB与HSI彩色空间的转换&#xff0c;将一幅彩色图像分解为H、S、I三个分量&#xff0c;并显示这三个分量所对应的灰度图像。(1)利用imread函数读入灰度图片hurricane&#xff0c;并命名为Original Imagel&#xff1b…

vue.js php,vue.js去哪下载

vue.js可以去vue官网下载&#xff0c;其下载链接为“vuejs.org/v2/guide/installation.html”&#xff0c;然后用“本教程操作环境&#xff1a;Windows7系统、vue2.5.16版&#xff0c;该方法适用于所有品牌电脑。 vue.js下载及安装的三种方法 要下载安装vue首先得下载安装node.…

bootstrap table无法服务器分页_[精选] MySQL百万数据,你如何用分页来查询数据

文章来自&#xff1a;https://www.cnblogs.com/lxwphp/p/9237331.html商务合作: 请加微信 2230304070精选文章正文在开发过程中我们经常会使用分页&#xff0c;核心技术是使用limit进行数据的读取&#xff0c;在使用limit进行分页的测试过程中&#xff0c;得到以下数据&#xf…

excel的mysql语言,Mysql中文乱码及导出sql语句和Excel的相关解决方法

这几天基于Heritrix写了一个爬虫&#xff0c;用到mysql&#xff0c;在导入导出数据时&#xff0c;遇到一些乱码问题&#xff0c;好不容易解决了&#xff0c;记录一下&#xff0c;以备查看。一、导出数据。先说明一下自己的环境&#xff1a;Mac OS X 10.8.3, MySQL Community Se…

conda pip安装在哪里_Python环境篇-Minicondaamp;Pip使用汇总

一、下载推荐miniconda&#xff0c;很方面管理python多版本环境&#xff0c;比Anaconda轻量。选择合适的版本&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/或者Linux上直接执行&#xff1a;wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/minic…

jquery 循环_jquery实现无限循环滚动

复制下面代码查看效果原文链接&#xff1a;https://blog.csdn.net/qq_45378970/article/details/108903054?utm_mediumdistribute.pc_category.none-task-blog-hot-4.nonecase&depth_1-utm_sourcedistribute.pc_category.none-task-blog-hot-4.nonecase&request_id作者…

delphi7 获取dll的类_跟我学Java内存管理----JMM精华终章(类加载器)

1 类加载器1.1 类的加载过程当程序要使用某个类时&#xff0c;如果该类还未被加载到内存中&#xff0c;则系统会通过加载&#xff0c;连接&#xff0c;初始化三步来实现对这个类进行初始化。(1)加载就是指将class文件读入内存&#xff0c;并为之创建一个Class对象。任何类被使用…

huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码

艾薇巴蒂&#xff01;许久不见甚是想念&#xff0c;想必这”涨姿势”的时刻大家已经期待许久了&#xff01;今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码构造哈夫曼树首先&#xff0c;我们需要了解哈夫曼树是什么&#xff1a;相关知识点路径&#xff1a; 路径是指从一个…

推荐系统相关科技论文写作建议

如何写标题 1、用一句话概括你所做的工作&#xff1b; 2、字数忌长&#xff08;尽可能不要超过20单词&#xff0c;40-60 字符比较合适&#xff09;&#xff1b; 3、考虑搜索引擎的影响&#xff0c;包含关键词。 4、例子 例子1&#xff1a;Enhancing slope one recommendation…

睡眠音频分割及识别问题(一)

问题描述 通过手机App的录音功能&#xff0c;获得用户一整夜的睡眠音频&#xff0c;对睡眠音频进行分割&#xff0c;并对睡眠阶段进行判定。 &#xff08;1&#xff09;假设条件一&#xff1a;用户在相对安静的环境下进行睡眠&#xff0c;背景音可能会出现风声、雨声、汽车噪音…

睡眠音频分割及识别问题(四)--YAMNet简介

简介 YAMNet模型是在 AudioSet 数据集&#xff08;一个大型音频、视频数据集&#xff09;上训练的音频事件分类器。 模型输入 该模型接收包含任意长度波形的float32一维张量或 NumPy数组&#xff0c;且满足范围[-1.0, 1.0]内的单声道16kHz样本。在内部&#xff0c;该算法将波…