应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

超赞!使用argorollouts实现kubernetes上

  什么是argorollouts
  ArgoRollout是一个KubernetesController和对应一系列的CRD,提供更强大的Deployment能力。包括灰度发布、蓝绿部署、更新测试(experimentation)、渐进式交付(progressivedelivery)等特性。
  支持特性如下:蓝绿色更新策略金丝雀更新策略细粒度,加权流量转移自动回rollback和promotion手动判断可定制的指标查询和业务KPI分析入口控制器集成:NGINX,ALB服务网格集成:Istio,Linkerd,SMIMetricprovider集成:Prometheus,Wavefront,Kayenta,Web,KubernetesJobs
  Argo原理和Deployment差不多,只是加强rollout的策略和流量控制。当spec。template发送变化时,ArgoRollout就会根据spec。strategy进行rollout,通常会产生一个新的ReplicaSet,逐步scaledown之前的ReplicaSet的pod数量。安装
  按官方文档进行安装,官方地址为:https:argoproj。github。ioargorolloutsinstallationkubectlplugininstallation
  (1)在Kubernetes集群中安装argorolloutskubectlcreatenamespaceargorolloutskubectlapplynargorolloutsfhttps:raw。githubusercontent。comargoprojargorolloutsstablemanifestsinstall。yaml
  (2)安装argorollouts的kubectlplugincurlLOhttps:github。comargoprojargorolloutsreleaseslatestdownloadkubectlargorolloutslinuxamd64chmodx。kubectlargorolloutslinuxamd64mv。kubectlargorolloutslinuxamd64usrlocalbinkubectlargorollouts金丝雀发布
  金丝雀发布包含ReplicaShifting和TrafficShifting两个过程。ReplicaShifting:版本替换TrafficShifting:流量接入
  这里使用官方的demo来进行测试。例子:https:argoproj。github。ioargorolloutsgettingstartedReplicaShifting部署应用
  使用如下命令部署示例:kubectlapplyfhttps:raw。githubusercontent。comargoprojargorolloutsmasterdocsgettingstartedbasicrollout。yamlkubectlapplyfhttps:raw。githubusercontent。comargoprojargorolloutsmasterdocsgettingstartedbasicservice。yaml
  我们先看看第一个rollout。yaml的具体内容,如下:apiVersion:argoproj。iov1alpha1kind:Rolloutmetadata:name:rolloutsdemospec:replicas:5strategy:canary:steps:setWeight:20pause:{}setWeight:40pause:{duration:10}setWeight:60pause:{duration:10}setWeight:80pause:{duration:10}revisionHistoryLimit:2selector:matchLabels:app:rolloutsdemotemplate:metadata:labels:app:rolloutsdemospec:containers:name:rolloutsdemoimage:argoprojrolloutsdemo:blueports:name:httpcontainerPort:8080protocol:TCPresources:requests:memory:32Micpu:5m
  可以看到除了apiVersion,kind以及strategy之外,其他和Deployment无异。
  strategy字段定义的是发布策略,其中:setWeight:设置流量的权重pause:暂停,如果里面没有跟duration:10则表示需要手动更新,如果跟了表示等待多长时间会自动更新。
  而service。yaml文件定义的就是普通的service,如下:apiVersion:v1kind:Servicemetadata:name:rolloutsdemospec:ports:port:80targetPort:httpprotocol:TCPname:httpselector:app:rolloutsdemo
  执行上面命令部署后,会在default命名空间下创建5个pod,如下:kubectlgetpodNAMEREADYSTATUSRESTARTSAGEnfsclientprosioner598d477ff6fmgwf11Running217drolloutsdemo7bf84f96964glv611Running078srolloutsdemo7bf84f96967kqt611Running078srolloutsdemo7bf84f96968k9hw11Running078srolloutsdemo7bf84f96969cz2r11Running078srolloutsdemo7bf84f9696jvzvd11Running078s
  可以使用kubectlargorolloutsgetrolloutrolloutsdemo命令来查看部署状态,如下:kubectlargorolloutsgetrolloutrolloutsdemoName:rolloutsdemoNamespace:defaultStatus:HealthyStrategy:CanaryStep:88SetWeight:100ActualWeight:100Images:argoprojrolloutsdemo:blue(stable)Replicas:Desired:5Current:5Updated:5Ready:5Available:5NAMEKINDSTATUSAGEINFOrolloutsdemoRolloutHealthy114srevision:1rolloutsdemo7bf84f9696ReplicaSetHealthy114sstablerolloutsdemo7bf84f96964glv6PodRunning114sready:11rolloutsdemo7bf84f96967kqt6PodRunning114sready:11rolloutsdemo7bf84f96968k9hwPodRunning114sready:11rolloutsdemo7bf84f96969cz2rPodRunning114sready:11rolloutsdemo7bf84f9696jvzvdPodRunning114sready:11
  可以看到该版本被标记为stable,而且STATUS为healthy。还可以在命令后面加一个watch来实时监控服务状态,完整命令为kubectlargorolloutsgetrolloutrolloutsdemowatch。更新应用
  接下来对应用进行更新。对应用进行更新和更新用Deployment部署的应用一样,更新镜像即可。argorollouts插件有一个setimage命令来更新镜像,如下:kubectlargorolloutssetimagerolloutsdemorolloutsdemoargoprojrolloutsdemo:yellow
  更新过后,我们可以通过观察kubectlargorolloutsgetrolloutrolloutsdemowatch服务状态,如下:Name:rolloutsdemoNamespace:defaultStatus:PausedMessage:CanaryPauseStepStrategy:CanaryStep:18SetWeight:20ActualWeight:20Images:argoprojrolloutsdemo:blue(stable)argoprojrolloutsdemo:yellow(canary)Replicas:Desired:5Current:5Updated:1Ready:5Available:5NAMEKINDSTATUSAGEINFOrolloutsdemoRolloutPaused9m12srevision:2rolloutsdemo789746c88dReplicaSetHealthy44scanaryrolloutsdemo789746c88dl4gmdPodRunning44sready:11revision:1rolloutsdemo7bf84f9696ReplicaSetHealthy9m12sstablerolloutsdemo7bf84f96964glv6PodRunning9m12sready:11rolloutsdemo7bf84f96968k9hwPodRunning9m12sready:11rolloutsdemo7bf84f96969cz2rPodRunning9m12sready:11rolloutsdemo7bf84f9696jvzvdPodRunning9m12sready:11
  可以看到多了一个revision:2,而且该版本被标记为canary,而且状态是Status:Paused,canary接入流量为20。
  部署之所以处于Paused阶段,是因为我们在rollout。yaml中定义了发布第一个版本后会暂停,这时候需要手动接入接下来的更新。
  argorollouts提供了promote来进行后续的更新,命令如下:kubectlargorolloutspromoterolloutsdemo
  然后我们可以在watch界面,看到如下的更新过程。Name:rolloutsdemoNamespace:defaultStatus:PausedMessage:CanaryPauseStepStrategy:CanaryStep:38SetWeight:40ActualWeight:40Images:argoprojrolloutsdemo:blue(stable)argoprojrolloutsdemo:yellow(canary)Replicas:Desired:5Current:5Updated:2Ready:5Available:5NAMEKINDSTATUSAGEINFOrolloutsdemoRolloutPaused15mrevision:2rolloutsdemo789746c88dReplicaSetHealthy6m46scanaryrolloutsdemo789746c88dl4gmdPodRunning6m46sready:11rolloutsdemo789746c88d67dwpPodRunning19sready:11revision:1rolloutsdemo7bf84f9696ReplicaSetHealthy15mstablerolloutsdemo7bf84f96964glv6PodRunning15mready:11rolloutsdemo7bf84f96968k9hwPodRunning15mready:11rolloutsdemo7bf84f96969cz2rPodRunning15mready:11rolloutsdemo7bf84f9696jvzvdPodTerminating15mready:11
  因为后续的更新在pause阶段只暂停10s,所以会依次自动更新完,不需要手动介入,待更新完后整体的状态如下:Name:rolloutsdemoNamespace:defaultStatus:HealthyStrategy:CanaryStep:88SetWeight:100ActualWeight:100Images:argoprojrolloutsdemo:yellow(stable)Replicas:Desired:5Current:5Updated:5Ready:5Available:5NAMEKINDSTATUSAGEINFOrolloutsdemoRolloutHealthy17mrevision:2rolloutsdemo789746c88dReplicaSetHealthy8m35sstablerolloutsdemo789746c88dl4gmdPodRunning8m35sready:11rolloutsdemo789746c88d67dwpPodRunning2m8sready:11rolloutsdemo789746c88dk7mfkPodRunning106sready:11rolloutsdemo789746c88dglbfbPodRunning94sready:11rolloutsdemo789746c88dd7m4fPodRunning83sready:11revision:1rolloutsdemo7bf84f9696ReplicaSetScaledDown17m
  可以看到第一个版本已经下线,第二个版本的状态为Healthy,而且镜像被标记为stable。终止更新
  如果在更新应用的过程中,最新的应用有问题,需要终止更新需要怎么做呢?
  我们先使用下面命令发布新版本应用,如下:kubectlargorolloutssetimagerolloutsdemorolloutsdemoargoprojrolloutsdemo:red
  然后更新动作会在第一次更新的时候处于Paused状态,现在我们可以用abort来终止发布,如下:kubectlargorolloutsabortrolloutsdemo
  待执行完命令后,可以在watch页面,看到如下信息:Name:rolloutsdemoNamespace:defaultStatus:DegradedMessage:RolloutAborted:RolloutisabortedStrategy:CanaryStep:08SetWeight:0ActualWeight:0Images:argoprojrolloutsdemo:yellow(stable)Replicas:Desired:5Current:5Updated:0Ready:5Available:5NAMEKINDSTATUSAGEINFOrolloutsdemoRolloutDegraded21mrevision:3rolloutsdemo6f75f48b7ReplicaSetScaledDown90scanaryrevision:2rolloutsdemo789746c88dReplicaSetHealthy13mstablerolloutsdemo789746c88dl4gmdPodRunning13mready:11rolloutsdemo789746c88d67dwpPodRunning6m46sready:11rolloutsdemo789746c88dk7mfkPodRunning6m24sready:11rolloutsdemo789746c88dglbfbPodRunning6m12sready:11rolloutsdemo789746c88dnntc9PodRunning18sready:11revision:1rolloutsdemo7bf84f9696ReplicaSetScaledDown21m
  最终应用会回退到稳定版本。
  但是我们可以看到Status是Degraded状态而并非Healthy状态,我们有必须要将其变成Healthy状态。最简单的办法就是执行如下命令重新发布一下版本:kubectlargorolloutssetimagerolloutsdemorolloutsdemoargoprojrolloutsdemo:yellow
  执行过后,可以看到其状态立即变成Healthy,并且没有创建新的副本、新的版本,如下:Name:rolloutsdemoNamespace:defaultStatus:HealthyStrategy:CanaryStep:88SetWeight:100ActualWeight:100Images:argoprojrolloutsdemo:yellow(stable)Replicas:Desired:5Current:5Updated:5Ready:5Available:5NAMEKINDSTATUSAGEINFOrolloutsdemoRolloutHealthy40mrevision:4rolloutsdemo789746c88dReplicaSetHealthy32mstablerolloutsdemo789746c88dl4gmdPodRunning32mready:11rolloutsdemo789746c88d67dwpPodRunning26mready:11rolloutsdemo789746c88dk7mfkPodRunning25mready:11rolloutsdemo789746c88dglbfbPodRunning25mready:11rolloutsdemo789746c88dnntc9PodRunning19mready:11revision:3rolloutsdemo6f75f48b7ReplicaSetScaledDown20mrevision:1rolloutsdemo7bf84f9696ReplicaSetScaledDown40m回退应用
  有时候在应用上线过后,有些BUG并没有发现,这时候要回退怎么办呢?argorollouts有一个undo命令,可以进行回退。
  比如我们要将版本回退到第一个版本,则执行一下命令:kubectlargorolloutsundorolloutsdemotorevision1
  然后通过watch界面可以看到如下信息:Name:rolloutsdemoNamespace:defaultStatus:PausedMessage:CanaryPauseStepStrategy:CanaryStep:18SetWeight:20ActualWeight:20Images:argoprojrolloutsdemo:blue(canary)argoprojrolloutsdemo:yellow(stable)Replicas:Desired:5Current:5Updated:1Ready:5Available:5NAMEKINDSTATUSAGEINFOrolloutsdemoRolloutPaused45mrevision:5rolloutsdemo7bf84f9696ReplicaSetHealthy45mcanaryrolloutsdemo7bf84f9696bn2lzPodRunning36sready:11revision:4rolloutsdemo789746c88dReplicaSetHealthy36mstablerolloutsdemo789746c88dl4gmdPodRunning36mready:11rolloutsdemo789746c88d67dwpPodRunning30mready:11rolloutsdemo789746c88dk7mfkPodRunning29mready:11rolloutsdemo789746c88dglbfbPodRunning29mready:11revision:3rolloutsdemo6f75f48b7ReplicaSetScaledDown25m
  首先revision为1的版本标记没有,重新创建了一个为5的标记,而且第一步处于暂停状态,然后我们执行promote命令继续后续的更新,如下:kubectlargorolloutspromoterolloutsdemo
  然后我们可以看到如下信息:Name:rolloutsdemoNamespace:defaultStatus:HealthyStrategy:CanaryStep:88SetWeight:100ActualWeight:100Images:argoprojrolloutsdemo:blue(stable)Replicas:Desired:5Current:5Updated:5Ready:5Available:5NAMEKINDSTATUSAGEINFOrolloutsdemoRolloutHealthy48mrevision:5rolloutsdemo7bf84f9696ReplicaSetHealthy48mstablerolloutsdemo7bf84f9696bn2lzPodRunning3m21sready:11rolloutsdemo7bf84f9696xn6drPodRunning56sready:11rolloutsdemo7bf84f9696w58vmPodRunning44sready:11rolloutsdemo7bf84f9696fns8dPodRunning33sready:11rolloutsdemo7bf84f9696qt6f9PodRunning22sready:11revision:4rolloutsdemo789746c88dReplicaSetScaledDown39mrevision:3rolloutsdemo6f75f48b7ReplicaSetScaledDown27m
  从Images可以看到回退到我们最初版本为blue的镜像了。TrafficShifting
  上面我们并没有接入外部流量,仅仅是在内部使用展示了金丝雀部署过程,下面我们接入外部流量进行测试。
  ArgoRollout主要集成了Ingress和ServiceMesh两种流量控制方法。
  目前Ingress支持ALB和NGINXingress。但是我使用的是nginxingress。部署应用
  我们依然使用官方的例子进行展示。
  首先删除上面的例子。kubectldeletefhttps:raw。githubusercontent。comargoprojargorolloutsmasterdocsgettingstartedbasicrollout。yamlkubectldeletefhttps:raw。githubusercontent。comargoprojargorolloutsmasterdocsgettingstartedbasicservice。yaml
  然后重新部署一个官方的例子,如下:kubectlapplyfhttps:raw。githubusercontent。comargoprojargorolloutsmasterdocsgettingstartednginxrollout。yamlkubectlapplyfhttps:raw。githubusercontent。comargoprojargorolloutsmasterdocsgettingstartednginxservices。yamlkubectlapplyfhttps:raw。githubusercontent。comargoprojargorolloutsmasterdocsgettingstartednginxingress。yaml
  这个例子包含1个rollout,2个service,1个ingress。
  它们的配置文件分别如下。
  rollout。yaml,为了便于测试,我将权重改为了50apiVersion:argoproj。iov1alpha1kind:Rolloutmetadata:name:rolloutsdemospec:replicas:1strategy:canary:canaryService:rolloutsdemocanarystableService:rolloutsdemostabletrafficRouting:nginx:stableIngress:rolloutsdemostablesteps:setWeight:50pause:{}revisionHistoryLimit:2selector:matchLabels:app:rolloutsdemotemplate:metadata:labels:app:rolloutsdemospec:containers:name:rolloutsdemoimage:argoprojrolloutsdemo:blueports:name:httpcontainerPort:8080protocol:TCPresources:requests:memory:32Micpu:5m
  services。yamlapiVersion:v1kind:Servicemetadata:name:rolloutsdemocanaryspec:ports:port:80targetPort:httpprotocol:TCPname:httpselector:app:rolloutsdemoThisselectorwillbeupdatedwiththepodtemplatehashofthecanaryReplicaSet。e。g。:rolloutspodtemplatehash:7bf84f9696apiVersion:v1kind:Servicemetadata:name:rolloutsdemostablespec:ports:port:80targetPort:httpprotocol:TCPname:httpselector:app:rolloutsdemoThisselectorwillbeupdatedwiththepodtemplatehashofthestableReplicaSet。e。g。:rolloutspodtemplatehash:789746c88d
  ingress。yamlapiVersion:networking。k8s。iov1beta1kind:Ingressmetadata:name:rolloutsdemostableannotations:kubernetes。ioingress。class:nginxspec:rules:host:rolloutsdemo。localhttp:paths:path:backend:ReferencetoaServicename,alsospecifiedintheRolloutspec。strategy。canary。stableServicefieldserviceName:rolloutsdemostableservicePort:80
  从配置文件可以看出Rollout里分别用canaryService和stableService分别定义了该应用灰度的ServiceName(rolloutsdemocanary)和当前版本的ServiceName(rolloutsdemostable)。而且rolloutsdemocanary和rolloutsdemostable的service的内容是一样的。selector中暂时没有填上podtemplatehash,ArgoRolloutController会根据实际的ReplicaSethash来修改该值。
  当我们创建完ingress后,RolloutController会根据ingressrolloutsdemostable内容,自动创建一个ingress用了灰度的流量,名字为canary,所以这里多了一个ingressrolloutsdemorolloutsdemostablecanary,将流量导向CanaryService(rolloutsdemocanary)。如下:kubectlgetingressNAMEHOSTSADDRESSPORTSAGErolloutsdemorolloutsdemostablecanaryrolloutdemo。coolops。cn809m25srolloutsdemostablerolloutdemo。coolops。cn804m12s
  rolloutsdemorolloutsdemostablecanary的内容如下:kubectlgetingressrolloutsdemorolloutsdemostablecanaryoyamlapiVersion:extensionsv1beta1kind:Ingressmetadata:annotations:kubernetes。ioingress。class:traefiknginx。ingress。kubernetes。iocanary:truenginx。ingress。kubernetes。iocanaryweight:0creationTimestamp:20201209T02:21:52Zgeneration:2name:rolloutsdemorolloutsdemostablecanarynamespace:defaultownerReferences:apiVersion:argoproj。iov1alpha1blockOwnerDeletion:truecontroller:truekind:Rolloutname:rolloutsdemouid:4e74913b5c8942758f4c768f23c63c34resourceVersion:15681411selfLink:apisextensionsv1beta1namespacesdefaultingressesrolloutsdemorolloutsdemostablecanaryuid:bc66dfc46e98419ba288f67e1233ef3espec:rules:host:rolloutdemo。coolops。cnhttp:paths:backend:serviceName:rolloutsdemocanaryservicePort:80path:
  通过域名访问,可以看到如下界面。
  更新应用
  现在通过以下命令来进行应用更新操作。kubectlargorolloutssetimagerolloutsdemorolloutsdemoargoprojrolloutsdemo:yellow
  然后通过状态窗口可以看到如下信息。Name:rolloutsdemoNamespace:defaultStatus:PausedMessage:CanaryPauseStepStrategy:CanaryStep:12SetWeight:50ActualWeight:50Images:argoprojrolloutsdemo:blue(stable)argoprojrolloutsdemo:yellow(canary)Replicas:Desired:1Current:2Updated:1Ready:2Available:2NAMEKINDSTATUSAGEINFOrolloutsdemoRolloutPaused2m13srevision:2rolloutsdemo789746c88dReplicaSetHealthy89scanaryrolloutsdemo789746c88dspn4sPodRunning89sready:11revision:1rolloutsdemo7bf84f9696ReplicaSetHealthy2mstablerolloutsdemo7bf84f96967rwkxPodRunning2mready:11
  然后可以看到rolloutsdemorolloutsdemostablecanary的ingress的annotations中新增了两个参数,如下:kubectlgetingressrolloutsdemorolloutsdemostablecanaryoyamlapiVersion:extensionsv1beta1kind:Ingressmetadata:annotations:kubernetes。ioingress。class:nginxnginx。ingress。kubernetes。iocanary:truenginx。ingress。kubernetes。iocanaryweight:50creationTimestamp:20201209T03:01:04Zgeneration:1name:rolloutsdemorolloutsdemostablecanarynamespace:defaultownerReferences:apiVersion:argoproj。iov1alpha1blockOwnerDeletion:truecontroller:truekind:Rolloutname:rolloutsdemouid:4d956f2a9e154453b918926c4a75f884resourceVersion:15686969selfLink:apisextensionsv1beta1namespacesdefaultingressesrolloutsdemorolloutsdemostablecanaryuid:c9242819d0884fc4bd4d8870360fa96espec:rules:host:rolloutdemo。coolops。cnhttp:paths:backend:serviceName:rolloutsdemocanaryservicePort:80path:
  然后通过网页,可以看到如下的输出展示。
  image。png
  然后可以通过验证结果来判断是否继续还是终止。
  如果继续使用如下命令:kubectlargorolloutspromoterolloutsdemo
  如果终止使用如下命令:kubectlargorolloutsabortrolloutsdemo写在最后
  目前我还在测试阶段,并没有实际接入使用。通过测试来看,ArgoRollout提供更加强大的Deployment,包含比较适合运维的金丝雀发布和蓝绿发布功能,要使用蓝绿发布,仅需要配置rollout,如下:apiVersion:argoproj。iov1alpha1kind:Rollout部署完rollout后就有了这个kind资源,这个资源和deployment类似也是管理你的副本集的,所以不能像deployment那样在k8s界面看见,只能通过kubectl命令行metadata:name:rolloutbluegreennamespace:rollouttestspec:template:spec:terminationGracePeriodSeconds:30containers:resources:{}requests:cpu:1memory:2Gilimits:cpu:2memory:2GiterminationMessagePolicy:FileimagePullPolicy:Alwaysname:rolloutbluegreenimage:argoprojrolloutsdemo:greennginx:1。17。1schedulerName:defaultschedulersecurityContext:{}dnsPolicy:ClusterFirstrestartPolicy:Alwaysmetadata:labels:app:rolloutbluegreenselector:matchLabels:app:rolloutbluegreenreplicas:2strategy:blueGreen:蓝绿启用配置activeService:rolloutbluegreenactive生效的服务,需要自己创建建本代码最下面service资源。previewService:rolloutbluegreenpreview配置预览服务,同理需要自己创建autoPromotionEnabled:true是否直接切换,如为true,会在新版本变绿后直接切换到对外服务。scaleDownDelayRevisionLimit:0previewReplicaCount:1新版本的pod数量,设为一个从而控制资源消耗rollingUpdate:maxUnavailable:25maxSurge:25type:RollingUpdaterevisionHistoryLimit:2progressDeadlineSeconds:600apiVersion:v1kind:Servicemetadata:name:rolloutbluegreenactivenamespace:rollouttestspec:sessionAffinity:Noneselector:app:rolloutbluegreenports:protocol:TCPport:80targetPort:8080type:LoadBalancer
  整体使用还是比较丝滑,如果测试通过后续考虑集成进CD中。更多内容可以到https:argoproj。github。ioargorollouts进行学习。

不到五千的三星折叠屏三星GalaxyZFlip3说起折叠屏手机,大家第一时间想到的应该都是三星吧,作为折叠屏领域的拓荒者,三星一直深耕于折叠屏领域,每年出的折叠屏手机都可以说是行业标杆了。但相比于今年出的两款三星折叠屏……免费景点!市中区这两个地方大有耍头!乐游嘉学乐娃心体验读万卷书不如行万里路乐娃带你到乐山研学啦多的是你未曾触及过的世界今天乐娃带你线上游览乐山市博物馆、乐山文庙NO……国家要求快递业1月8日停业?阳康15天后才会产生抗体?真相来国家要求快递业1月8日停业?这是电商忽悠人下单近日有网络传言称,由于疫情原因,国家要求快递业在1月8日左右开始陆续停业。对此,中通、圆通、顺丰等沪上多家快递企业答复表示,……高血压怎么早期预防?1、劳逸结合生活起居一定要有规律,并且注意劳逸结合。适当参加一些娱乐活动,放松心情。当然运动也要适度,每次运动时间以不超过2小时为宜2、情绪稳定良好的状态将会使身心的健康……在人前优雅知性的董卿,私底下到底是个什么样的人?在大多数人眼中,董卿是女神一般的存在。她犹如一束清雅的花朵,开在你我的心房。但这个看似睿智优雅,温温柔柔的女人,却并不是传统意义上的乖乖女,她的成长经历里也有叛逆和偏离,……疙瘩汤简单好喝的家常做法,学会这一招,筋道美味,滑溜爽口人们常说没有什么事情是一顿美食解决不了的,如果有,那就再吃两顿,虽然说得有点夸张,但确实美食是每个人抵挡不了的。不论生活中遇到什么烦恼,美食就是人们最好的慰藉,味蕾上的满足能够……劳力士官宣进军二手市场从本月起,顾客可以在瑞士、奥地利、德国、法国、丹麦和英国的Bucherer专卖店内,购买到劳力士官方认证的二手手表,同时享有两年国际质保的权利。据悉,这项认证二手表计划从明年开……(科技)特斯拉交付首批电动卡车新华社旧金山12月1日电(记者吴晓凌)美国特斯拉公司1日在位于内华达州的超级工厂举行仪式,向百事可乐公司交付了首批电动卡车Semi。特斯拉公司介绍,Semi电动卡车可在2……sanag塞那A30SPro突破传统,音质再升级在这竞争激烈的耳机市场,衍生出了各种各样的耳机,按连接方式可以分为两个大类:有线耳机、无线耳机;按佩戴方式可以分为五个大类:入耳式耳机、半入耳式耳机、头戴式耳机、耳挂式耳机、颈……地方国家目录均未纳入,同仁堂王牌牛黄清心丸为何被踢出医保?1月3日,患有心脑血管疾病的北京薛阿姨,像往常每个月的这天一样,到北京一家医院开药时,但却被告知,她常年吃的同仁牛黄清心丸,已经不在医保目录中了,我一直患有高血压和心脑血管疾病……顶不住了!高通裁员苹果砍单,美媒直言这是自作自受去年8月份,华为任正非在网上发表了一篇内部讲话,引发了国内外科技圈的热议。他呼吁华为应该改变思路和经营方针,要追求利润和现金流,未来三年要把活下来作为主要纲领,还要把寒气传递给……福建宁德去年GDP再创新高,历史性跻身中国百强城市继2021年全市GDP首次突破3000亿元大关后,位于福建省东北沿海地区的宁德市2022年GDP再创新高,预计达到3580亿元,并历史性跻身中国百强城市。宁德市政府市长张……
维金斯与普尔都留下!勇士正式确定续约计划,科尔一招保住全主力本赛季的NBA冠军已经落户金州勇士队,接下来卫冕冠军的主要球员续约问题将在休赛期爆发。随着维金斯和普尔的续约合同飙升,勇士队真的很难留下所有的主力。毕竟,上个赛季勇士队这个阵容……曹云金吴鹤臣陈霄华,德云社引以为荣的师徒文化逐步垮塌德云社艺人陈霄华被刑拘,人民网发表评论,指出德云社应该好好自我检视。对此,网络上有一种观点认为,陈霄华只是德云社公司普通职工,他的事情属于个人行为,和德云社无关,更和郭德……办理加拿大旅游签,可以不提供存款证明吗?很多申请人来咨询的时候提到自己的芝麻信用超过750分是否可以不提供存款证明。不建议大家在申请加拿大签证的时候不提供存款证明。首先存款证明是非常直观的资金证明,签证官能从你……世界最大盗版网站Rutracker解封了相信最近俄罗斯事件爱友们都有了解吧?目前西方国家对俄罗斯的制裁是越来越离谱,除了科技巨头外,就连俄罗斯方块也没能限免,被点名要求改名为乌克兰方块,实在是离谱他……大快人心!篮协正式给出禁赛名单,外号北京纯爷们受到惩罚大快人心!篮协正式给出禁赛名单,外号北京纯爷们受到惩罚亲情提示:亲爱的读者,如何能每天能读到这样的体育资讯呢?点击右上角的关注按钮即可,您的关注将是我创作的最……李嘉诚卖出英国产,意味着什么呢?近来,看到李嘉诚正大手笔的卖出英国物业和电力资产。01hr出售的物业资产3月11日晚间,长江实业集团(01113。HK)公告称,旗下间接全资附属公司Broadgat……官宣!2签约达成,詹皇伤情更新,勇士内讧,恩比德给哈登下命令3月29日,NBA常规赛继续进行,今天的比赛战况为掘金击败黄蜂队,骑士击败魔术队,老鹰击败步行者队,热火大胜国王队,尼克斯击败公牛队,猛龙击败凯尔特人队,马刺击败火箭队,灰熊大……1982年,她关键赛事叛逃,告诉教练美国很安全,我已受到保护前言身为运动员,除了要为祖国在国际舞台当中争光以外,同样也需要拥有正确的价值观,因为她们是代表着自己的国家征战与世界比赛舞台,因此她们的一言一行在某种程度上也代表了国家,……1054场韦德,1057场马努,谁胜一筹?生涯18项数据对比韦德何马努吉诺比利可以说职业生涯总场次相当,韦德职业生涯打了1054场,而马努职业生涯也出场了1057场,虽然马努多三场,但是两个人生涯18项数据对比,悬殊还是非常大的。……24亿年前的一场大雪,跨越了漫长的时间线,地球变成了雪球地球有46亿年的历史,在这段漫长的岁月里,地球的气候并不是一成不变的,而是每隔一段岁月,就会出现一次大的变动,尤其是在地球的早期,气候的变化往往都特别剧烈,每一次持续的时间也都……河北五日游简记(上)河北五日游简记(上)2018年7月底,老公出差石家庄。我随行放风。31日,他公干,发个地图建议我到附近逛逛,别窝在房间看手机。可我是地图盲,相信嘴巴下面就是路,边走边问有……netcore3。1仓库管理WMS系统源码一,源码类型:BS开发环境:VS2019SQL2016开发语言:CWMS二,这是一款WMS仓库管理系统,主要采用了netcore3。1mysqlsqlserverE……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网