本文通过搭建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. 百度之星初赛A轮 A 度度熊拼三角 贪心

    度度熊拼三角  Accepts: 2536  Submissions: 4433  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 6553 ...

  2. codeforces 361 C. Levko and Array Recovery(暴力+思维)

    题目链接:http://codeforces.com/contest/361/problem/C 题意:对一个数列有这么两个操作 1.(1,l,r,p)..将区间[l,r]所有数都加上p 2.(2,l ...

  3. 创建最简单的exe形式COM组件并在MFC程序调用

    来新公司学习接手新项目,拿到代码打开解决方案看到里面竟然有40几个工程,有点吃惊.具体看代码也有很多之前没见过的写法,上了几天火. 有件事就没太搞明白,按照文档的说法上层很多软件都要调用IO服务器,但 ...

  4. springmvc两种非注解的处理器映射器

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  5. 如何将 JavaScript 代码添加到网页中,以及 <script> 标签的属性

    Hello, world! 本教程的这一部分内容是关于 JavaScript 语言本身的. 但是,我们需要一个工作环境来运行我们的脚本,由于本教程是在线的,所以浏览器是一个不错的选择.我们会尽可能少地 ...

  6. android View的测量和绘制

    本篇内容来源于android 群英传(徐易生著) 我写到这里,是觉得徐易生讲的确实很好, 另外加入了一些自己的理解,便于自己基础的提高. 另外参考:http://www.gcssloop.com/cu ...

  7. 剖析nsq消息队列(二) 去中心化代码源码解析

    在上一篇帖子剖析nsq消息队列(一) 简介及去中心化实现原理中,我介绍了nsq的两种使用方式,一种是直接连接,还有一种是通过nslookup来实现去中心化的方式使用,并大概说了一下实现原理,没有什么难 ...

  8. Spring Boot 多环境如何配置

    Spring Boot 开发环境.测试环境.预生产环境.生产环境多环境配置 通常一个公司的应程序可能在开发环境(dev).测试环境(test).生产环境(prod)中运行.那么是不是需要拷贝不同的安装 ...

  9. 关于设置tomcat端口为80的事

    今天有人要求tomcat服务器的访问地址不能带端口访问, 也就是说只能用80端口访问网站. 那么问题来了, Ubuntu系统禁止root用户以外的用户访问1024以下的商品, 因此tomcat 默认为 ...

  10. 【赶快收藏】Hystrix实战,优雅提升系统的鲁棒性

    背景 最近接手了一个系统,其功能都是查询.查询分了两种方式,一种是公司集团提供的查询能力,支持全国各个省份的查询,但是业务高峰期时服务响应比较慢:另外一种是各省的分公司都分别提供了对应的查询能力,但是 ...