Open lqshow opened 5 years ago
当前 kubernetes 盛行,相信大家对如何将现有的传统应用迁移到 kubernetes 中比较关心。
改造一般涉及以下几个方面
首选需要将应用容器化,使用 Docker 定义一个包含安装步骤的 Dockerfile 文件,最后构建镜像。
使用 ConfigMap 来将配置和代码解耦, 在 Kubernetes 中通过 ConfigMap 资源将应用的配置文件加载到集群中。
kubernetes 提供两种方式将 ConfigMap 注入到应用程序。
12-Factor推荐将应用的配置存储于 环境变量 中( env vars, env )。环境变量可以非常方便地在不同的部署间做修改,却不动一行代码。 缺点:不支持热更新
12-Factor推荐将应用的配置存储于 环境变量 中( env vars, env )。环境变量可以非常方便地在不同的部署间做修改,却不动一行代码。
缺点:不支持热更新
apiVersion: v1 kind: ConfigMap metadata: name: app-config namespace: dev data: NODE_ENV: production DEV_MODE: "false" PORT: "3000" ENABLE_SWAGGER_UI: "true" --- apiVersion: v1 kind: Pod ... spec: containers: - name: app-container # 将 ConfigMap 中的所有键-值对配置为容器环境变量 envFrom: - configMapRef: name: app-config env: # 为容器定义环境变量 - name: ENV_NAME value: "ENV_VALUE" # 通过环境变量向容器公开Pod信息 - name: SPARK_DRIVER_HOST valueFrom: fieldRef: fieldPath: status.hostIP # 将 ConfigMap 中指定的键配置到环境变量中 - name: NODE_ENV valueFrom: configMapKeyRef: name: app-config key: NODE_ENV ...
用作 Pod 启动时挂载的 volume 优点:支持热更新
用作 Pod 启动时挂载的 volume
优点:支持热更新
挂载文件
比如项目不同目录下有两个配置文件需要挂载
apiVersion: v1 kind: Pod ... spec: containers: - name: app-container volumeMounts: - name: app-config-volume mountPath: /project/service/config.py subPath: config.py - name: app-config-volume mountPath: /project/deploy/supervisord.conf subPath: supervisord.conf volumes: - name: app-config-volume configMap: name: app-config ...
挂载目录
如果一个目录下的文件都是需要配置的,通过挂载整个目录的方式来实现
生成 configmap
kubectl create configmap hadoop-conf --from-file=conf/hadoop-conf
需要注意的是,挂载目录会抹掉目录下原有的文件
apiVersion: v1 kind: Pod ... spec: containers: - name: app-container volumeMounts: - name: hadoop-config-volume mountPath: /etc/hadoop/conf volumes: - name: hadoop-config-volume configMap: defaultMode: 0744 name: hadoop-conf ...
日志输出到 stdout 和 stderr
kubernets 容器集群对日志收集的解决方案详见: Kubernetes Log Analysis with Fluentd, Elasticsearch and Kibana
集群内访问走Service
<自定义的访问方式名称>.<工作负载所在命名空间> (例如:redis-svc.default)
<自定义的访问方式名称>.<工作负载所在命名空间>.svc.cluster.local(例如:redis-svc.default.svc.cluster.local)
Overview
当前 kubernetes 盛行,相信大家对如何将现有的传统应用迁移到 kubernetes 中比较关心。
改造一般涉及以下几个方面
Containerize your application
首选需要将应用容器化,使用 Docker 定义一个包含安装步骤的 Dockerfile 文件,最后构建镜像。
Configuration files
使用 ConfigMap 来将配置和代码解耦, 在 Kubernetes 中通过 ConfigMap 资源将应用的配置文件加载到集群中。
kubernetes 提供两种方式将 ConfigMap 注入到应用程序。
Store config in the environment (The Twelve Factors)
Use config in volume
挂载文件
比如项目不同目录下有两个配置文件需要挂载
挂载目录
如果一个目录下的文件都是需要配置的,通过挂载整个目录的方式来实现
生成 configmap
需要注意的是,挂载目录会抹掉目录下原有的文件
Logs
kubernets 容器集群对日志收集的解决方案详见: Kubernetes Log Analysis with Fluentd, Elasticsearch and Kibana
Networking
集群内访问走Service
<自定义的访问方式名称>.<工作负载所在命名空间> (例如:redis-svc.default)
<自定义的访问方式名称>.<工作负载所在命名空间>.svc.cluster.local(例如:redis-svc.default.svc.cluster.local)
Other
Reference