经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
通过搭建MySQL掌握k8s(Kubernetes)重要概念(下):参数配置
来源:cnblogs  作者:倚天码农  时间:2019/10/14 9:44:20  对本文有异议

本文通过搭建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)放在一起,这样运行起来比较方便。

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: mysql-config # name of ConfigMap, referenced in other files
  5. data:
  6. db-host: mysql # host address of mysql server
  7. 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。

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

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

  1. vagrant@ubuntu-xenial:/var/log$ kubectl describe configMap
  2. Name: mysql-config
  3. Namespace: default
  4. Labels: <none>
  5. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  6. {"apiVersion":"v1","data":{"db-host":"mysql","db-name":"service_config"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"mysql-con...
  7. Data
  8. ====
  9. db-host:
  10. ----
  11. mysql
  12. db-name:
  13. ----
  14. service_config
  15. Events: <none>

secret:

下面就是secret的配置文件(mysql-secret.yaml),它与configMap很像,在“data”下面就是键、值列表,只不过里面的键的值是经过base64编码的(例如“cm9vdA==
”)。你可以在Linux里运行命令“echo -n dbuser | base64”获得“dbuser”的编码,输出是“ZGJ1c2Vy”, 再把它写入secret里去。在下面文件里存储了数据库用户名和口令。

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4. name: mysql-secret
  5. data:
  6. mysql-user-root-pwd: cm9vdA== # database password for "root"
  7. mysql-user-dbuser-name: ZGJ1c2Vy # database user name for "dbuser"
  8. mysql-user-dbuser-pwd: ZGJ1c2Vy # database password for "dbuser"

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

  1. vagrant@ubuntu-xenial:/var/log$ kubectl describe secret mysql-secret
  2. Name: mysql-secret
  3. Namespace: default
  4. Labels: <none>
  5. Annotations:
  6. Type: Opaque
  7. Data
  8. ====
  9. mysql-user-dbuser-name: 6 bytes
  10. mysql-user-dbuser-pwd: 6 bytes
  11. 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里面的一个键。

  1. env:
  2. - name: MYSQL_ROOT_PASSWORD
  3. valueFrom:
  4. secretKeyRef:
  5. name: mysql-secret
  6. key: mysql-user-root-pwd

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

  1. env:
  2. - name: MYSQL_DATABASE
  3. valueFrom:
  4. configMapKeyRef:
  5. name: mysql-config
  6. key: db-name

部署文件:

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

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: mysql-deployment
  5. labels:
  6. app: mysql
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: mysql
  11. strategy:
  12. type: Recreate
  13. template:
  14. metadata:
  15. labels:
  16. app: mysql
  17. spec:
  18. containers:
  19. - image: mysql:5.7
  20. name: mysql-con
  21. imagePullPolicy: Never
  22. env:
  23. - name: MYSQL_ROOT_PASSWORD
  24. valueFrom:
  25. secretKeyRef:
  26. name: mysql-secret
  27. key: mysql-user-root-pwd
  28. - name: MYSQL_USER_NAME
  29. valueFrom:
  30. secretKeyRef:
  31. name: mysql-secret
  32. key: mysql-user-dbuser-name
  33. - name: MYSQL_USER_PASSWORD
  34. valueFrom:
  35. secretKeyRef:
  36. name: mysql-secret
  37. key: mysql-user-dbuser-pwd
  38. - name: MYSQL_DATABASE
  39. valueFrom:
  40. configMapKeyRef:
  41. name: mysql-config
  42. key: db-name
  43. args: ["--default-authentication-plugin=mysql_native_password"]
  44. ports:
  45. - containerPort: 3306
  46. name: mysql
  47. volumeMounts:
  48. - name: mysql-persistent-storage
  49. mountPath: /var/lib/mysql
  50. volumes:
  51. - name: mysql-persistent-storage
  52. persistentVolumeClaim:
  53. claimName: mysql-pv-claim

索引

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

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

原文链接:http://www.cnblogs.com/code-craftsman/p/11661999.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号