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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 适合 Kubernetes 初学者的一些实战练习 (五)

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

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


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

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

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

image.png

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

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

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

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

apiVersion: v1
kind: Pod
metadata:
name: test-configmap
spec:
containers:
- name: test-container
image: alpine:3.8
command: [ "/bin/sh", "-c", "env" ]
env:
- name: TEST_TYPE
valueFrom:
configMapKeyRef:
name: test-config
key: test.type
- name: TEST_EXEC
valueFrom:
configMapKeyRef:
name: test-config
key: test.exec
restartPolicy: Never

这个 yaml 文件定义的 pod 基于 docker 镜像 alpine,执行 shell 命令 /bin/sh -c env 查看环境变量。

在 env 区域,我给该 pod 注入一个名为 TEST_TYPE 的环境变量,值从 configMap 键值对的键名称为 test.type 的值中取。

image.png

kubectl create -f 创建这个 pod:

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

image.png

练习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/v1
kind: StatefulSet
metadata:
name: ads-db-statefulset
labels:
component: ads
module: db
spec:
serviceName: ads-db-service
replicas: 1
selector:
matchLabels:
component: ads
module: db
template:
metadata:
labels:
component: ads
module: db
spec:
volumes:
- name: init
secret:
secretName: ads-db-secret
items:
- key: initdb.sql
path: initdb.sql
containers:
- name: ads-db-pod
image: postgres:9.6
ports:
- containerPort: 5432
name: ads-db-port
volumeMounts:
- name: ads-db-volume
mountPath: /var/lib/postgresql/data/
- name: init
mountPath: /docker-entrypoint-initdb.d/
env:
- name: PGDATA
valueFrom:
configMapKeyRef:
name: ads-db-configmap
key: pgdata_value
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: ads-db-secret
key: postgres_password_value
volumeClaimTemplates:
- metadata:
name: ads-db-volume
labels:
component: ads
module: db
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi

33.png

34.png

35.png

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

image.png

生成的 headless service:

image.png

生成的 pod:


image.png

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

image.png

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

image.png

image.png

statefulSet 自动创建的 persistentVolumeClaim:

image.png

image.png

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

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

image.png

看到 root$ 之后,说明我们已经连接上 pod 了。

使用如下命令行连接 PostgreSQL 服务器:

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

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

sudo apt install pgadmin3

image.png

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

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

image.pngimage.png

也能成功连接:

image.png

image.png

总结

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


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


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

  • 适合 Kubernetes 初学者的一些实战练习 (一)
  • 适合 Kubernetes 初学者的一些实战练习 (二)
  • 适合 Kubernetes 初学者的一些实战练习 (三)
  • 适合 Kubernetes 初学者的一些实战练习 (四)
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4月前
|
Kubernetes 监控 调度
Kubernetes Pod调度:从基础到高级实战技巧
Kubernetes Pod调度:从基础到高级实战技巧
198 0
|
5月前
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
云原生|kubernetes 你真的学废了吗---实战k8s 一(jsonpath实战)
67 0
|
4月前
|
存储 Kubernetes 监控
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
Kubernetes快速进阶与实战:构建可靠的容器化应用平台
99 0
|
4月前
|
存储 Kubernetes 安全
Kubernetes Pod配置:从基础到高级实战技巧
Kubernetes Pod配置:从基础到高级实战技巧
154 0
|
5月前
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes 你真的学废了吗---实战k8s 二(命令行创建各类资源)
云原生|kubernetes 你真的学废了吗---实战k8s 二(命令行创建各类资源)
79 1
|
5月前
|
存储 关系型数据库 MySQL
猿创征文|云原生|kubernetes实务---部署MySQL--实战(一)
猿创征文|云原生|kubernetes实务---部署MySQL--实战(一)
53 0
|
5月前
|
Kubernetes Cloud Native 应用服务中间件
【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(五)
【云原生】kubernetes学习之资源(对象)控制器概述---概念和实战(五)
22 0
|
4天前
|
运维 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【4月更文挑战第26天】 在动态且不断增长的云计算环境中,维护高性能的 Kubernetes 集群是一个挑战。本文将探讨一系列实用的策略和工具,旨在帮助运维专家监控、分析和优化 Kubernetes 集群的性能。我们将讨论资源分配的最佳实践,包括 CPU 和内存管理,以及集群规模调整的策略。此外,文中还将介绍延迟和吞吐量的重要性,并提供日志和监控工具的使用技巧,以实现持续改进的目标。
|
7天前
|
存储 运维 Kubernetes
Kubernetes 集群的监控与维护策略
【4月更文挑战第23天】 在微服务架构日益盛行的当下,容器编排工具如 Kubernetes 成为了运维工作的重要环节。然而,随着集群规模的增长和复杂性的提升,如何确保 Kubernetes 集群的高效稳定运行成为了一大挑战。本文将深入探讨 Kubernetes 集群的监控要点、常见问题及解决方案,并提出一系列切实可行的维护策略,旨在帮助运维人员有效管理和维护 Kubernetes 环境,保障服务的持续可用性和性能优化。
|
9天前
|
存储 运维 Kubernetes
Kubernetes 集群的持续性能优化实践
【4月更文挑战第22天】在动态且复杂的微服务架构中,确保 Kubernetes 集群的高性能运行是至关重要的。本文将深入探讨针对 Kubernetes 集群性能优化的策略与实践,从节点资源配置、网络优化到应用部署模式等多个维度展开,旨在为运维工程师提供一套系统的性能调优方法论。通过实际案例分析与经验总结,读者可以掌握持续优化 Kubernetes 集群性能的有效手段,以适应不断变化的业务需求和技术挑战。

推荐镜像

更多