在Kubernetes中,Pod是最小的管理单元,是一组紧密关联的容器组合。但是,单独的Pod并不能保障总是可用,比如我们创建一个nginx的Pod,因为某些原因,该Pod被意外删除,我们希望其能够自动新建一个同属性的Pod。很遗憾,单纯的Pod并不能满足需求。为此,Kubernetes实现了一系列控制器来管理Pod,使Pod的期望状态和实际状态保持一致。目前常用的控制器有:Kubernetes有状态应用管理章节再来介绍,因为它涉及到很多其他的知识点,比如Service、PV/PVC,等这些知识点介绍完成过后再来说StatefulSet要好一点。apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-set
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-set-hmtq4 0/1 ContainerCreating 0 2s
nginx-set-j2jpr 0/1 ContainerCreating 0 2s
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-set 2 2 0 5s
从上图可以看到Deployment、ReplicaSet、Pod它们以层层控制关系,Deployment可以拥有多个ReplicaSet,一个ReplicaSet可以拥有多个Pod。一个Deployment拥有多个ReplicaSet主要是为了支持回滚操作,每当操作Deployment的时候,就会生成一个新的ReplicaSet,然后逐步更新新的Pod,而老的ReplicaSet会逐步减少Pod直到新的ReplicaSet全部接管。这时候并不会删除老的ReplicaSet,系统会将其保存下来,以备回滚使用。ReplicaSet还负责通过"控制器模式",保证系统的Pod数永远等于期望数,这也是Deployment只允许restartPolicy=Always的原因:只有在容器能保证自己始终处于running状态,通过ReplicaSet调整Pod的数量才有意义。而在此基础上,Deployment同样通过"控制器模式",来操作ReplicaSet的个数和属性,进而实现水平扩展/收缩和滚动更新这两个动作。其中水平扩展和收缩非常容易实现,Deployment Controller只需要修改它的ReplicaSet的Pod副本数就可以了。创建一个Deployment的清单如下:apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx$ kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 19s
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-8f458dc5b 3 3 3 21s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-deployment-8f458dc5b-8nn5c 1/1 Running 0 24s
nginx-deployment-8f458dc5b-hxc57 1/1 Running 0 24s
nginx-deployment-8f458dc5b-znrff 1/1 Running 0 24s$ kubectl scale deployment nginx-deployment --replicas 4
deployment.apps/nginx-deployment scaled$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-deployment-8f458dc5b-8nn5c 1/1 Running 0 8m3s
nginx-deployment-8f458dc5b-cv6mw 1/1 Running 0 29s
nginx-deployment-8f458dc5b-hxc57 1/1 Running 0 8m3s
nginx-deployment-8f458dc5b-znrff 1/1 Running 0 8m3s$ kubectl scale deployment nginx-deployment --replicas 2
deployment.apps/nginx-deployment scaled$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-deployment-8f458dc5b-8nn5c 1/1 Running 0 9m36s
nginx-deployment-8f458dc5b-hxc57 1/1 Running 0 9m36s$ kubectl edit deployments.apps nginx-deployment -oyaml
修改过后使用:wq保存退出,可以看到副本数又变成4个了。$ kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-deployment-8f458dc5b-8nn5c 1/1 Running 0 14m
nginx-deployment-8f458dc5b-hxc57 1/1 Running 0 14m
nginx-deployment-8f458dc5b-mq69h 1/1 Running 0 92s
nginx-deployment-8f458dc5b-xktq2 1/1 Running 0 92sapiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginxapiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
...
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8$ kubectl patch deployment nginx-deployment --patch '{"spec": {"template": {"spec": {"containers": [{"name": "nginx","image":"nginx:1.9"}]}}}}'$ kubectl get po -w
NAME READY STATUS RESTARTS AGE
nginx-deployment-6c74f576b9-h565l 1/1 Running 0 22s
nginx-deployment-6c74f576b9-k65q6 1/1 Running 0 22s
nginx-deployment-6c74f576b9-qr2xc 1/1 Running 0 22s
nginx-deployment-778d9f5866-n69qd 0/1 Pending 0 0s
nginx-deployment-778d9f5866-n69qd 0/1 Pending 0 0s
nginx-deployment-778d9f5866-n69qd 0/1 ContainerCreating 0 0s
nginx-deployment-778d9f5866-n69qd 0/1 ContainerCreating 0 0s
nginx-deployment-778d9f5866-n69qd 1/1 Running 0 41s
nginx-deployment-6c74f576b9-qr2xc 1/1 Terminating 0 3m23s
nginx-deployment-778d9f5866-42vhv 0/1 Pending 0 0s
nginx-deployment-778d9f5866-42vhv 0/1 Pending 0 0s
nginx-deployment-778d9f5866-42vhv 0/1 ContainerCreating 0 0s
nginx-deployment-778d9f5866-42vhv 0/1 ContainerCreating 0 1s
nginx-deployment-6c74f576b9-qr2xc 1/1 Terminating 0 3m24s
nginx-deployment-6c74f576b9-qr2xc 0/1 Terminating 0 3m24s
nginx-deployment-778d9f5866-42vhv 1/1 Running 0 1s
nginx-deployment-6c74f576b9-k65q6 1/1 Terminating 0 3m24s
nginx-deployment-778d9f5866-tndn8 0/1 Pending 0 0s
nginx-deployment-778d9f5866-tndn8 0/1 Pending 0 0s
nginx-deployment-778d9f5866-tndn8 0/1 ContainerCreating 0 0s
nginx-deployment-6c74f576b9-k65q6 1/1 Terminating 0 3m24s
nginx-deployment-6c74f576b9-qr2xc 0/1 Terminating 0 3m24s
nginx-deployment-6c74f576b9-qr2xc 0/1 Terminating 0 3m24s
nginx-deployment-778d9f5866-tndn8 0/1 ContainerCreating 0 0s
nginx-deployment-6c74f576b9-k65q6 0/1 Terminating 0 3m25s
nginx-deployment-6c74f576b9-k65q6 0/1 Terminating 0 3m25s
nginx-deployment-6c74f576b9-k65q6 0/1 Terminating 0 3m25s
nginx-deployment-778d9f5866-tndn8 1/1 Running 0 1s
nginx-deployment-6c74f576b9-h565l 1/1 Terminating 0 3m25s
nginx-deployment-6c74f576b9-h565l 1/1 Terminating 0 3m25s
nginx-deployment-6c74f576b9-h565l 0/1 Terminating 0 3m26s
nginx-deployment-6c74f576b9-h565l 0/1 Terminating 0 3m26s
nginx-deployment-6c74f576b9-h565l 0/1 Terminating 0 3m26skubectl get rs来查看:$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-6c74f576b9 0 0 0 9m49s
nginx-deployment-778d9f5866 3 3 3 7m7sapiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
...
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
Deployment实际控制的是ReplicaSet的数目以及每个ReplicaSet的属性。而一个应用版本,对应的就是一个ReplicaSet,而这个版本应有的Pod数量,是通过ReplicaSet自己的控制器来管理。$ kubectl rollout history deployment nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>$ kubectl rollout undo deployment nginx-deployment --to-revision 1
deployment.apps/nginx-deployment rolled back$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-6c74f576b9 3 3 3 27m
nginx-deployment-778d9f5866 0 0 0 25mapiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
progressDeadlineSeconds: 600
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.8
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat-ds
namespace: default
spec:
selector:
matchLabels:
app: filebeat
role: logstorage
template:
metadata:
labels:
app: filebeat
role: logstorage
spec:
containers:
- name: filebeat
image: ikubernetes/filebeat:5.6.5-alpine
env:
- name: REDIS_HOST
value: redis.default.svc.cluster.local$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
filebeat-ds-kgqcq 1/1 Running 0 28s 172.16.51.212 kk-node01 <none> <none>apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
namespace: default
spec:
template:
metadata:
name: job-demo
spec:
containers:
- name: test-job
image: busybox
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
args:
- "for i in $(seq 10); do echo $i; done"
restartPolicy: Never
backoffLimit: 4$ kubectl apply -f job-demo.yaml
job.batch/job-demo created$ kubectl logs job-demo-wd67s$ kubectl get jobs.batch
NAME COMPLETIONS DURATION AGE
job-demo 1/1 23s 112s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
job-demo-wd67s 0/1 Completed 0 114sapiVersion: batch/v1
kind: Job
metadata:
name: job-demo
namespace: default
spec:
template:
metadata:
name: job-demo
spec:
containers:
- name: test-job
image: busybox
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
args:
- "xxxxx"
restartPolicy: Never
backoffLimit: 4$ kubectl get po
NAME READY STATUS RESTARTS AGE
job-demo-kwsl8 0/1 Error 0 3s
job-demo-ltsvq 0/1 ContainerCreating 0 0s
job-demo-w54s4 0/1 Error 0 6s$ kubectl get po
NAME READY STATUS RESTARTS AGE
job-demo-p9dkp 0/1 CrashLoopBackOff 3 (24s ago) 68sapiVersion: batch/v1
kind: Job
metadata:
name: job-demo
namespace: default
spec:
template:
metadata:
name: job-demo
spec:
containers:
- name: test-job
image: busybox
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
args:
- "sleep 3600"
restartPolicy: OnFailure
backoffLimit: 4apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
namespace: default
spec:
template:
metadata:
name: job-demo
spec:
containers:
- name: test-job
image: busybox
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
args:
- "sleep 3600"
restartPolicy: OnFailure
backoffLimit: 4
activeDeadlineSeconds: 10apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
namespace: default
spec:
parallelism: 2
completions: 4
template:
metadata:
name: job-demo
spec:
containers:
- name: test-job
image: busybox
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
args:
- "for i in $(seq 10); do echo $i; done"
restartPolicy: OnFailure
backoffLimit: 4
activeDeadlineSeconds: 100$ kubectl get po
NAME READY STATUS RESTARTS AGE
job-demo-5wlp8 0/1 Completed 0 2s
job-demo-6wfkw 0/1 Completed 0 2s
job-demo-d54vz 0/1 Completed 0 5s
job-demo-x5mpz 0/1 Completed 0 5sapiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command:
- "/bin/sh"
- "-c"
args:
- "for i in $(seq 10); do echo $i; done"
restartPolicy: OnFailure分钟 小时 日 月 星期
* * * * *$ kubectl get cronjobs.batch
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 45s 69s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
hello-27628291-h8skg 0/1 Completed 0 50s我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我知道全局变量$!包含最新的异常对象,但我对下面的语法感到困惑。谁能帮助我理解以下语法?rescue$! 最佳答案 此构造可防止异常停止您的程序并使堆栈跟踪冒泡。它还会将该异常作为值返回,这很有用。a=get_me_datarescue$!在此行之后,a将保存请求的数据或异常。然后您可以分析该异常并采取相应措施。defget_me_dataraise'Nodataforyou'enda=get_me_datarescue$!puts"Executioncarrieson"pa#>>Executioncarrieson#>>#更现实的