当前位置:   article > 正文

带你玩转kubernetes-k8s(第12篇:k8s-深入掌握Pod-Pod容器共享Volume)_pod create volume from image

pod create volume from image

这一节我们继续来深入讲解Pod。

 

Pod容器共享Volume

     同一个Pod中的多个容器能够共享Pod级别的存储卷Volume。Volume可以被定义为各种类型,多个容器各自进行挂载操作,将一个Volume挂载为容器内部需要的目录。

     在下面的实例中,Pod内包含两个容器:tomcat和busybox,在Pod级别设置Volume “app-logs”,用于tomcat向其中写日志,busybox读取日志文件。

kubectl create -f pod-volume-applogs.yaml

    pod-volume-applogs.yaml的内容如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: volume-pod
  5. spec:
  6. containers:
  7. - name: tomcat
  8. image: tomcat
  9. ports:
  10. - containerPort: 8080
  11. volumeMounts:
  12. - name: app-logs
  13. mountPath: /usr/local/tomcat/logs
  14. - name: busybox
  15. image: busybox
  16. command: ["sh", "-c", "tail -f /logs/catalina*.log"]
  17. volumeMounts:
  18. - name: app-logs
  19. mountPath: /logs
  20. volumes:
  21. - name: app-logs
  22. emptyDir: {}

     这里设置的Volume名为app-logs,类型为emptyDir(也可以设置为其他类型),挂载到tomcat容器内的/usr/local/tomcat/logs目录,同时挂载到busybox容器内的/logs目录。tomcat容器启动后会向/usr/local/tomcat/logsm目录写文件,busybox容器就可以读取文件了。

    busybox容器的启动命令为 tail -f  /logs/catalia*.log,我们可以通过kubectl logs命令查看busybox容器的输出内容:

kubectl logs volume-pod -c busybox

  这个文件为tomcat生成的日志文件/usr/local/tomcat/logs/catalia.<date>.log的内容。

  进入tomcat容器查看日志

kubectl exec -it volume-pod -c tomcat bash

我们对日志进行对比,发现日志是一致的。

Pod的配置管理

     应用部署的一个最佳实践是将应用所需的配置信息与程序进行分离,这样可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群的环境中,对多个容器进行不同的配置将变得非常复杂。从Kubernetes 1.2开始提供了一种统一的应用配置管理方案—ConfigMap。本节对ConfigMap的概念和用法进行详细描述。
ConfigMap供容器使用的典型用法如下。
(1)生成为容器内的环境变量。
(2)设置容器启动命令的启动参数(需设置为环境变量)。
(3)以Volume的形式挂载为容器内部的文件或目录。

  ConfigMap以一个或多个key:value的形式保存在Kubernetes系统中供应用使用,既可以用于表示一个变量的值(例如apploglevel=info),也可以用于表示一个完整配置文件的内容(例如server.xml=<?xml...>...)


    可以通过YAML配置文件或者直接使用kubectl create configmap命令行的方式来创建ConfigMap。

通过yaml配置文件方式创建

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: cm-appvars
  5. data:
  6. apploglever: info
  7. appdatadir: /var/data

执行kubectl create命令创建该ConfigMap:

查看创建好的ConfigMap

 

接下来的例子cm-appconfigfiles.yaml描述了将两个配置文件server.xml和logging.properties定义为ConfigMap的用法,设置key为配置文件的别名,value则是配置文件的全部文本内容。

   cm-appconfigfiles.yaml:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: cm-appconfigfiles
  5. data:
  6. key-serverxml: |
  7. <?xml version='1.0' encoding='utf-8'?>
  8. <Server port="8005" shutdown="SHUTDOWN">
  9. <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  10. <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  11. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  12. <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  13. <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  14. <GlobalNamingResources>
  15. <Resource name="UserDatabase" auth="Container"
  16. type="org.apache.catalina.UserDatabase"
  17. description="User database that can be updated and saved"
  18. factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
  19. pathname="conf/tomcat-users.xml" />
  20. </GlobalNamingResources>
  21. <Service name="Catalina">
  22. <Connector port="8080" protocol="HTTP/1.1"
  23. connectionTimeout="20000"
  24. redirectPort="8443" />
  25. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  26. <Engine name="Catalina" defaultHost="localhost">
  27. <Realm className="org.apache.catalina.realm.LockOutRealm">
  28. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  29. resourceName="UserDatabase"/>
  30. </Realm>
  31. <Host name="localhost" appBase="webapps"
  32. unpackWARs="true" autoDeploy="true">
  33. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  34. prefix="localhost_access_log" suffix=".txt"
  35. pattern="%h %l %u %t "%r" %s %b" />
  36. </Host>
  37. </Engine>
  38. </Service>
  39. </Server>
  40. key-loggingproperties: "handlers
  41. = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler,
  42. 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler,
  43. java.util.logging.ConsoleHandler\r\n\r\n.handlers = 1catalina.org.apache.juli.FileHandler,
  44. java.util.logging.ConsoleHandler\r\n\r\n1catalina.org.apache.juli.FileHandler.level
  45. = FINE\r\n1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n1catalina.org.apache.juli.FileHandler.prefix
  46. = catalina.\r\n\r\n2localhost.org.apache.juli.FileHandler.level = FINE\r\n2localhost.org.apache.juli.FileHandler.directory
  47. = ${catalina.base}/logs\r\n2localhost.org.apache.juli.FileHandler.prefix = localhost.\r\n\r\n3manager.org.apache.juli.FileHandler.level
  48. = FINE\r\n3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n3manager.org.apache.juli.FileHandler.prefix
  49. = manager.\r\n\r\n4host-manager.org.apache.juli.FileHandler.level = FINE\r\n4host-manager.org.apache.juli.FileHandler.directory
  50. = ${catalina.base}/logs\r\n4host-manager.org.apache.juli.FileHandler.prefix =
  51. host-manager.\r\n\r\njava.util.logging.ConsoleHandler.level = FINE\r\njava.util.logging.ConsoleHandler.formatter
  52. = java.util.logging.SimpleFormatter\r\n\r\n\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].level
  53. = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers
  54. = 2localhost.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level
  55. = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers
  56. = 3manager.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level
  57. = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers
  58. = 4host-manager.org.apache.juli.FileHandler\r\n\r\n"

创建该ConfigMap

查看该ConfigMap

可以查看到两个文件。

通过kubectl命令行创建ConfigMap
不使用YAML文件,直接通过kubectl create configmap也可以创建ConfigMap,可以使用参数--from-file或--from-literal指定内容,并且可以在一行命令中指定多个参数。
(1)通过--from-file参数从文件中进行创建,可以指定key的名称,也可以在一个命令行中创建包含多个key的ConfigMap,语法为:

kubectl create configmap NAME --from-file=[key=]source

(2)通过--from-file参数从目录中进行创建,该目录下的每个配置文件名都被设置为key,文件的内容被设置为value,语法为:

kubectl create configmap NAME --from-file=config-files-dir

(3)使用--from-literal时会从文本中进行创建,直接将指定的key#=value#创建为ConfigMap的内容,语法为

kubectl create configmap NAME --from-literal-key1=value1 --from-literal=key2-value2

例如,在当前目录下含有配置文件server.xml,可以创建一个包含该文件内容的ConfigMap:

server.xml:

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <Server port="8005" shutdown="SHUTDOWN">
  3. <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  4. <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  5. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  6. <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  7. <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  8. <GlobalNamingResources>
  9. <Resource name="UserDatabase" auth="Container"
  10. type="org.apache.catalina.UserDatabase"
  11. description="User database that can be updated and saved"
  12. factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
  13. pathname="conf/tomcat-users.xml" />
  14. </GlobalNamingResources>
  15. <Service name="Catalina">
  16. <Connector port="8080" protocol="HTTP/1.1"
  17. connectionTimeout="20000"
  18. redirectPort="8443" />
  19. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  20. <Engine name="Catalina" defaultHost="localhost">
  21. <Realm className="org.apache.catalina.realm.LockOutRealm">
  22. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  23. resourceName="UserDatabase"/>
  24. </Realm>
  25. <Host name="localhost" appBase="webapps"
  26. unpackWARs="true" autoDeploy="true">
  27. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  28. prefix="localhost_access_log" suffix=".txt"
  29. pattern="%h %l %u %t "%r" %s %b" />
  30. </Host>
  31. </Engine>
  32. </Service>
  33. </Server>

logging.properties:

  1. "handlers
  2. = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler,
  3. 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler,
  4. java.util.logging.ConsoleHandler\r\n\r\n.handlers = 1catalina.org.apache.juli.FileHandler,
  5. java.util.logging.ConsoleHandler\r\n\r\n1catalina.org.apache.juli.FileHandler.level
  6. = FINE\r\n1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n1catalina.org.apache.juli.FileHandler.prefix
  7. = catalina.\r\n\r\n2localhost.org.apache.juli.FileHandler.level = FINE\r\n2localhost.org.apache.juli.FileHandler.directory
  8. = ${catalina.base}/logs\r\n2localhost.org.apache.juli.FileHandler.prefix = localhost.\r\n\r\n3manager.org.apache.juli.FileHandler.level
  9. = FINE\r\n3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n3manager.org.apache.juli.FileHandler.prefix
  10. = manager.\r\n\r\n4host-manager.org.apache.juli.FileHandler.level = FINE\r\n4host-manager.org.apache.juli.FileHandler.directory
  11. = ${catalina.base}/logs\r\n4host-manager.org.apache.juli.FileHandler.prefix =
  12. host-manager.\r\n\r\njava.util.logging.ConsoleHandler.level = FINE\r\njava.util.logging.ConsoleHandler.formatter
  13. = java.util.logging.SimpleFormatter\r\n\r\n\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].level
  14. = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers
  15. = 2localhost.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level
  16. = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers
  17. = 3manager.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level
  18. = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers
  19. = 4host-manager.org.apache.juli.FileHandler\r\n\r\n"

假设在config目录下包含两个配置文件server.xml和logging.properties,创建一个包含这两个文件内容的ConfigMap:

kubectl create configmap cm-appconf --from-file=config

使用--from-literal参数进行创建的示例如下:

kubectl create configmap cm-appenv --from-literal=loglevel=info --from-literal=appdatadir=/var/data

容器应用对ConfigMap的使用有以下两种方法。
(1)通过环境变量获取ConfigMap中的内容。
(2)通过Volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录。

小结:

       明天我们将详细讲解Pod中如何使用ConfigMap以及实例。

 

      谢谢大家的支持。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/162335
推荐阅读
相关标签
  

闽ICP备14008679号