ext js如何动态更改xtype_K8S ConfigMap 用于动态应用程序的实践
編輯:小君君
技術校對:星空下的文仔、bot
在 Kubernetes 中,ConfigMap 是允許管理員將配置組件與鏡像內容解耦,使容器化應用程序產生可移植性的一種資源。ConfigMap?可以與 Kubernetes Pod 一起使用,用于動態添加或更改容器中的使用文件。本文將闡述 Kubernetes ConfigMap?如何利用動態應用程序的方法來解決輕量級文件服務器部署到 Kubernetes 集群中的問題。
通過閱讀本文你將獲得:
ConfigMap?概覽;
配置 ConfigMap 的注意事項;
ConfigMap 資源用于動態應用程序實踐。
ConfigMap?概覽
生產環境中很多應用程序的配置可能需要通過配置文件、命令行參數和環境變量的組合來完成。這些配置應該從鏡像中解耦,通過這種方式來保持容器化應用程序的可移植性。在 Kubernetes 1.2 版本以后,研發人員引入 ConfigMap 來處理這種類型的配置數據。
簡單來說,ConfigMap 是容器的配置管理。在容器運行時,ConfigMap 把配置文件、命令行參數、環境變量、端口號和其他配置組件綁定到 Pod 的容器和系統組件上,同時將應用的代碼和配置區分開。從數據角度來看,ConfigMap 的類型只是鍵值對。從應用角度來看,管理員可以從不同角度來配置它。
在 Pod 中使用 ConfigMap 大致有以下三種方式:
將 ConfigMap 中的數據設置為環境變量;
將 ConfigMap 中的數據設置為命令行參數;
將 ConfigMap 作為文件或目錄掛載。
另外,由于應用會從環境變量和包含配置數據的文件中讀取配置信息,所以 ConfigMap?是可以支持這兩種讀取方式的。
創配置 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。
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 運行時及代碼重構
我怎么這么好看總結
以上是生活随笔為你收集整理的ext js如何动态更改xtype_K8S ConfigMap 用于动态应用程序的实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python周志_Python几周学习内
- 下一篇: presto联合查询mysql和ES_p