是如何将项目迁移到k8s平台上的吗?创建镜像控制器,管理PodPod数据持久化将应用对外暴露发布应用日志/监控1.制作镜像分为三步。第一步,基础镜像,基于什么操作系统,比如Centos7或者其他第二步中间件镜像,比如服务镜像,运行像nginx服务,tomcat服务第三??步项目镜像,在服务之上image,将你的项目打包进去,那么这个项目就可以运行在你的服务镜像中。一般运维人员会提前准备好镜像,开发者可以直接使用这个镜像。此镜像必须符合当前环境部署。的环境。2、controller管理pod,也就是k8s来部署这个image。一般我们会使用controller来部署,用的最多的就是deploymentDeployment:无状态部署StatefulSet:有状态部署DaemonSet:守护进程部署Job&CronJob:批处理处理stateless和stateful有什么区别?有状态的具有身份,例如网络ID和存储。这两个都是提前计划好的,有条不紊地启动/停止。持久化与非持久化3.Pod数据持久化Pod数据持久化主要是针对一个应用程序说的,比如开发一个项目,该项目是否已经在本地文件中实现,如果已经实现,则保证长期存在,则必须使用pod数据的持久化。容器部署过程中一般存在三种数据:启动时需要的初始数据,可以是配置文件启动过程中产生的临时数据,需要在多个容器之间共享的临时数据。启动过程中产生的持久化数据4.Exposure应用在k8s中,部署一个deployment,外部无法访问,也就是其他应用要访问这个部署的deployment,找不到访问的方法。为什么这么说呢,因为deployment一般都是多副本部署,可能分布在不同的节点上,而且podip重建的时候也会变,重新release后也会变,所以没办法修复它访问哪个pod,即使修复了,其他pod也访问不了。如果要为多个Pod提供服务,则必须添加负载均衡器并提供访问入口。只有访问这个统一的入口,才能转发给后端的多个pod。您只需要访问此集群IP。转发到后端pod。ServiceService定义了Pod的逻辑集合以及访问这个集合的策略。引入Service解决Pod的动态变化,提供服务发现和负载均衡,使用CoreDNS解析Service名称,比如搭建一个电商网站供用户访问,ingress是service的补充状态,互相弥补,service主要提供对集群的访问,也可以暴露一个TCP/UDP端口,而ingress是主要是一个7层转发,就是提供一个统一的入口,只要你访问ingresscontroller,它就可以帮你转发你部署的所有项目,也就是所有的项目都是用域名访问的。首先,开发人员将代码部署到您的代码仓库。Git或者gitlab是主流的。提交代码后,需要通过CI/CD平台拉取、编译、构建代码,生成War包,然后交给Ansible。发送到云主机/物理机,然后通过负载均衡暴露项目,然后会有数据库,监控系统,日志系统提供相关服务。首先开发就是把代码放到代码仓库,然后用jenkins拉取代码,编译,上传到我们的镜像仓库。这里是把代码打包成镜像,不是可执行的war或者jar包。这个镜像包含了你项目的运行环境和项目代码。这个镜像可以放在任何docker上运行,可以访问。首先要保证可以部署在docker上,然后部署在k8s上,创建的镜像会放在镜像仓库中,统一管理这些镜像。因为每天都会产生几十上百个镜像,所以必须通过镜像仓库进行管理。这里可能会写一个脚本连接k8smaster,k8s会根据自己的部署调度这些pod,然后通过ingress发布我们的应用让用户访问。每个Ingress都会关联一组Pod,服务会为这组Pod创建一个负载均衡器,并使用服务来区分这些节点上的Pod。然后数据库放在集群外,监控系统日志系统也可以放在k8s集群里部署,也可以放在外面。我们放在k8s集群里面,不是特别敏感。主要用于运维。用于开发调试,不会影响我们的业务,所以我们优先部署在k8s中。现在给我们的k8s部署一个JAVA项目1.安装一个openjdk[root@k8s-master~]#yum-yinstalljava-1.8.0-openjdk.x86_64maven[root@k8s-master~]#java-versionopenjdkversion"1.8.0_222》OpenJDKRuntimeEnvironment(build1.8.0_222-b10)OpenJDK64-BitServerVM(build25.222-b10,mixedmode)然后我们把代码pull到本地通用的Dockerfile中,把我们的代码放在同一个目录下,[root@k8s-mastertomcat-java-demo-master]#lsdbDockerfileLICENSEpom.xmlREADME.mdsrc[root@k8s-mastertomcat-java-demo-master]#vimDockerfileFROMlizhenliang/tomcatLABELmaintainerzhaochengchengRUNrm-rf/usr/local/tomcat/webapps/*ADDtarget/*.war/usr/local/tomcat/webapps/ROOT.war2.编译这里需要配置国内的maven源,这样会快一点[root@k8s-masterCI]#vim/etc/maven/settings.xmlcentralcentralaliyunmavenhttps://maven.aliyun.com/repository/public[root@k8s-mastertomcat-java-demo-master]#mvncleanpackage-Dmaventest.skip=true[root@k8s-mastertomcat-java-demo-master]#lsdbDockerfileLICENSEpom.xmlREADME.mdsrctarget[root@k8s-mastertomcat-java-demo-master]#cdtarget/[root@k8s-mastertarget]#lsclassesgenerated-sourcesly-simple-tomcat-0.0.1-SNAPSHOTly-simple-tomcat-0.0.1-SNAPSHOT.warmaven-archivermaven-status[root@k8s-mastertomcat-java-demo-master]#cdtarget/我们将使用这个编译好的war包,然后制作镜像上传到我们的Harbor仓库[root@k8s-mastertarget]#lsclassesly-simple-tomcat-0.0.1-SNAPSHOTmaven-archivergenerated-sourcesly-simple-tomcat-0.0.1-SNAPSHOT.warmaven-status[root@k8s-mastertomcat-java-demo-master]#dockerbuild-t192.168.30.24/library/java-demo:latest。3.上传到镜像仓库[root@k8s-mastertomcat-java-demo-master]#dockerlogin192.168.30.24用户名:admin密码:守护进程的错误响应:获取https://192.168.30.24/v2/:dialtcp192.168.30.24:443:connect:connectionrefused这里报错,其实我们需要在每个docker里面写只需要信任港口仓库。[root@k8s-masterjava-demo]#vim/etc/docker/daemon.json{"registry-mirrors":["http://f1361db2.m.daocloud.io"],"insecure-registries":["192.168.30.24"]}然后记录推送。[root@k8s-mastertomcat-java-demo-master]#dockerpush192.168.30.24/library/java-demo:latest四、controller管理pod写deployment,一般project写在customnamespace里,name写项目名,好记,name:tomcat-java-demonamespace:test和下一个项目名,这里分为多个组件,一般由很多组件组成,所以可以写成的名字下面的app,比如component1,2,3,至少label有这两个维度project:wwwapp:java-demo另外就是Pull镜像,从哪个仓库下载,这里我建议镜像仓库的项目名和我们定义的一致,以免混淆我重新标记并上传到我们的私有镜像仓库[root@k8s-masterjava-demo]#dockertag192.168.30.24/library/java-demo192.168.30.24/tomcat-java-demo/java-demo[root@k8s-masterjava-demo]#dockerpush192.168.30.24/tomcat-java-demo/java-demo:latestimageaddress也改地址imagePullSecrets:-name:registry-pull-secretcontainers:-name:tomcatimage:192.168.30.24/tomcat-java-demo/java-demo:latest现在开始创建yaml创建项目命名空间[root@k8s-masterjava-demo]#vimnamespace.yamlapiVersion:v1kind:Namespacemetadata:name:test[root@k8s-masterjava-demo]#kubectlcreate-fnamespace.yamlnamespace/testcreated[root@k8s-masterjava-demo]#kubectlgetnsNAMESTATUSAGEdefaultActive22hkube-node-leaseActive22hkube-publicActive22hkube-systemActive22htestActive5s创建一个secret来保证我们harbor镜像仓库的认证信息。这里我们必须写我们项目的命名空间。[root@k8s-masterjava-demo]#kubectlcreatesecretdocker-registryregistry-pull-secret--docker-username=admin--docker-password=Harbor12345--docker-email=111@qq.com--docker-server=192.168.30.24-ntestsecret/registry-pull-secretcreated[root@k8s-masterjava-demo]#kubectlgetnsNAMESTATUSAGEdefault活动23hkube-node-lease活动23hkube-public活动23hkube-systemActive23htestActive6m39s[root@k8s-masterjava-demo]#kubectlgetsecretNAMETYPEDATAAGEdefault-token-2vtgmkubernetes.io/service-account-token323hregistry-pull-secretkubernetes.io/dockerconfigjson146s[root@k8s-masterjava-demo]#vimdeployment.yamlapiVersion:apps/v1beta1kind:Deploymentmetadata:name:tomcat-java-demonamespace:testspec:replicas:3selector:matchLabels:project:wwwapp:java-demotemplate:metadata:labels:project:wwwapp:java-demospec:imagePullSecrets:-name:registry-pull-secret包含ers:-名称:tomcat图像:192.168.30.24/tomcat-java-demo/java-demo:最新的imagePullPolicy:始终端口:-containerPort:8080名称:网络协议:TCP资源:请求:cpu:0.5内存:1Gi限制:cpu:1内存:2GilivenessProbe:httpGet:path:/port:8080initialDelaySeconds:60timeoutSeconds:20readinessProbe:httpGet:path:/port:8080initialDelaySeconds:60timeoutSeconds:20[root@k8s-masterjava-demo]#kubectlgetpod-ntestNAMEREADYSTATUSRESTARTSAGEtomcat-java-demo-6d798c6996-fjjvk1/1运行02m58stomcat-java-demo-6d798c6996-lbklf1/1运行02m58stomcat-java-demo-6d798c6996-strth/1Running02m58s另外暴露了一个Service,这里的tags必须一致,否则找不到对应的tag就无法提供服务。这里我们使用ingress访问release应用,直接使用ClusterIP[root@k8s-masterjava-demo]#vimservice.yamlapiVersion:v1kind:Servicemetadata:name:tomcat-java-demonamespace:testspec:选择器:项目:wwwapp:java-demo端口:-名称:webport:80targetPort:8080[root@k8s-masterjava-demo]#kubectlgetpod,svc-ntestNAMEREADYSTATUSRESTARTSAGEpod/tomcat-java-demo-6d798c6996-fjjvk1/1运行037mpod/tomcat-java-demo-6d798c6996-lbklf1/1运行037mpod/tomcat-java-demo-6d798c6996-strth1/1运行037m名称类型集群-IP外部IP端口(S)年龄服务/tomcat-java-demoClusterIP10.1.175.19180/TCP19s测试访问我们的项目,是可以的,现在可以发布通过ingress测试访问我们的项目,现在需要通过ingress[root发布@k8s-masterjava-demo]#curl10.1.175.191美颜到家应用案例现在部署一个ingress-nginxcontroller,网上可以找到,官方的也有。我是按照DaemonSet的方式部署的,所以每个节点都会跑一个controller[root@k8s-masterjava-demo]#kubectlgetpod-ningress-nginxNAMEREADYSTATUSRESTARTSAGEnginex-ingress-controller-g95pp1/1Running03m6snginx-ingress-controller-wq6l61/1Running03m6sreleaseapplicationhere注意两点,第一是网站的域名,第二是服务的命名空间。[root@k8s-masterjava-demo]#kubectlgetpod,svc-ntestNAMEREADYSTATUSRESTARTSAGEpod/tomcat-java-demo-6d798c6996-fjjvk1/1Running053mpod/tomcat-java-demo-6d798c6996-lbklf1/1运行053mpod/tomcat-java-demo-6d798c6996-strth1/1运行053m名称类型CLUSTER-IP外部IP端口(S)AGE服务/tomcat-java-demoClusterIP10.1.175.191<无>80/TCP16m[root@k8s-masterjava-demo]#vimservice.yaml[root@k8s-masterjava-demo]#kubectlcreate-fingress.yamlapiVersion:extensions/v1beta1kind:Ingressmetadata:name:tomcat-java-demonamespace:testspec:rules:-host:java.maidikebi.comhttp:paths:-path:/backend:serviceName:tomcat-java-demoservicePort:80另外我这里测试的,所以绑定我本地的hosts进行访问,在hosts文件中添加域名和节点ip即可访问我们的项目。