依赖mysql、redis,使用configmap管理配置文件、secret管理私密配置、hooks管理db migrate

准备工作



创建chart项目


helm create rails-app-demo

WX20191211-100816

其他文件都需要手动创建,初始化只提供了简单的模版


配置依赖requirements.yml


手动创建并定义需要依赖的chart包

dependencies:
  - name: mysql
    version: 1.6.1
    repository: https://kubernetes-charts.storage.googleapis.com
    condition: mysql.enabled
  - name: redis
    version: 10.2.1
    repository: https://charts.bitnami.com
    condition: redis.enabled
helm dependency update rails-app-demo

会自动下载chart文件到charts文件夹中,并生成requirements.lock

WX20191211-105303

在values.yaml中开启mysql和redis

mysql:
  enabled: true

redis:
  enabled: true

依赖关系配置完毕,测试启动chart

# 这里用的Helm V3
helm install rails rails-app-demo

WX20191211-113932

# 移除
helm delete rails

接下来正式开始配置rails app相关的服务


values配置


定义镜像信息


如果用的是私有镜像源需要配置imagePullSecrets

image:
  repository: your_repo_server/test/rails-gitlabci-demo
  tag: 14cae314f5c5a9b96c29be9acd49a5ff93a96e1c
  pullPolicy: IfNotPresent

定义service信息


RAILS_SERVE_STATIC_FILES是Rails内的配置,如果不开启将访问不了静态文件

service:
  type: ClusterIP
  port: 80
  env:
    - name: RAILS_SERVE_STATIC_FILES
      value: "true"
    - name: SECRET_KEY_BASE
      value: xxxxxxxxxx

定义mysql信息


这里需要自定义配置支持中文,不然rails保存中文会报错,存储类用的minikube的默认存储

mysql:
  enabled: true
  mysqlDatabase: rails-gitlabci-demo_production
  mysqlUser: imshanks
  mysqlPassword: imshanks
  persistence:
    enabled: true
    storageClass: standard
  # initializationFiles:
  #   first-db.sql: |-
  #     CREATE DATABASE IF NOT EXISTS rails-gitlabci-demo_production DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
  configurationFiles:
    mysql_custom.cnf: |-
      [mysqld]
      default-storage-engine=INNODB
      character-set-server=utf8
      sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
      [client]
      default-character-set=utf8
      [mysql]
      default-character-set=utf8

定义redis信息


redis:
  enabled: true
  # Only used when internal redis is disabled
  # host: redis
  password: imshanks
  # port: 6379
  master:
    persistence:
      enabled: true
      storageClass: standard
  slave:
    persistence:
      enabled: true
      storageClass: standard

定义ingress信息


本地部署的话需要来hosts里配置rails.test.com,公网部署的话配置域名解析就行了

ingress:
  enabled: true
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: rails.test.com
      paths:
        - "/"


配置congfigmap


通过configmap定义secrets.yml、database.yml、puma.rb和sidekiq.rb,好处是可以动态配置动态生效无需重启容器,配置变更不需要重打镜像

WX20191212-110926


配置secret


secret和configmap类似,专用于保存私密信息,这里设置了redis和mysql的密码

WX20191212-111420


配置deployment


service不用配置,模版已经生成并且和deployment.yaml匹配好了

获取configmap


首先设置volumes

WX20191212-114019

然后设置volumeMounts,对应到容器里的路径

WX20191212-114041

获取values中配置的env变量


我们在configmap里把配置文件里的参数都定义成了读取环境变量的模式,所以可以在values中赋值

WX20191212-114304

在deployment中可以批量读取

WX20191212-114438

获取secrets


密码相关信息也是通过环境变量专递的,所以也在env下配置

WX20191212-130747

健康度检查


需要在应用内专门做一个接口用于报告状态,200才算健康,否则会自动判定为error

  livenessProbe:
    httpGet:
      path: /status
      port: http
  readinessProbe:
    httpGet:
      path: /status
      port: http


配置启动命令


puma和sidekiq分成2个pod启动,命令配置不一样,sidekiq不需要配置svc,其他的都一样

# puma server
command: ['sh', '-c', 'puma -C /app/config/puma.rb']
# sidekiq server
command: ['sh', '-c', 'sidekiq -e production --logfile /app/log/sidekiq.log']


配置hooks


hooks可以配置job,这里用于执行db migrate,保证应用可以无需任何手动操作直接使用,这里只需要读取database的config就行了

WX20191212-132811


大功告成


再次启动

WX20191212-141028

WX20191212-141007

验证一下rails服务

WX20191212-141427

验证下sidekiq服务

WX20191212-141533