2017-08-22 10:46:51    995    0    0
# Filebeat优化实践 ## 背景介绍 目前比较主流的日志采集系统有ELK(ES+Logstash+Kibana),EFK(ES+Fluentd+Kibana)等。由于Logstash出现较早,大多数日志文件搜集采用了Logstash。但由于Logstash是JRuby实现的,性能开销较大,因此我们的日志搜集采用的Filebeat,然后发送到Logstash进行数据处理(例如:解析js
Docker    2017-06-27 10:46:51    318    0    0

虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是不正当的 Dockerfile 使用也会导致很多问题:

  • docker 镜像太大。如果你经常使用镜像或者构建镜像,一定会遇到那种很大的镜像,甚至有些能达到 数G
  • docker 镜像的构建时间过长。每个 build 都会耗费很长时间,对于需要经常构建镜像(比如单元测试)的地方这可能是个大问题
  • 重复劳动。多次镜像构建之间大部分内容都是完全一样而且重复的,但是每次都要做一遍,浪费时间和资源

一般指导方针和建议

容器应该是短暂的

容器模型是进程而不是机器,不需要开机初始化。在需要时运行,不需要时停止,能够删除后重建,并且配置和启动的最小化。

使用.dockerignore文件

在 docker build 的时候,忽略部分无用的文件和目录可以提高构建的速度。比如.git目录。dockerignore的定义类似gitignore。具体使用方式可以参考链接

避免安装不必要的安装包

为了减少镜像的复杂性、镜像大小和构建时间,应该避免安装无用的包。

每个容器只运行一个进程

一个容器只运行一个进程。容器起到了隔离应用隔离数据的作用,不同的应用运行在不同的容器让集群的纵向扩展以及容器的复用都变的更加简单。需要多个应用交互时请使用 link 命令进行组合或者使用docker-compose。

最小化层数

需要掌握好Dockerfile的可读性和镜像层数之间的平衡。不推荐使用过多的镜像层。

多行命令按字母排序

命令行按字母顺序排序有助于避免重复执行和提高Dockerfile可读性。apt-get update 应与 apt-get install 组合,换行使用反斜杠(\)。例如:

  1. RUN apt-get update && apt-get install -y \
  2. bzr \
  3. cvs \
  4. git \
  5. mercurial \
  6. subversion

构建缓存

Dockerfile的每条指令都会将结果提交为新的镜像。下一条指令基于上一条指令的镜像进行构建。如果一个镜像拥有相同的父镜像和指令(除了 ADD )

Kubernetes    2017-05-24 10:46:51    193    0    0

场景对比

  • Secret:当你想要存储一些敏感数据时使用Secret,例如(passwords, OAuth tokens, ssh keys, credentials等)
  • ConfigMap : 当需要存储一些非敏感配置数据时可以使用ConfigMap,例如应用程序的ini,json等配置文件。

ConfigMap:

创建ConfigMap

  1. kind: ConfigMap
  2. apiVersion: v1
  3. metadata:
  4. name: example-config
  5. namespace: default
  6. data:
  7. example.property.1: hello #key-value形式,key规则必须满足dns域名规则。value为字符串。
  8. example.property.2: world
  9. example.property.file: |- #配置文件使用方式,直接把文件内容放入value即可
  10. property.1=value-1
  11. property.2=value-2
  12. property.3=value-3

使用方式:

1.填充环境变量

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: dapi-test-pod
  5. spec:
  6. containers:
  7. - name: test-container
  8. image: gcr.io/google_containers/busybox
  9. command: [ "/bin/sh", "-c", "env" ]
  10. env:
  11. - name: SPECIAL_LEVEL_KEY
  12. valueFrom:
  13. configMapKeyRef:
  14. name: example-config #需要使用的ConfigMap名称,必须已经存在
  15. key: example.property.1 #对应ConfigMap data 的key
  16. restartPolicy: Ne
Golang    2017-05-24 10:46:51    191    0    0
  1. func main() {
  2. v := []int{1, 2, 3}
  3. for i := range v {
  4. v = append(v, i)
  5. }
  6. }
  1. 下面的程序分别输出什么?
  1. func IndexArray() {
  2. a := [...]int{1, 2, 3, 4, 5, 6, 7, 8}
  3. for i := range a {
  4. a[3] = 100
  5. if i == 3 {
  6. fmt.Println("IndexArray", i, a[i])
  7. }
  8. }
  9. }
  10. func IndexValueArray() {
  11. a := [...]int{1, 2, 3, 4, 5, 6, 7, 8}
  12. for i, v := range a {
  13. a[3] = 100
  14. if i == 3 {
  15. fmt.Println("IndexValueArray", i, v)
  16. }
  17. }
  18. }
  19. func IndexValueArrayPtr() {
  20. a := [...]int{1, 2, 3, 4, 5, 6, 7, 8}
  21. for i, v := range &a {
  22. a[3] = 100
  23. if i == 3 {
  24. fmt.Println("IndexValueArrayPtr", i, v)
  25. }
  26. }
  27. }
  28. func main() {
  29. IndexArray()
  30. IndexValueArray()
  31. IndexValueArrayPtr()
  32. }

第一步 让我们阅读一下官方文档

range 变量

2015-05-24 10:46:51    755    0    0

Who am I ?

I am WilliamGuo(郭少巍), a Cloud Native Developer , and also as a Gopher  take an interest in Dokcer and Kubernetes.  And now using kubernetes and Docker build private cloud. 

4/4