1。使用yaml文件创建资源对象每种资源的apiVersion和kind可通过kubectlapiresources命令进行查看 tantianrantestbk8smaster:kubectlapiresourcesgrepDeploymentdeploymentsdeployappsv1trueDeploymenttantianrantestbk8smaster: gowebdemo。yamlapiVersion:v1kind:Namespacemetadata:name:testaapiVersion:appsv1kind:Deploymentmetadata:name:gowebdemonamespace:testaspec:replicas:10selector:matchLabels:app:gowebdemotemplate:metadata:labels:app:gowebdemospec:containers:name:gowebdemoimage:192。168。11。247webdemogowebdemo:20221229v3apiVersion:v1kind:Servicemetadata:name:gowebdemonamespace:testaspec:ports:port:80protocol:TCPtargetPort:8090selector:app:gowebdemotype:NodePort关于标签的主要作用:标记、过滤、关联(主要体现在deployment、pod、service,3者标签保持一致),可设定多个标签,建议设定至少2个标签,一个为项目标签,一个为应用标签。 关于创建、更新和删除的命令只用于创建kubectlcreatefxxx。yaml创建和更新(需要yaml文件里的字段支持更新,并不是所有字段都支持更新)kubectlapplyfxxx。yaml卸载kubectldeletefxxx。yaml2。编写yaml的套路分享套路1:可以直接手写,但容易出错套路2:参考官方示例,然后改成自己的套路3:通过命令行来获取,也是有2个方式,一是利用尝试运行(dryrun)的机制再配合o来输出一个yaml文件),二是通过get来得到yaml文件,得到yaml文件后再自行修改 下面演示通过create来得到yaml在kubectl级别上进行验证kubectlcreatedeploymentweb1imagenginxreplicas5dryrunclient指的是提交到apiserver进行验证kubectlcreatedeploymentweb1imagenginxreplicas5dryrunserver下面来一个deployment的例子,得到其他资源的yaml也是这个套路tantianrantestbk8smaster:kubectlcreatedeploymentweb1imagenginxreplicas5dryrunclientoyamlapiVersion:appsv1kind:Deploymentmetadata:creationTimestamp:nulllabels:app:web1name:web1spec:replicas:5selector:matchLabels:app:web1strategy:{}template:metadata:creationTimestamp:nulllabels:app:web1spec:containers:image:nginxname:nginxresources:{}status:{}还可以配合重定向输出到yaml文件kubectlcreatedeploymentweb1imagenginxreplicas5dryrunclientoyamltest。yaml 下面演示通过get命令来得到yaml文件,使用o来指定yaml的格式输出,其他资源也是这个套路kubectlgetpodsntestaoyaml 编写yaml的时候,字段名太多记不住或者想不起来怎么办?可以使用explain来查看字段层级找第一级kubectlexplaindeployment找第二级kubectlexplaindeployment。spec再比如查pod相关的kubectlexplainpods。spec。containers3。应用生命周期管理deployment是最常用的k8s工作负载控制器(WorkloadControllers),是k8s的一个抽象概念,用于更高级层次对象,部署和管理Pod,卡控制器还有DaemonSet、StatefulSet等。 3。1Deployment Deployment主要功能:管理Pod和ReplicaSet具有上线部署、副本设定、滚动升级、回滚等功能 Deployment应用场景:网站、API、微服务 Pod与控制器的关系图: 应用生命周期管理流程: 3。2应用部署的基本流程部署升级回滚删除 3。2。1部署推荐的方式kubectlapplyfxxx。yaml或者kubectlcreatedeploymentwebimagenginxreplicas3 在本示例中,部署的是我自己使用go语言写的一个很简单的webdemo 访问一下看看 3。2。2升级所谓的升级,其实就是更新镜像,且有3种方式,自动触发滚动升级 方式1:直接修改yaml文件中的镜像,然后applykubectlapplyfxxx。yaml方式2:使用命令设置deployment使用的镜像kubectlsetimagedeploymentwebnginxnginx1。17使用系统编辑器打开进行编辑kubectleditdeployment 发布方式有3种:滚动发布、蓝绿发布、灰度发布(金丝雀、AB测试、冒烟测试。灰度发布是最复杂的方式,发布的方式是为了避免上线后出现的问题。) K8S默认是滚动升级:滚动发布是指每次只升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程,直到集群中的全部旧版本升级新版本。 滚动升级在k8s中的实现:它是通过1个Deployment和2个ReplicaSet来实现的,滚动更新一次只升级一小部分pod,成功后,再升级一部分pod,最终完成所有Pod升级,整个过程始终有Pod在运行,从而保证了业务的连续性。 ReplicaSet:副本集,主要维护Pod副本数量,不断对比当前Pod数量于期望Pod数量。ReplicaSet用途:Deployment每次发布都会创建一个RS(ReplicaSet的缩写)作为记录,用于实现滚动升级和回滚 可以查看deployment的详情,详情里其实是记录了升级的过程kubectlgetdeploymentntestakubectldescribedeploymentgowebdemontesta 查看ReplicaSet(RS)记录(初次的部署和后续升级都会新创建一个RS,升级多少次就会创建多少个)tantianrantestbk8smaster:kubectlgetrsntestaNAMEDESIREDCURRENTREADYAGEgowebdemo6fbb74fdbb00041mgowebdemo7b6649f78920202032m此处DESIRED和CURRENT以及READY字段有值的话,表示是当前正在使用的RSgowebdemo866579659900024h查看正在使用的RS的详情kubectldescribersgowebdemo7b6649f789ntesta注意:升级后,旧的RS会被保留,主要用于后面回滚使用,且每次只能有一个RS在使用。 当新版的镜像已经做好需要滚动更新的时候,那就要修改deployment中指定的镜像,修改的方式有2种:使用命令和直接修改yaml文件方式1:使用命令命令格式kubectlsetimagedeploymentDeploymentNameContainerNameImagenNamespace例子step1:获取deploymentkubectlgetdeploymentntestastep2:查看deployment详情kubectldescribedeploymentgowebdemontesta。。。PodTemplate:Labels:appgowebdemoContainers:gowebdemo:容器名字Image:192。168。11。247webdemogowebdemo:20221229v3镜像Port:noneHostPort:noneEnvironment:noneMounts:noneVolumes:none。。。step3:设置deployment的镜像kubectlsetimagedeploymentgowebdemogowebdemo192。168。11。247webdemogowebdemo:20221229v3ntesta 方式2:直接修改yaml(推荐)apiVersion:appsv1kind:Deploymentmetadata:name:gowebdemodeployment名称namespace:testaspec:replicas:50副本selector:matchLabels:app:gowebdemotemplate:metadata:labels:app:gowebdemospec:containers:name:gowebdemoimage:192。168。11。247webdemogowebdemo:20221229v3镜像 水平扩缩容,也就是修改副本的数量,也有2种方式,命令和修改yaml文件方式1:命令kubectlscaledeploymentgowebdemoreplicas5ntesta 方式2:修改yaml文件中的replicas参数,再applyapiVersion:appsv1kind:Deploymentmetadata:name:gowebdemonamespace:testaspec:replicas:5修改副本数量。。。。。。3。2。3回滚当应用发布失败,需要回滚时。 查看发过有哪些版本查看历史kubectlrollouthistorydeploymentntestadeployment。appsgowebdemoREVISIONCHANGECAUSE4none6none8none9none通过命令修改deployment的镜像进行升级时,后面加record参数,再查看历史后就会记录这条命令kubectlsetimagedeploymentgowebdemogowebdemo192。168。11。247webdemogowebdemo:20221229v2ntestarecordFlagrecordhasbeendeprecated,recordwillberemovedinthefuturedeployment。appsgowebdemoimageupdated上面加了record参数,再查看历史,可以看到记录的这条命令kubectlrollouthistorydeploymentntestadeployment。appsgowebdemoREVISIONCHANGECAUSE4none6none9none10kubectlsetimagedeploymentgowebdemogowebdemo192。168。11。247webdemogowebdemo:20221229v2namespacetestarecordtrue就是这里 查看版本号和RS的对应关系,以及和镜像的对应关系查看RStantianrantestbk8smaster:kubectlgetrsntestaNAMEDESIREDCURRENTREADYAGEgowebdemo6fbb74fdbb0005h15mgowebdemo7b6649f7890005h6mgowebdemo866579659900029hgowebdemob988694565554h22m当前使用的RS查看当前使用的RS详情tantianrantestbk8smaster:kubectldescribersgowebdemob98869456ntesta。。。Annotations:deployment。kubernetes。iodesiredreplicas:5deployment。kubernetes。iomaxreplicas:7deployment。kubernetes。iorevision:11这个11就是当前版本号deployment。kubernetes。iorevisionhistory:7,9历史版本kubernetes。iochangecause:kubectlsetimagedeploymentgowebdemogowebdemo192。168。11。247webdemogowebdemo:20221229v3namespacetestarecordtrueControlledBy:DeploymentgowebdemoReplicas:5current5desiredPodsStatus:5Running0Waiting0Succeeded0FailedPodTemplate:Labels:appgowebdemopodtemplatehashb98869456Containers:gowebdemo:Image:192。168。11。247webdemogowebdemo:20221229v3使用的镜像Port:noneHostPort:none。。。查看历史版本tantianrantestbk8smaster:kubectlrollouthistorydeploymentntestadeployment。appsgowebdemoREVISIONCHANGECAUSE4none6none10kubectlsetimagedeploymentgowebdemogowebdemo192。168。11。247webdemogowebdemo:20221229v2namespacetestarecordtrue11kubectlsetimagedeploymentgowebdemogowebdemo192。168。11。247webdemogowebdemo:20221229v3namespacetestarecordtrue这个REVISION是11 通过过滤来获取到发布版本和对应的镜像过滤revision和Imagetantianrantestbk8smaster:kubectldescribe(kubectlgetrsonamentestagrepgoweb)ntestagrepErevision:Image:deployment。kubernetes。iorevision:4Image:192。168。11。247webdemogowebdemo:20221229v1deployment。kubernetes。iorevision:10Image:192。168。11。247webdemogowebdemo:20221229v2deployment。kubernetes。iorevision:6Image:192。168。11。247webdemogowebdemo:20221228v1deployment。kubernetes。iorevision:11Image:192。168。11。247webdemogowebdemo:20221229v3tantianrantestbk8smaster:过滤更详细的,过滤revision、Image、Name、Replicastantianrantestbk8smaster:kubectldescribe(kubectlgetrsonamentestagrepgoweb)ntestagrepErevision:Image:Name:Replicas:Name:gowebdemo6fbb74fdbbdeployment。kubernetes。iorevision:4Replicas:0current0desiredImage:192。168。11。247webdemogowebdemo:20221229v1Name:gowebdemo7b6649f789deployment。kubernetes。iorevision:10Replicas:0current0desiredImage:192。168。11。247webdemogowebdemo:20221229v2Name:gowebdemo8665796599deployment。kubernetes。iorevision:6Replicas:0current0desiredImage:192。168。11。247webdemogowebdemo:20221228v1Name:gowebdemob98869456deployment。kubernetes。iorevision:11Replicas:5current5desiredImage:192。168。11。247webdemogowebdemo:20221229v3 只回滚到上一个版本tantianrantestbk8smaster:kubectlrolloutundodeploymentgowebdemontestadeployment。appsgowebdemorolledback 回滚到指定的历史版本查看当前正在使用哪个版本tantianrantestbk8smaster:kubectldescribe(kubectlgetrsonamentestagrepgoweb)ntestagrepErevision:Replicas:deployment。kubernetes。iorevision:4Replicas:0current0desireddeployment。kubernetes。iorevision:14当前正在使用的版本,版本号14,且副本是5Replicas:5current5desired副本数量deployment。kubernetes。iorevision:6Replicas:0current0desireddeployment。kubernetes。iorevision:13Replicas:0current0desired假设要回滚到最初的版本,也就是版本号是4tantianrantestbk8smaster:kubectlrolloutundodeploymentgowebdemotorevision4ntestadeployment。appsgowebdemorolledbacktantianrantestbk8smaster:3。2。4删除(当项目需要下线时)如果该项目是直接编写yaml的,可这样删除(下线)kubectldeletefgowebdemo。yaml如果该项目的命名空间、deployment、service是用命令的,那就需要手动删除下线kubectldeletedeploymentgowebdemontestakubectldeletesvcgowebdemontestakubectldeletenstesta最后如需要go开发的webdemo源码的朋友可私信我,一起交流,感谢! 本文转载于(喜欢的盆友关注我们):https:mp。weixin。qq。comsjBJTLYvXkCtdyO4Ap9UA