织梦网站模板官网,南京建设网站制作,wordpress 模板 导航栏,短视频排名seo将项目迁移到k8s平台是怎样实现的?制作镜像控制器管理PodPod数据持久化暴露应用对外发布应用日志/监控1、制作镜像分为三步第一基础镜像#xff0c;是基于哪个操作系统#xff0c;比如Centos7或者其他的第二步中间件镜像#xff0c;比如服务镜像#xff0c;跑的像nginx服务…将项目迁移到k8s平台是怎样实现的?制作镜像控制器管理PodPod数据持久化暴露应用对外发布应用日志/监控1、制作镜像分为三步第一基础镜像是基于哪个操作系统比如Centos7或者其他的第二步中间件镜像比如服务镜像跑的像nginx服务tomcat服务第三步项目镜像它是服务镜像之上的将你的项目打包进去那么这个项目就能在你这个服务镜像里面运行了一般运维人员都是提前将镜像做好而开发人员就能直接拿这个镜像去用这个镜像一定要符合现在环境部署的环境。2、控制器管理 pod也就是k8s去部署这个镜像了一般我们都会去拿控制器去部署用的最多的就是 deploymentDeployment无状态部署StatefulSet有状态部署DaemonSet守护进程部署Job CronJob批处理无状态和有状态的有什么区别有状态的是有身份的比如网络ID、存储、这个两个是提前规划好的有序启动/停止持久化与非持久化3、Pod 数据持久化pod数据持久化主要是因对一个应用程序说的比如开发一个项目这个项目有没有落地到本地文件如果有落的话就保证他持久的有了那就必须要用到pod数据的持久化了。容器部署过程中一般有以下三种数据启动时需要的初始数据可以是配置文件启动过程中产生的临时数据该临时数据需要多个容器间共享启动过程中产生的持久化数据4、暴露应用在 k8s中部署一个deployment它是无法对外进行访问的即其他应用程序要想访问部署的deployment它找不到该怎么去访问。为什么去这么讲因为deployment一般都是多副本的去部署有可能会分布在不同的节点之上而且重建 pod ip也会变重新发布一下也会变了所以没有办法去固定去访问哪个pod即使固定了其他的pod也访问不了。要想做到多个 pod 都去提供服务的话前面有必须要加一个负载均衡提供一个访问入口只有访问这个统一入口才能转发到后端多个pod上只要访问这个Cluster IP就能转发到后端的pod上。ServiceService 定义了 Pod 的逻辑集合和访问这个集合的策略Service 引入为了解决Pod的动态变化提供服务发现和负载均衡使用 CoreDNS 解析 Service 名称5、对外发布应用暴露出去之后呢也就是需要让用户去访问比如搭建一个电商网站让用户去访问ingress相对于service它是一个互补的状态弥补了各自service主要提供了集群内部的访问也可以暴露一个TCP/UDP的端口而ingress主要是一个7层的转发也就是提供一个统一的入口只要访问ingress controller它就能帮你转发你部署所有的项目也就是所有的项目都使用域名去访问。首先开发者将代码部署到你的代码仓库中主流的用的Git或者gitlab提交完代码通过CI/CD平台需要对代码进行拉取、编译、构建产生一个War包然后交给Ansible然后发送到云主机上/物理机,然后通过负载均衡将项目暴露出去然后会有数据库监控系统日志系统来提供相关的服务。首先也是开发将代码放在代码仓库然后通过jenkins去完成拉取代码编译上传到我们的镜像仓库。这里是将代码打包成一个镜像而不是可以执行的war或者jar包这个镜像包含了你的项目的运行环境和项目代码这个镜像可以放在任何docker上去run起来都可以去访问首先得保证能够在docker上去部署起来再部署到k8s上打出来的镜像去放在镜像仓库中来集中的去管理这些镜像。因为每天会产生几十个或者上百个镜像必须通过镜像仓库去管理这里可能会去写一个脚本去连接k8smaster而k8s会根据自己的部署去调度这些pod,然后通过ingress去发布我们的应用让用户去访问每个ingress会关联一组pod而service会创建这组pod的负载均衡通过service去区分这些节点上的Pod。然后数据库是放在集群之外监控系统日志系统也可以放在k8s集群放在去部署也可以放在之外我们是放在k8s集群内的也不是特别敏感主要用来运维和开发调试用的不会影响到我们的业务所以我们优先去k8s中去部署。现在以部署一个JAVA项目到我们的k8s中一、安装一个openjdk[rootk8s-master ~]# yum -y install java-1.8.0-openjdk.x86_64 maven
[rootk8s-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中跟我们的代码都放在同一目录下[rootk8s-master tomcat-java-demo-master]# ls
db Dockerfile LICENSE pom.xml README.md src
[rootk8s-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的国内源这样的话就比较快一点[rootk8s-master CI]# vim /etc/maven/settings.xml
mirror idcentral/id mirrorOfcentral/mirrorOf namealiyun maven/name urlhttps://maven.aliyun.com/repository/public/url /mirror
/mirrors
[rootk8s-master tomcat-java-demo-master]# mvn clean package -D maven test.skiptrue
[rootk8s-master tomcat-java-demo-master]# ls
db Dockerfile LICENSE pom.xml README.md src target
[rootk8s-master tomcat-java-demo-master]# cd target/
[rootk8s-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
[rootk8s-master tomcat-java-demo-master]# cd target/我们就使用这个编译好的war包,然后打成镜像上传到我们的Harbor仓库里[rootk8s-master target]# ls
classes ly-simple-tomcat-0.0.1-SNAPSHOT maven-archivergenerated-sources
ly-simple-tomcat-0.0.1-SNAPSHOT.war maven-status[rootk8s-master tomcat-java-demo-master]# docker build -t 192.168.30.24/library/java-demo:latest .三、上传到镜像仓库[rootk8s-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仓库的信任才可以后面上传镜像也会用[rootk8s-master java-demo]# vim /etc/docker/daemon.json
{ registry-mirrors:[http://f1361db2.m.daocloud.io], insecure-registries: [192.168.30.24]}再等录一下push就可以了[rootk8s-master tomcat-java-demo-master]# docker push 192.168.30.24/library/java-demo:latest四、控制器管理pod编写deployment,一般项目都写到自定义的命名空间下名称写项目名称方便记忆name: tomcat-java-demonamespace: test另外就是下一个项目名称这里分为多个一般有很多的组件组成所以下面可以写个app的名称比如组件1、2、3起码标签有这两个维度project: wwwapp: java-demo另外就是镜像拉取在哪个仓库去下载这里我建议镜像仓库的项目名称和我们定义的是一种避免混了。我重新打个标签并传到我们的私有镜像仓库中[rootk8s-master java-demo]# docker tag 192.168.30.24/library/java-demo 192.168.30.24/tomcat-java-demo/java-demo[rootk8s-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创建项目的命名空间[rootk8s-master java-demo]# vim namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test [rootk8s-master java-demo]# kubectl create -f namespace.yaml
namespace/test created
[rootk8s-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镜像仓库的认证信息这里一定要写上我们的项目的命名空间。[rootk8s-master java-demo]# kubectl create secret docker-registry registry-pull-secret --docker-usernameadmin --docker-passwordHarbor12345 --docker-email111qq.com --docker-server192.168.30.24 -n test
secret/registry-pull-secret created
[rootk8s-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
[rootk8s-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 [rootk8s-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 [rootk8s-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就可以[rootk8s-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 [rootk8s-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[rootk8s-master java-demo]# curl 10.1.175.191
!DOCTYPE html
html
head langen
meta charsetutf-8
meta http-equivX-UA-Compatible contentIEedge
title把美女带回家应用案例/title
meta namedescription content把美女带回家应用案例
meta namekeywords contentindex现在部署一个ingress-nginx的控制器这个网上都可以找到官方也有我这里是按DaemonSet的方式去部署的所以每个节点都会跑一个控制器。[rootk8s-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的命名空间。[rootk8s-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
[rootk8s-master java-demo]# vim service.yaml
[rootk8s-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技术老司机欢迎关注我我们一起学习共同成长