Kubernetes学习(六)配置管理ConfigMap

ConfigMap

ConfigMap是一种API对象,用来将非机密性数据保存到键值对中。使用时可以用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap将配置信息和容器镜像解耦,便于应用修改配置,当需要存储机密数据时可以使用Secret对象。

注意:ConfigMap并不提供保密或加密功能。如果想存储加密数据,请使用Secret,或者使用其他第三方工具来保证数据的私密性。

ConfigMap配置Pod中的容器:

1、容器entrypoint的命令行参数

2、容器的环境变量

3、在只读卷里面添加一个文件,让应用来读取

4、编写代码在pod中运行,使用Kubernetes API来读取ConfigMap

这些不同的方法适用于不同的数据使用方式。对前三个方法,kubelet使用ConfigMap中的数据在Pod中启动容器

第四种方法必须编写代码才能服务ConfigMap和数据。然而,由于是直接使用Kubernetes API,因此是要ConfigMap发生更改,应用能够通过订阅来获取更新。通过直接进入Kubernetes API,可以获取到不同命名空间里的ConfigMap。

示例:通过环境变量方式使用ConfigMap

使用envForm ,可以实现在Pod环境中将ConfigMap中定义的key=value自动生成为环境变量

apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    name: myapp
spec:
  containers:
  - name: myapp
    image: busybox
    command: ["/bin/sh","-c","env"]
    envFrom:
      - configMapRef:
          name: my-db-config
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"
[root@master k8s]# kubectl logs myapp
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=myapp
SHLVL=1
username=root
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
password=root
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/
db-url=localhost

注意:环境变量名称收POSIX命名规范约束,不能以数字开头。如果配置中包含非法字符,系统将会跳过这条环境变量的创建,并记录一个Event用来提醒用户环境变量无法生成,但并不阻止Pod的启动。

Secret

Secret对象类型用来存放敏感信息,例如密码、OAuth令牌和SSH秘钥。将这些信息放在Secret中比放在Pod的定义或容器镜像中更加安全和灵活。

Pod可以有三种方式来使用Secret:

1、作为挂载到一个或多个容器上的卷中的文件

2、作为容器的环境变量

3、由kubelet在为Pod拉取镜像时使用

示例:

kubectl create secret generic root-user-pass --form-file=./login.txt
[root@master k8s]# kubectl describe  secret root-user-pass
Name:         root-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
login.txt:  12 bytes
[root@master k8s]#

默认情况下,kubectl get 和kubectl describe 不显示密码的内容,这是为了防止机密被意外的暴露给旁观者或者存储在终端日志中。

Kubernetes配置管理的最佳实践

普通配置

  • 定义配置时,请指定最新的稳定的API版本
  • 在推送到集群之前,配置文件应存储在版本控制中。这允许用户在必要的时候快速回滚配置更改,它还有助于集群重建和恢复。
  • 使用YAML而不是JSON编写配置文件,虽然这些格式几乎可以在任意场景中替换,但YAML对用户更加友好
  • 只要有意义,就将相关对象分组到一个文件中,一个文件通常比几个文件更容易管理

“Naked” Pods与ReplicaSet,Deployment和Jobs

如果可能,不要使用独立的Pods(即未绑定到ReplicaSet或Deployment的Pod)。如果节点发生故障,将不会重新调度Pods。

Deployment会创建一个ReplicaSet以确保所需数量的Pod始终可用,并指定替换Pod的策略,除了一些显示的restartPolicy:Never场景之外,几乎总是优先考虑直接创建Pod。Job可能也是合适的。

服务

在创建相应的后端工作负载(Deployment或ReplicaSet),以及在需要访问它的任何工作负载之前创建服务。当Kubernetes启动容器时,它提供指向启动容器时正在运行的所有服务的环境变量。例如,如果存在名为foo的服务,则所有容器将在其初始环境变量中获得以下变量:

FOO_SERVICE_HOST=<the host the Service is running on> FOO_SERVICE_PORT=<the port the Service is running on>

这确实意味着顺序上的要求:必须在Pod本身被创建之前创建Pod想要访问的Service,否则环境变量不会生效,DNS没有此限制。

  • 一个可选的集群插件是DNS服务器(尽管强烈推荐)。DNS服务器为新的Service监视Kubernetes API,并未每个创建一组DNS记录。如果在整个集群中启用了DNS,则所有Pod能够自动对Service进行名称解析。
  • 除非绝对必要,否则不要为Pod指定hostPort。将Pod绑定到hostPort时,它会限制Pod可以调度的位置数,应为每个组合必须是唯一的。如果没有明确指定hostIP'和protocol,Kubernetes会使用0.0.0.0作为默认的hostIP和TCP作为默认protocol。如果只需要访问端口进行调试,则可以使用apiservice proxy或kubectl port-forward。
  • 如果明确需要在节点上公开Pod的端口,请在使用hostPort之前考虑使用NodePort服务
  • 避免使用hostNetwork,原因与hostPort相同
  • 当不需要使用kube-proxy负载均衡时,使用无头服务(ClusterIP被设置为None)比便于服务发现

标签

  • 定义并使用标签来识别应用或Deployment的语义属性,可以使用这些标签来为其他资源选择合适的Pod,例如,一个选择所有tier:frontend Pod的服务,或者app:myapp的所有phase:test组件
  • 通过从选择器中省略特定发行版的标签,可以使服务跨越多个Deployment。Deployment可以在不停机的情况下轻松更新正在运行的服务。
  • Deployment描述了对象的期望状态,并且如果对该规范的更改被成功应用,则Deployment控制器以受控速率将实际状态更改为期望状态。

容器镜像

  • imagePullPolicy和镜像标签会影响kubectl何时尝试拉取指定的镜像
  • imagePullPolicy:ifNotPresent:仅当镜像在本地不存在时才被拉取
  • imagePullPolicy:Always:每次启动Pod的时候都会拉取镜像
  • imagePullPolicy省略时,镜像标签为latest或不存在,使用Always值
  • imagePullPolicy省略时,指定镜像标签并且不是latest时,使用ifNotPresent值
  • imagePullPolicy:Never:假设镜像已经存在本地,不会尝试拉取镜像

注意:在生产中部署容器时,应避免使用latest标记,这样更难跟踪正在运行的镜像版本,并且更难正确回滚。底层镜像驱动程序的缓存语义能够使即便imagePullPolicy:Always的配置也更高效。例如,对于Docker,如果镜像已经存在,则拉取尝试很快,因为镜像层都被缓存并且不需要下载。

kubectl

使用kubectl apply -f,它在给定的所有.yaml.yml和json文件中查找Kubernetes配置,并将其传递给apply

使用标签选择器进行get和delete操作,而不是特定的对象名称。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes 是一种用于自动化容器操作的开源平台,它可以帮助您管理和调度容器化应用程序。在 Kubernetes 中,Volume 是一种对象,用于将持久性存储附加到容器,并在容器中访问它们。本文将介绍 Kubernetes 中的 Volume,包括它的类型、如何创建和使用 Volume,以及常见的 Volume 插件。 ## Volume 类型 Kubernetes 中支持多种 Volume 类型,每种类型都有不同的用途和功能。以下是一些常见的 Volume 类型: ### emptyDir EmptyDir 是 Kubernetes 中最简单的 Volume 类型之一,它是一个空目录,可以在容器之间共享数据。当 Pod 被创建时,Kubernetes 会在节点上创建一个空目录,然后将其挂载到容器中。当 Pod 被删除时,这个空目录也会被删除。EmptyDir 的主要作用是在同一 Pod 中的容器之间共享数据。 ### hostPath HostPath Volume 允许将节点上的文件或目录挂载到 Pod 中。这意味着 Pod 可以直接访问节点上的文件系统,例如 /etc、/usr 等。HostPath Volume 可以用于访问宿主机上的配置文件、数据文件等。 ### configMap 和 secret ConfigMap 和 Secret 是 Kubernetes 中用于存储配置数据和敏感数据的对象。ConfigMap 可以存储 key-value 对,而 Secret 可以存储敏感数据,例如密码、证书等。这两种 Volume 类型都可以在容器中挂载,使容器可以访问其中的数据。 ### persistentVolumeClaim PersistentVolumeClaim(PVC)是 Kubernetes 中用于请求持久性存储的对象。PVC 可以用于请求某种存储类型,例如 NFS、iSCSI 等,并将其挂载到容器中。PVC 可以在多个 Pod 之间共享,并可以在 Pod 被删除后保留数据。 ## 创建和使用 Volume 在 Kubernetes 中创建和使用 Volume 非常简单。以下是一个使用 EmptyDir Volume 的示例: ```yaml apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx volumeMounts: - name: my-volume mountPath: /usr/share/nginx/html volumes: - name: my-volume emptyDir: {} ``` 在上面的示例中,我们定义了一个名为 my-volume 的 EmptyDir Volume,并将其挂载到容器的 /usr/share/nginx/html 目录中。这意味着容器可以在该目录中读取和写入数据。 以下是一个使用 HostPath Volume 的示例: ```yaml apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: nginx volumeMounts: - name: my-volume mountPath: /usr/share/nginx/html volumes: - name: my-volume hostPath: path: /data ``` 在上面的示例中,我们定义了一个名为 my-volume 的 HostPath Volume,并将其挂载到容器的 /usr/share/nginx/html 目录中。这意味着容器可以访问节点上的 /data 目录中的数据。 ## 常见的 Volume 插件 Kubernetes 中有许多 Volume 插件可用于连接各种持久性存储。以下是一些常见的 Volume 插件: ### NFS NFS Volume 插件允许将 NFS 共享挂载到容器中。它可以用于在多个 Pod 之间共享数据。 ### iSCSI iSCSI Volume 插件允许将 iSCSI 存储挂载到容器中。它可以用于连接 SAN 存储等。 ### AWS EBS AWS EBS Volume 插件允许将 Amazon Elastic Block Store(EBS)存储挂载到容器中。它可以用于连接 Amazon EC2 实例上的持久性存储。 ### GCE PD GCE PD Volume 插件允许将 Google Compute Engine 持久性磁盘(PD)挂载到容器中。它可以用于连接 Google Cloud Platform 上的持久性存储。 ## 总结 本文介绍了 Kubernetes 中的 Volume,包括它的类型、如何创建和使用 Volume,以及常见的 Volume 插件。Volume 是 Kubernetes 中非常重要的概念之一,它可以帮助您管理和调度容器化应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值