本文通过搭建MySQL环境来了解k8s的重要概念,包括持久卷,网络和参数配置。这是下篇,专门讲解参数配置。如果你有些地方不能完全看明白,请先看上篇"通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷"。

配置参数:

参数配置是K8s里比较重要的一个概念,它包含了下面三个部分:

  • ConfigMap:是用来保存共享配置数据的。当你需要在不同的配置文件之间共享数据时,你可以把这些数据以键值对的形式存储在configMap中。详情请见"Configure a Pod to Use a ConfigMap"
  • Secret:它跟configMap的作用很类似,但是用来存储保密信息的,例如数据库的口令。详情请见"Secrets"
  • Environment Variable: 它就是我们所熟悉的环境变量,一般是由系统来定义。不同的系统例如Linux和Windows都有自己的方法来定义环境变量。k8s的环境变量主要是用来向容器传递数据的。详情请见"Container Environment Variables"

configMap:

下面就是configMap(mysql-config.yaml)的配置文件。它的结构很简单,最重要的就是data部分,里面是键、值列表。这是比较简单的一个例子,复杂的还可以包含文件和键、值列表的组合。你可以把configMap单独放在一个文件里,这样调试起来比较方便,也可以把它和部署(Deployment)放在一起,这样运行起来比较方便。

apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-config # name of ConfigMap, referenced in other files
data:
db-host: mysql # host address of mysql server
db-name: service_config # name of the database

configMap的运行命令与其它对象不同,例如一般的运行命令是“kubectl apply -f mysql-volume.yaml”或“kubectl create -f mysql-volume.yaml”,你只要给出配置文件名就行了,不需要给出要创建的对象的类别(它是自动识别的)和名字,因为在配置文件里已经有了(例如“kind: ConfigMap”,就表示对象类别是“ConfigMap”。“name: mysql-config” 就表示要创建的configMap的名字是“mysql-config”)。但configMap的创建命令是"kubectl create configmap [map-name] [data-source]",对象类别和名字都要在命令行里明确给出,[map-name] 是要创建的configMap的名字。“[data-source]”是数据来源文件的文件名(不是配置文件的文件名),我们上面提到过,configMap可以包含别的文件里的键、值列表,“[data-source]”就是“别的文件”的文件名。注意这个命令里就根本没有提到配置文件。我不太喜欢这种方式,因为当你在部署配置里引用键、值对时,需要给出configMap的名字,如果它不是存在文件里,而是在创建时敲入,这样很容易出错。

因此我还是采用了通用的创建命令“kubectl apply -f mysql-config.yaml”来创建configMap,这种方式在k8s的官方文档里是没有的,但它也是可行的。不过缺点是不能包含别的文件。

键入“kubectl get configMap”来显示已创建好的configMap。

vagrant@ubuntu-xenial:/var/log$ kubectl get configMap
NAME DATA AGE
mysql-config 2 11h

键入“kubectl describe configMap”来显示configMap的详细信息。

vagrant@ubuntu-xenial:/var/log$ kubectl describe configMap
Name: mysql-config
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","data":{"db-host":"mysql","db-name":"service_config"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"mysql-con... Data
====
db-host:
----
mysql
db-name:
----
service_config
Events: <none>

secret:

下面就是secret的配置文件(mysql-secret.yaml),它与configMap很像,在“data”下面就是键、值列表,只不过里面的键的值是经过base64编码的(例如“cm9vdA==

”)。你可以在Linux里运行命令“echo -n dbuser | base64”获得“dbuser”的编码,输出是“ZGJ1c2Vy”, 再把它写入secret里去。在下面文件里存储了数据库用户名和口令。

apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
data:
mysql-user-root-pwd: cm9vdA== # database password for "root"
mysql-user-dbuser-name: ZGJ1c2Vy # database user name for "dbuser"
mysql-user-dbuser-pwd: ZGJ1c2Vy # database password for "dbuser"

secret的运行方式与其他对象是一样的, 创建之后可以用“kubectl describe secret mysql-secret”命令显示secret详细信息,其中“mysql-secret”是secret的名字。因为值是经过base64编码的,这里只显示了字节数,而没有显示值。

vagrant@ubuntu-xenial:/var/log$ kubectl describe secret mysql-secret
Name: mysql-secret
Namespace: default
Labels: <none>
Annotations:
Type: Opaque Data
====
mysql-user-dbuser-name: 6 bytes
mysql-user-dbuser-pwd: 6 bytes
mysql-user-root-pwd: 4 bytes

值得注意的是secret只是对数据进行了编码,并没有加密。因此你可以通过反编码获得原值,因此它并不安全。如果要想安全,你还要对他另外加密。

Environment Variable:

环境变量一般是在部署里面定义的,没有单独的配置文件。下面是部署配置文件里的环境变量的片段。“MYSQL_ROOT_PASSWORD”是环境变量名,“secretKeyRef”说明它的值来自于secret,“name: mysql-secret”是secret的名字,“key: mysql-user-root-pwd”是secret里的键名,它的最终含义就是环境变量“MYSQL_ROOT_PASSWORD”的值是由“mysql-user-root-pwd”来定义,而“mysql-user-root-pwd”是secret里面的一个键。

 env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-user-root-pwd

下面是另一个定义环境变量的片段,与上面的类似,只不过它的键值来自于configMap,而不是secret。

 env:
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: mysql-config
key: db-name

部署文件:

下面是引用了configMap和secret的部署文件,它与前面提到的部署文件很类似,只不过把共享的数据提取了出来放到了configMap和secret里面。

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
labels:
app: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql-con
imagePullPolicy: Never
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-user-root-pwd
- name: MYSQL_USER_NAME
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-user-dbuser-name
- name: MYSQL_USER_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-user-dbuser-pwd
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: mysql-config
key: db-name
args: ["--default-authentication-plugin=mysql_native_password"]
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim

索引

  1. Secrets
  2. Configure a Pod to Use a ConfigMap
  3. Expose Pod Information to Containers Through Files

本文由博客一文多发平台 OpenWrite 发布!

通过搭建MySQL掌握k8s(Kubernetes)重要概念(下):参数配置的更多相关文章

  1. 通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷

    上一篇"通过实例快速掌握k8s(Kubernetes)核心概念"讲解了k8s的核心概念,有了核心概念整个骨架就完整了,应付无状态程序已经够了,但还不够丰满.应用程序分成两种,无状态 ...

  2. K8s - Kubernetes重要概念介绍(Cluster、Master、Node、Pod、Controller、Service、Namespace)

    K8s - Kubernetes重要概念介绍(Cluster.Master.Node.Pod.Controller.Service.Namespace)       Kubernetes 是目前发展最 ...

  3. 超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数

    超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数 介绍galera cluster原理的文章已经有一大堆了,百度几篇看一看就能有相关了解,这里就不赘述了.本文主 ...

  4. 从零开始入门 K8s | Kubernetes 网络概念及策略控制

    作者 | 阿里巴巴高级技术专家  叶磊 一.Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法.大家知道 Kubernetes 对于网络具体实现方案,没有什 ...

  5. Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群

    文章转载自:https://i4t.com/5451.html 背景 Kubernetes 1.24新特性 从kubelet中移除dockershim,自1.20版本被弃用之后,dockershim组 ...

  6. mysql 远程连接不上,bind-address参数配置要求,以及怎么去使得mysql能够允许远程的客户端访问

    刚安装了MySQL服务器,使用远程管理工具总是连接不上,因为知道mysql的默认端口是3306,于是使用telnet连接这个端口,(从这里可以学到telnet是可以这样用的) telnet 192.1 ...

  7. Kubernetes(K8s)基础概念 —— 凿壁偷光

    Kubernetes(K8s)基础概念  --  凿壁偷光 K8s是什么:全称 kubernetes  (k12345678s) 作用:用于自动部署,扩展和管理"容器化应用程序"的 ...

  8. 基于 kubeadm 搭建高可用的kubernetes 1.18.2 (k8s)集群二 搭建高可用集群

    1. 部署keepalived - apiserver高可用(任选两个master节点) 1.1 安装keepalived # 在两个主节点上安装keepalived(一主一备) $ yum inst ...

  9. 01 . 容器编排简介及Kubernetes核心概念

    Kubernetes简介 Kubernetes是谷歌严格保密十几年的秘密武器-Borg的一个开源版本,是Docker分布式系统解决方案.2014年由Google公司启动. Kubernetes提供了面 ...

随机推荐

  1. Leetcode 957.N天后的牢房

    Leetcode 957.N天后的牢房 8间牢房排成一排,每间牢房不是有人住就是空着. 每天,无论牢房是被占用或空置,都会根据以下规则进行更改: 如果一间牢房的两个相邻的房间都被占用或都是空的,那么该 ...

  2. spring组件注册

    基于注解和类的组件注册 @Conditional 作用:按照一定的条件进行判断,如果满足条件的话就给spring容器中注册bean ​ 该注解既可以标注到方法上面,也可以标注到类上面(只有满足条件时, ...

  3. .netcore 使用阿里云短信

    准备工作 阿里云上申请短信服务 创建短信应用.签名.短信模板并申请审核,如果审核不通过,接口是调不通的. 配置专门用来发短信的accessKeyId和 accessKeySecret 开始开发 下载安 ...

  4. Redis缓存和数据库一致性问题

    工作中,经常会遇到缓存和数据库数据一致性问题.从理论上设置过期时间,是保证最终一致性的解决方案.这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可 ...

  5. Unity3D_02_基类MonoBehaviour/自带函数以及脚本执行的生命周期

    导引: 其中Time,Input,Physics都是Unity中的全局变量.GameObject是游戏中的基本物件.GameObject是由Component组合而成的,GameObject本身必须有 ...

  6. helm在kubernetes环境中搭建

    1.安装helm 1.1.安装helm客户端 各个版本的helm:https://github.com/helm/helm/releases wget https://get.helm.sh/helm ...

  7. 警告:stream not available

    1.修改mybatis.org//DTD Config 3.0//EN更改为mybatis.org//DTD//EN 2.将url换成http://mybatis.org/dtd/mybatis-3- ...

  8. 重学Java(一):与《Java编程思想》的不解之缘

    说起来非常惭愧,我在 2008 年的时候就接触了 Java,但一直到现在(2018 年 10 月 10 日),基础知识依然非常薄弱.用一句话自嘲就是:十年 IT 老兵,Java 菜鸡一枚. 于是,我想 ...

  9. Netty源码分析 (九)----- 拆包器的奥秘

    Netty 的解码器有很多种,比如基于长度的,基于分割符的,私有协议的.但是,总体的思路都是一致的. 拆包思路:当数据满足了 解码条件时,将其拆开.放到数组.然后发送到业务 handler 处理. 半 ...

  10. 宝锋UV-5R说明书下载

    宝锋UV-5R说明书 百度网盘下载地址: 链接: https://pan.baidu.com/s/1QJXEJ2YyO7ovMAQG7Uur4A 提取码: j8d2 BI8EJM     73    ...