ext js如何动态更改xtype_K8S ConfigMap 用于动态应用程序的实践

5b84a1e95ca680b7a58bf0f386ade92b.png

编辑:小君君

技术校对:星空下的文仔、bot

在 Kubernetes 中,ConfigMap 是允许管理员将配置组件与镜像内容解耦,使容器化应用程序产生可移植性的一种资源。ConfigMap 可以与 Kubernetes Pod 一起使用,用于动态添加或更改容器中的使用文件。本文将阐述 Kubernetes ConfigMap 如何利用动态应用程序的方法来解决轻量级文件服务器部署到 Kubernetes 集群中的问题。

通过阅读本文你将获得:

  • ConfigMap 概览;

  • 配置 ConfigMap 的注意事项;

  • ConfigMap 资源用于动态应用程序实践。

1ffb04a4ac2fd0c2a210c947a37aa26b.png

ConfigMap 概览

生产环境中很多应用程序的配置可能需要通过配置文件、命令行参数和环境变量的组合来完成。这些配置应该从镜像中解耦,通过这种方式来保持容器化应用程序的可移植性。在 Kubernetes 1.2 版本以后,研发人员引入 ConfigMap 来处理这种类型的配置数据。

简单来说,ConfigMap 是容器的配置管理。在容器运行时,ConfigMap 把配置文件、命令行参数、环境变量、端口号和其他配置组件绑定到 Pod 的容器和系统组件上,同时将应用的代码和配置区分开。从数据角度来看,ConfigMap 的类型只是键值对。从应用角度来看,管理员可以从不同角度来配置它。

在 Pod 中使用 ConfigMap 大致有以下三种方式:

  • 将 ConfigMap 中的数据设置为环境变量;

  • 将 ConfigMap 中的数据设置为命令行参数;

  • 将 ConfigMap 作为文件或目录挂载。

另外,由于应用会从环境变量和包含配置数据的文件中读取配置信息,所以 ConfigMap 是可以支持这两种读取方式的。

912e3802cc8bb9b73a19513f0b0ec339.png

创配置 ConfigMap 的注意事项

众所周知,ConfigMap 与 Secret 很相似。但是,ConfigMap 主要用来存储和共享非敏感、未加密的配置信息。Secret 是用来存储敏感信息(例如:密码)。除了这个大家都了解的注意事项外,在配置 ConfigMap 时还要注意以下 4 点:

  • ConfigMap 必须在被 Pod 使用之前创建;

  • Pod 只能使用在同一 Namespace 中的 ConfigMap;

  • ConfigMap 大小的配额是一个已经设置好的功能;

  • Kubelet 只支持 API 服务器中的 Pod 使用 ConfigMap。

注:API 服务器中的 Pod 包括用 Kubectl 创建的 Pod、间接通过 replication controller 创建的 Pod,不包括通过 Kubelet 的 –manifest-url 标志创建的 Pod,也不包括从它的 REST API 创建的 Pod。

7a83836b3c3de2025de38408720beaaa.png

ConfigMap 用于动态应用程序的实践

 需要解决的问题 

作为 Kubernetes 安装程序的一部分,很多人希望可以将轻量级文件服务器部署到 Kubernetes 集群中以此处理默认(root - path)入口请求。并且,我认为如果我们可以编辑 index.html 和 CSS 文件而不必重新部署应用程序。

为了解决这个用例,我们决定构建一个 Golang 应用程序,将其部分文件系统映射到 Kubernetes ConfigMap 资源中。

 Golang Fileserver 

文件服务器应用程序的设计非常简单,它仅用于提供静态内容。这种方式可以帮助 Kubernetes 用户使用入口功能。

package main import ( “log” “net/http” ) func main() { fs := http.FileServer(http.Dir(“html”)) http.Handle(“/”, fs) log.Println(“Listening…”) http.ListenAndServe(“:8080”, nil) }

应用程序使用以下 Dockerfile 内容构建容器镜像。它是一个两阶段的 Dockerfile,首先在 Alpine 容器中执行 Golang 构建,然后将已编译的二进制和空 helm 目录复制到最终的 scratch-based 镜像上。

# build stage   FROM golang:alpine AS builder   WORKDIR /usr/local/go/src   COPY  main.go .   RUN CGO_ENABLED=0 GOOS=linux go build -o main .   # final stage   FROM scratch   WORKDIR /   COPY --from=builder /usr/local/go/src/main main   COPY html html   EXPOSE 8080   ENTRYPOINT ["/main"]

在 Golang 应用程序中使用 scratch 容器来部署 Golang 容器是一种更安全、更轻量级的方法。

 部署和运行 

我使用 make 来自动化 Docker 操作。以下是此应用程序的 Makefile 。

VERSION?= 0.0.1   NAME?=“ingress-default”   AUTHOR?=“Jimmy Ray”   PORT_EXT?= 8080   PORT_INT?= 8080     NO_CACHE?= true   .PHONY:build run stop clean   build:   docker build -f scratch.dockerfile.-t $(NAME)\:$(VERSION) -  no-cache = $(NO_CACHE) run:   docker   run --name $(NAME)-d -p $(PORT_EXT):$(PORT_INT)$(NAME) \:$(VERSION)&& docker ps -a --format“{{.ID}} \ t {{.Names}}”| grep $(NAME)   stop:   docker rm $$(docker stop $$(docker ps) -a -q --filter“ancestor = $(NAME):$(VERSION)” -  format =“{{.ID}}”))   clean:   @rm -f main   DEFAULT:build

我们可以使用 make  消除重复任务之间的可变性。有了上述的 Makefile,在将测试的应用程序部署到 Kubernetes 之前,我们可以在 Docker 中构建和运行应用程序。

 配置 Kubernetes 

对于此解决方案,我们需要配置 Kubernetes Namespace、ConfigMap、Deployment、Service 和 Ingress。我们通过使用 kubectl apply -f 的方法来完成此操作(这是对 Kubernetes 集群资源应用更改的声明式方法)。

下面是我们将 munge 的 Kubernetes 资源的 YAML 文件。

apiVersion: v1   kind: Namespace   metadata:    name: ingress-default  labels:      app: ingress-default   ---   kind: ConfigMap   apiVersion: v1   metadata:    name: ingress-default-static-files    namespace: ingress-default    labels:      app: ingress-default   data:    index.html: |                                        Cluster Ingress Index                                    

                         Kubernetes Platform                                                                        

Cluster Ingress Index

                                                                                                                                           

The following are links to this cluster's ingress resources:

                                                                                               Root IngressOther Ingress                                                                                      main.css: |      body {        background-color: rgb(224,224,224);        font-family: Verdana, Arial, Helvetica, sans-serif;        font-size: 100%;      }      .class1 {    ...    }      .class2 {    ...    }      .class3 {    ...    }      .class4 {       ...    }   ---   apiVersion: apps/v1   kind: Deployment   metadata:    labels:      app: ingress-default    name: ingress-default    namespace: ingress-default spec:    selector:      matchLabels:        app: ingress-default    replicas: 1    template:      metadata:        labels:          app: ingress-default          name: ingress-default      spec:        containers:          - name: ingress-default            image:            imagePullPolicy: Always            resources:              limits:                cpu: 100m                memory: 10Mi              requests:                cpu: 100m                memory: 10Mi            volumeMounts:              - readOnly: true                mountPath: html                name: html-files        volumes:          - name: html-files            configMap:              name: ingress-default-static-files   ---   kind: Service   apiVersion: v1   metadata:    name: ingress-default    namespace: ingress-default    labels:      app: ingress-default   spec:    selector:      app: ingress-default    ports:    - name: http      protocol: TCP      port: 80      targetPort: 8080   ---   apiVersion: extensions/v1beta1   kind: Ingress   metadata:    name: default-ingress    namespace: ingress-default    annotations:      nginx.ingress.kubernetes.io/rewrite-target: /      kubernetes.io/ingress.class: "nginx"      labels:      app: ingress-default   spec:    rules:    - http:        paths:        - path: /          backend:            serviceName: ingress-default            servicePort: 80

正如在 YAML 中的:

ingress-default-static-files 

我们可以知道,ConfigMap 包含index.html 和 main.css 文件的内容。通过编辑或替换此 ConfigMap,我们可以更改在 Golang 文件服务器应用程序中的文件。

 使用 ConfigMap 作为卷 

在 Docker 和 Kubernetes 的中,卷用于解决两个问题:

  • 需要持久化的文件系统;

  • 需要在容器之间共享的文件系统。

现在,我们将已部署在容器中的卷映射到 ConfigMap 资源中。在下面的代码段中,被配置的 html-files 卷可能被 Pod 中的所有容器使用。

卷会将数据配置映射到 ConfigMap 中的 ingress-default-static-files 上。

...volumes:       - name: html-files         configMap:           name: ingress-default-static-files…

在 Pod 级别配置卷后,我们将配置的卷装入容器中。将此卷的挂载映射到在 Pod 中配置的 html-files 卷上。通过此映射,应用程序容器现在可以访问 ConfigMap 中的两个文件:html/index.html 和 html/mian.css。

...volumeMounts:       - readOnly: true         mountPath: html         name: html-files

当在 Kubernetes 集群中启动 Golang 应用程序时,ingress-default 会在 NGINX 入口控制器中配置上游规则。生成的路径将通过 NGINX 入口控制器将集群边缘连接到ingress-default 服务上。此服务指向 Golang 文件服务的 app Pod 中。在运行时,它为 ingress 控制器的根路径上的默认 Web 应用程序提供服务。如果需要更改此网页,我们只需要 edit/replace ConfigMap。

 结语 

容器编排的一个关键好处是,它承诺消除多个容器工作负载所需的“无差异的繁重工作”。通过使用 Kubernetes 声明性配置功能(如 ConfigMap),可以提高应用程序部署和更改集群状态的效率与速度。我们通过将 ConfigMap 资源作为已安装的卷,使用正在运行的容器,可以从容器中抽象配置和内容,减少对镜像重构和重新部署容器的需求。

今天的技术实践分享就到这里了。小伙伴们,社区后续还会分享更多关于 ConfigMap 与 Secret 的实践教程哦。敬请期待吧!

参考文献

1.https://medium.com/capital-one-tech/using-kubernetes-configmap-resources-for-dynamic-apps-9e23ef589121

2.https://blog.csdn.net/sjyu_ustc/article/details/80463713 

END

推荐阅读:

3 小时入门 Kubernetes,容器编排详细指南(上)

K8S 网络插件(CNI)超过 10Gbit/s 的基准测试结果

KubeCon 直击:etcd 正式成为 CNCF 孵化项目

K8S 1.13 重磅发布|全面解读 20 个重大功能更新

Envoy 成为 CNCF 第三个毕业项目

网易云不同场景 K8S 网络实践方案

KubeCon 中国首秀|全面解读 7 大 Keynote 带你看穿 K8S 新时代

当当网专家详述如何利用 K8S 构建自主可控的 FaaS 平台

深入理解 K8S APIServer 运行时及代码重构

b2995d45dcb1151896a23da58d1581fb.png

b7219a3c45f93b69915cdeb5ebfe9843.png我怎么这么好看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python教材答案第六章_python第六章{输入和输出}

输出 用print加上字符串,就可以向屏幕上输出指定的文字。比如输出hello, world,用代码实现如下: >>>print hello, world print语句也可以跟上多个字符串,用逗号“,”隔开,就可以连成一串输出: >…

字长16位的计算机表示最大整数_废话不多说跪送计算机选择8前十题

1.字长是CPU的主要性能指标之一,它表示(a)a.CPU—一次能处理二进制数据的位数b.最长的十进制整数的位数c.最大的有效数字位数d.计算结果的有效数字长度答案解析【解析】字长是指计算机运算部件一次能同时处理的二进制数据的位数。2.字长为7位的无符号二进制整数能表示的十进制整…

节点name在graph中无法展示_图节点分类与消息传递

Message passing and node classification本文主要解决的问题:给定一个网络, 其中部分节点有label, 如何能将其他的节点分配对应的节点label呢? (在生活中有很多这样的例子, 比如通过交互行为来判断用户是否…

华为荣耀v20是android10,荣耀V20和荣耀V10买哪个好

随着华为NOVA 4的发布,接下来要期待的就是荣耀V20了。从目前曝光的信息来看,这款手机确实憋了不少大招,而且比华为NOVA 4更好的一点是它搭载的是麒麟980处理器,至于它的价格应该会与华为NOVA 4相近。虽然荣耀V20很诱人&#xff0c…

git配置全局用户名和密码_还在手动打包,手动传jar包?那你确实应该学一下jekins配置了...

本文为小编原创文章,首发于Java识堂微信公众号,一个高原创,高收藏的公众号,转载请联系作者先说jekins能干啥,你把代码放到git上,jekins就能帮你编译代码,并且把jar包放到相应的服务器上&#xf…

python图片横向合并_[宜配屋]听图阁

起因: 有一批数据需要每个月进行分析,数据存储在excel中,行标题一致,需要横向合并进行分析。 数据示意:具有多个代码: # -*- coding: utf-8 -*- """ Created on Sun Nov 12 11:19:03 2017 a…

vue项目android,Android与Vue项目交互

1. Android代码class MainActivity : AppCompatActivity() {private lateinit var callJSBtn: Buttonprivate lateinit var webView: WebViewprivate var ajObject: AjObject AjObject()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceSt…

updatebyprimarykeyselective返回什么是成功_嫦娥五号发射升空成功!!!

嫦娥五号探测器发射成功1聚焦发射当时2020年11月24日4时30分,我国在中国文昌航天发射场,用长征五号遥五运载火箭成功发射探月工程嫦娥五号探测器,火箭飞行约2200秒后,顺利将探测器送入预定轨道,开启我国首次地外天体采…

荣耀v40搭载鸿蒙吗,荣耀V40照常发布,将更换操作系统,同nova8搭载鸿蒙2.0发布...

荣耀系列手机的发布节奏有一定程度的变动,例如荣耀Magic3发布推迟,但是根据消息称,荣耀V40还会照常发布。根据目前华为内部关于麒麟9000的分配来看,主要还是对Mate40和P40使用,其他型号中:nova8 Pro 、荣耀…

chrome java插件_Java程序员喜欢的10款软件里有你在用的吗?

作为一名Java程序员,日常开发的过程中,我们需要借助很多工具来进行编码。好的工具可以极大的提升程序员的工作效率,今天我们来认识下大多数程序员喜欢的10款软件。持不同意见或有想要补充的小伙伴,欢迎评论区交流哦~VSCODE不管你是…

transmac使用方法_Mac苹果电脑降级方法?

最近Mac OS升级到最新系统(Catalina 10.15 19A583)后,出现了各种奇葩问题,更关键的是,很多常用(专业)软件不能使用了,这让大家真的是焦头烂额。如果你笔记本电脑能够正常联网其实,Mac系统本身是提供了一个快速恢复系统…

android 富文本框架_当微擎框架遇上uniapp,以一当十同时开发十个平台项目

随着各类平台异军突起,流量也越来越分散。为了适应时代的发展,不少公司在做产品项目的时候,需要例如网站、公众号、H5、微信小程序、抖音小程序、支付宝小程序、百度小程序、360小程序、快应用、安卓app、苹果app的需求。这么多平台&#xff…

html5写入唯一标识,id - 唯一标识符 - html5全局属性

idid全局属性定义唯一标识符(ID),该标识符在整个文档中必须是唯一的。其目的是在链接(使用片段标识符),脚本或样式(使用CSS)时标识元素。示例A normal, boring paragraph. Try not to fall asleep.The most exciting paragraph on the page. One of a ki…

python 文本相似度_【机器学习】使用gensim 的 doc2vec 实现文本相似度检测

环境 Python3, gensim,jieba,numpy ,pandas 原理:文章转成向量,然后在计算两个向量的余弦值。 Gensim gensim是一个python的自然语言处理库,能够将文档根据TF-IDF, LDA, LSI 等模型转化成向量模…

ubuntu tomcat上传目录权限_等了 3 年,Ubuntu Studio 终于有权限上传更新包

Ubuntu 的衍生版本 Ubuntu Studio 终于选出了两位具有上传更新包权限的开发者。此前就有媒体报导过,Ubuntu Studio 19.04 版本可能会流产,而原因很让人诧异:社区里没有任何一位开发者具有上传更新包的权限。随后 Ubuntu Studio 委员会主席 Er…

计算机主机硬件图片,电脑主机内部有哪些硬件

电脑主机内部有哪些硬件电脑主机里的硬件都有哪些呢,你知道吗?下面将由小编带大家来解答这个疑问吧,希望对大家有所收获!从主机外部看硬件从外边看,主机就是一个扁扁方方的铁盒子,但很多朋友确没有真正了解过它内部到底是什么样子…

springboot profile_SpringBoot简单配置

使用Spring Boot,配置工作将会变得更加简单,我们只需要在application.properties中定义属性,然后在代码中直接使用Value注入即可。 如下:book.authorxxxbook.nameyyy book.pinyin测试这里专门设置了中文,因为中文不做特…

druid jar包_使用druid实现Spring boot配置文件中数据库密码密文存储

通常在编写代码的时候,数据库的用户名和密码以明文的方法写到配置文件中,系统运维为了保证一定的安全性,要求我们在配置文件中使用密文的方式存储,本文主要介绍使用druid实现数据库密码密文显示的方法。一、基本情况druid包中Conf…

k8s 手动恢复redis 集群_高工面试之:redis的几种集群方式你都熟悉吗?

Redis三种集群方式:主从复制、哨兵模式和Cluster模式一、主从复制模式Redis配置成主从模式,主库(Master)只负责客户端的写数据,从库(Slave)只负责客户端的读数据。主从数据复制过程如图所示:主从复制原理:slave redis连…

jsbridge原理_React Hooks 原理与最佳实践

1. 前言React Hooks 是 React 16.8 引入的新特性,允许我们在不使用 Class 的前提下使用 state 和其他特性。React Hooks 要解决的问题是状态共享,是继 render-props 和 higher-order components 之后的第三种状态逻辑复用方案,不会产生 JSX 嵌…