本实战练习系列的前四篇文章:

  • 适合 Kubernetes 初学者的一些实战练习 (一)

  • 适合 Kubernetes 初学者的一些实战练习 (二)

  • 适合 Kubernetes 初学者的一些实战练习 (三)

  • 适合 Kubernetes 初学者的一些实战练习 (四)

本文继续我们的 Kubernetes 实战练习之旅。

练习1 - 将 configmap 通过环境变量注入到 pod 里

在 Kubernetes 官网里,曾经提到 Kubernetes 里的一个最佳实践(Best Practice)就是把应用代码同配置信息分开,一种方式就是使用 Kubernetes 1.2 里引入的 configmap 概念。

configmap 实际上就是一系列键值对,存储于 etcd 里。etcd 的官网有这样一句话:

etcd is a distributed key-value store designed to reliably and quickly preserve and provide access to critical data.

etcd 是一个高性能的分布式键值对存储库,用于存储和访问关键数据。

使用下面的命令行创建一个 Kubernetes config map:

kubectl create configmap test-config --from-literal=test.type=unit --from-literal=test.exec=always

创建一个名为 test-config的键值对,key 为 test.type,值为 unit,key 为test.exec, 值为 always.

下面我打算创建一个 pod,消费这个名为 test-config 的 configmap.

创建一个内容如下的 yaml 文件:

apiVersion: v1kind: Podmetadata:name: test-configmapspec:containers:- name: test-containerimage: alpine:3.8command: [ "/bin/sh", "-c", "env" ]env:- name: TEST_TYPEvalueFrom:configMapKeyRef:name: test-configkey: test.type- name: TEST_EXECvalueFrom:configMapKeyRef:name: test-configkey: test.execrestartPolicy: Never

这个 yaml 文件定义的 pod 基于 docker 镜像 alpine,执行 shell 命令 /bin/sh -c env 查看环境变量。
在 env 区域,我给该 pod 注入一个名为 TEST_TYPE 的环境变量,值从 configMap 键值对的键名称为 test.type 的值中取。

kubectl create -f 创建这个 pod:

使用命令 kubectl logs test-configmap 查看这个 pod 运行生成的日志,发现输出的环境变量列表中,出现了 TEST_TYPE=unit,这个 TEST_TYPE 是我在 yaml 文件里注入的环境变量名称,而 unit 就来自 configmap 里 test-config 的值 unit.

练习2 - 通过一个基于 PostgreSQL 的具体例子学习 Kubernetes Stateful Set

Stateful Set 是 Kubernetes 1.9 版本新引入的一个概念,用于管理有状态的应用。

Kubernetes StatefulSet 由以下几个部分组成:

  1. 用于定义网络标志(DNS domain)的 Headless Service
  2. 用于创建 PersistentVolumes 的 volumeClaimTemplates
  3. 定义具体应用的 StatefulSet

下面是一个实际应用中的 StatefulSet 的 yaml 文件:

apiVersion: apps/v1kind: StatefulSetmetadata:name: ads-db-statefulsetlabels:component: adsmodule: dbspec:serviceName: ads-db-servicereplicas: 1selector:matchLabels:component: adsmodule: dbtemplate:metadata:labels:component: adsmodule: dbspec:volumes:- name: initsecret:secretName: ads-db-secretitems:- key: initdb.sqlpath: initdb.sqlcontainers:- name: ads-db-podimage: postgres:9.6ports:- containerPort: 5432name: ads-db-portvolumeMounts:- name: ads-db-volumemountPath: /var/lib/postgresql/data/- name: initmountPath: /docker-entrypoint-initdb.d/env:- name: PGDATAvalueFrom:configMapKeyRef:name: ads-db-configmapkey: pgdata_value- name: POSTGRES_PASSWORDvalueFrom:secretKeyRef:name: ads-db-secretkey: postgres_password_valuevolumeClaimTemplates:- metadata:name: ads-db-volumelabels:component: adsmodule: dbspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi



使用 kubectl get statefulset 查看生成的 statefulset:

生成的 headless service:

生成的 pod:

当我把 statefulset yaml 文件里的 replicas 从 1 改成 3 之后,果然观察到有两个新的 pod 正在启动,并且名称满足命名规范<stateful set name >-X.

使用 kubectl describe 查看创建的 statefulset 明细:


statefulSet 自动创建的 persistentVolumeClaim:


使用下面的命令登录到 statefulset 提供的 PostgreSQL 服务器上:

kubectl run tester -it --rm --image=postgres:9.6 --env=“PGCONNECT_TIMEOUT=5” --command – bash

看到 root$ 之后,说明我们已经连接上 pod 了。
使用如下命令行连接 PostgreSQL 服务器:

psql -h ads-db-statefulset-0.ads-db-service -p 5432 -U adsuser -W ads

当然如果不用命令行,也可以使用 pgadmin,以图形化界面连接 statefulSet 里的 postgreSQL 服务器:

sudo apt install pgadmin3

进行端口转发,这样我们可以使用 localhost:5432 进行连接:

kubectl port-forward ads-db-statefulset-0 5432:5432


也能成功连接:


总结

本文介绍了如何将 ConfigMap 通过环境变量的方式注入到 Kubernetes Pod 之中,这也是 Kubernetes 官方推荐的应用代码同配置信息分离的最佳实践思路,在实际项目中的体现。本文第二部分通过将 PostgreSQL 服务器实例运行在 Stateful Set 上的例子,介绍了 Kubernetes Stateful Set 在实际项目中的一个应用场景。

本系列前四篇文章可以通过下面的链接获得:

本实战练习系列的前四篇文章:

  • 适合 Kubernetes 初学者的一些实战练习 (一)

  • 适合 Kubernetes 初学者的一些实战练习 (二)

  • 适合 Kubernetes 初学者的一些实战练习 (三)

  • 适合 Kubernetes 初学者的一些实战练习 (四)

适合 Kubernetes 初学者的一些实战练习 (五)相关推荐

  1. 适合 Kubernetes 初学者的一些实战练习 (三)

    本系列的前两篇文章: 适合 Kubernetes 初学者的一些实战练习 (一) 适合 Kubernetes 初学者的一些实战练习 (二) 我们已经完成了下列在 Kubernetes 中的练习: 如何在 ...

  2. 适合 Kubernetes 初学者的一些实战练习(一)

    本系列记录了笔者刚刚接触并学习 Kubernetes 时动手做过的一些练习,这里分享出自己的 Kubernetes 学习历程,希望对广大 Kubernetes 初学者有所帮助. 练习1 - 如何在 K ...

  3. 适合 Kubernetes 初学者的一些实战练习(二)

    本系列的第一篇文章,我们学习了每一个 Kubernetes 从业者的实际工作中几乎都会使用的步骤:创建 Deployment 和 Service,同时通过实际例子讲解了 Pod 和 Service 绑 ...

  4. k8s之Pod详解(五)【Kubernetes(K8S) 入门进阶实战完整教程,黑马程序员K8S全套教程(基础+高级)】

    参考于Kubernetes(K8S) 入门进阶实战完整教程,黑马程序员K8S全套教程(基础+高级) Pod Pod的结构 每个Pod中都可以包含一个或者多个容器 这些容器可以分为两类: 用户自定义用的 ...

  5. SAP UI5 初学者教程之二十五 - 使用代理服务器解决 SAP UI5 应用访问远端 OData 服务的跨域问题试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  6. 适合于初学者—软路由全探索系列(一):探索 VMware 虚拟机旁路由安装及设置

    适合于初学者-软路由全探索系列(一):探索 VMware 虚拟机旁路由安装及设置 一. 旁路由安装背景知识 1.什么是路由器 2.什么是软路由 3.什么是旁路由 二.设有旁路由的局域网配置及特点 1. ...

  7. 本篇适合攻壳机动队初学者阅读

    力推广「攻壳机动队」的作品应该算是结合自己专长来发挥的一种方式.不过依我目前的经验来看,想让一般人以娱乐的角度来看攻壳的确有点困难,除了剧情过于深奥难懂之外,大量的计算机网络概念也是必备的背景知识.为 ...

  8. python3实用编程技巧_适合Python初学者的一些编程技巧

    这篇文章主要介绍了给Python初学者的一些编程技巧,皆是基于基础的一些编程习惯建议,需要的朋友可以参考下 交换变量 x = 6 y = 5 x, y = y, x print x >>& ...

  9. java applet 记事本_jsb java编写的安卓app记事本程序,适合app初学者 Applet 243万源代码下载- www.pudn.com...

    文件名称: jsb下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 86 KB 上传时间: 2015-08-25 下载次数: 0 提 供 者: dr 详细说明:j ...

最新文章

  1. 1048 Find Coins(two pointers解法)
  2. 干货丨深度解析机器学习五大流派中主算法精髓
  3. 云视频会议的“多、快、好、省”(下)
  4. SQL--(MyBatis 实战)
  5. ESP32的FLASH、NVS、SPIFFS、OTA等存储分布以及启动过程
  6. python中删除字典中的某个元素_python怎样删除字典中的元素
  7. 用Go开发支持百万级数据量的高性能缓存服务
  8. 掌握了这个方法,以后遇到bug不用再求人了!
  9. 赞,全网开发者都在学的 26 门 AI 课程!
  10. LVS-NAT工作模式的实现
  11. cocos2d-x之json文件读取初试
  12. 用计算机来控制飞船在太空中运行,神舟飞船在太空中靠什么动力运行
  13. mysql grant教程_MySQL的Grant命令详解
  14. kubernetes networkpolicy网络策略详解
  15. 外卖霸王餐返利小程序开发制作功能介绍
  16. A4纸是多少像素大小?
  17. 华为应用市场,浏览器PC版
  18. Blender基础建模 | 大帅老猿threejs特训
  19. Springboot整合JDBC和DBUtils,实现简单的增删改查.
  20. 云端的精彩:让信息在指尖流动

热门文章

  1. 通过图注意力神经网络进行多智能体游戏抽象_[读论文] AttnPath: 将图注意力机制融入基于深度强化学习的知识图谱推理中...
  2. ubuntu中忘记root密码的解决方法
  3. windows桌面快捷方式图标上面怎么老是会产生一个问号解决方案
  4. React Native 轻松集成分享功能( iOS 篇)
  5. 活动实录丨SRE在传统企业中的落地实践
  6. hive最新UDF函数(2016-10-25)
  7. 【8-20】java学习笔记02
  8. 预定义异常 - PHP手册笔记
  9. JSF 2.2: HTML5 Support
  10. 将网页保存为webarchive文件的代码