8

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

 3 years ago
source link: https://xie.infoq.cn/article/361a86fd7bd0f5c2bbbeeac39
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

本文继续我们的 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 在实际项目中的一个应用场景。

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK