最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

軟件開發(fā)人員 Kubernetes 入門指南|Part 2

2023-10-13 09:18 作者:SEAL安全  | 我要投稿

在第 1 部分中,我們講解了 Kubernetes 的核心組件,Kubernetes 是一種開源容器編排器,用于在分布式環(huán)境中部署和擴展應(yīng)用程序;我們還講解了如何在集群中部署一個簡單的應(yīng)用程序,然后更改其副本數(shù)量以擴大或縮小其規(guī)模。
?

在本文中,我們將為您深入講解?Kubernetes 提供的網(wǎng)絡(luò)和監(jiān)控功能,為您將自己的應(yīng)用推廣到具有公開網(wǎng)絡(luò)服務(wù)和良好可觀察性的生產(chǎn)環(huán)境中做準(zhǔn)備。
?

Kubernetes 網(wǎng)絡(luò)功能

Kubernetes 包含一套全面的網(wǎng)絡(luò)功能,用于將 Pod 連接在一起,并讓它們在集群外可見。這里總結(jié)了一些較常使用的基礎(chǔ)組件。
?

Service

Service 是 Kubernetes 對象,用于公開在集群中的 Pod 中運行的網(wǎng)絡(luò)應(yīng)用程序。網(wǎng)絡(luò)流量流經(jīng)服務(wù),被引到正確的 Pod。
?

Service 有時會讓開發(fā)人員感到困惑,因為其術(shù)語有時會與傳統(tǒng)觀點重疊。開發(fā)人員通常認(rèn)為 Service 就是他們在集群中運行的應(yīng)用程序,但在 Kubernetes 中,Service 具體是指允許訪問應(yīng)用程序的網(wǎng)絡(luò)組件,是將 Kubernetes 對象聯(lián)網(wǎng)的基本資源。在部署工作負(fù)載時,如果 Pods 需要在它們之間或集群外部進(jìn)行通信,就需要使用服務(wù)。
?

Serivce 模型在部署副本之間分配流量時需要被使用到。例如,如果您為一個應(yīng)用程序接口部署了四個副本,那么這四個 Pod 就應(yīng)該共享網(wǎng)絡(luò)流量。創(chuàng)建 Service 可以實現(xiàn)這一點,您的應(yīng)用程序可以連接到服務(wù)的 IP 地址,然后該 IP 地址會將網(wǎng)絡(luò)流量轉(zhuǎn)發(fā)到其中一個兼容的 Pod。每個 Service 還分配了一個可預(yù)測的集群內(nèi) DNS 名稱,以方便自動發(fā)現(xiàn)服務(wù)。
?


?

Kubernetes 支持幾種不同類型的 Service,以適應(yīng)常見的網(wǎng)絡(luò)用例。主要有三種:

  • ClusterIP:這種類型的服務(wù)分配了一個 IP 地址,只能在群集內(nèi)訪問。這可以防止 Pod 被外部調(diào)用。由于這是最安全的服務(wù)類型,因此在未指定其他服務(wù)類型時,它也是默認(rèn)服務(wù)類型。

  • NodePort:這些服務(wù)也會分配一個內(nèi)部 IP 地址,但會額外綁定到節(jié)點上的指定端口。如果在端口 80 上創(chuàng)建了?NodePort?服務(wù),且其 Pod 由節(jié)點?192.168.0.1托管,則可以通過本地網(wǎng)絡(luò)上的?192.168.0.1:80?連接到 Pod。

  • LoadBalancerLoadBalancer?Service 將外部 IP 地址映射到群集中。在使用亞馬遜 EKS 或 Google GKE 等托管 Kubernetes 解決方案時,創(chuàng)建LoadBalancer?Service 會自動在云賬戶中提供一個新的LoadBalancer資源。LoadBalancer?公共 IP 的流量會路由到 Service 背后的 Pod。當(dāng)打算將 Pod 公開暴露在群集之外時,請使用此 Service 類型。LoadBalancer?允許您首先在群集的物理節(jié)點之間路由流量,然后將流量路由到每個節(jié)點上的正確 Pod。
    ?

1. 創(chuàng)建 Service
?

下面的 YAML 清單示例定義了一個?ClusterIP?服務(wù),該服務(wù)將其 80 端口的流量導(dǎo)向帶有?app.kubernetes.io/name: demo?標(biāo)簽的 Pod 的 8080 端口:

<span class="hljs-attribute">apiVersion</span>: v1<span class="hljs-attribute">kind</span>: Service<span class="hljs-attribute">metadata</span>: ?<span class="hljs-attribute">name</span>: demo<span class="hljs-attribute">spec</span>: ?<span class="hljs-attribute">selector</span>: ? ?app.kubernetes.io/<span class="hljs-attribute">name</span>: demo ?<span class="hljs-attribute">ports</span>: ? ?- <span class="hljs-attribute">protocol</span>: TCP ? ? ?<span class="hljs-attribute">port</span>: <span class="hljs-number">80</span> ? ? ?<span class="hljs-attribute">targetPort</span>: <span class="hljs-number">8080</span>

?

將文件保存為?service.yaml,然后使用 kubectl 將其應(yīng)用到集群中:

$ kubectl <span class="hljs-built_in">apply</span> -f service.yaml service/<span class="hljs-built_in">demo</span> created

?

運行?get services?命令顯示分配給 Service 的群集 IP:

$ kubectl get services NAME ? ? ? ? TYPE ? ? ? ?CLUSTER-IP ? ? ?EXTERNAL-IP ? PORT(S) ? AGE demo ? ? ? ? ClusterIP ? <span class="hljs-number">10.99</span><span class="hljs-number">.219</span><span class="hljs-number">.177</span> ? &lt;none&gt; ? ? ? ?<span class="hljs-number">80</span>/TCP ? ?<span class="hljs-number">10</span>s

?

集群中的 Pod 現(xiàn)在可以與該 IP 地址(10.99.219.177)通信,以連接標(biāo)有?app.kubernetes.io/name: demo?的相鄰 Pod。由于 Service 會自動發(fā)現(xiàn),您還可以使用分配給它的 DNS 主機名訪問服務(wù),其形式為

<service-name>.<namespace-name>.svc.<cluster-domain>

?

在本例中,主機名為
demo.default.svc.cluster.local。

?

2. 針對內(nèi)部和外部 IP 使用正確的 Service 類型
?

不同情況不同選擇,正確的 Service 類型取決于您需要實現(xiàn)的目標(biāo)。
?

如果 Pod 只需要在集群內(nèi)部訪問,例如其他集群內(nèi)應(yīng)用程序使用的數(shù)據(jù)庫,則使用?ClusterIP?即可。這樣可以防止 Pod 意外暴露在外部,提高集群安全性。對于應(yīng)從外部訪問的應(yīng)用程序,如 API 和網(wǎng)站部署,則應(yīng)使用?LoadBalancer。
?

NodePort?Service 需要謹(jǐn)慎。它們允許你設(shè)置自己的負(fù)載平衡解決方案,但經(jīng)常被誤用而造成意想不到的后果。當(dāng)你手動指定端口范圍時,請確保避免沖突。NodePort?服務(wù)還會繞過大多數(shù) Kubernetes 網(wǎng)絡(luò)安全控制,讓 Pod 暴露在外。
?

Ingress資源

Service 只能在 IP 和端口級別上運行,因此它們通常與 Ingress 對象配對。Ingress 是用于 HTTP 和 HTTPS 路由的專用資源。Ingress 根據(jù)主機名和 URI 等請求特征,將 HTTP 流量映射到集群中的不同服務(wù)。它們還提供負(fù)載平衡和 SSL 終止功能
?

重要的是,Ingresses 本身并不是服務(wù)。它們位于服務(wù)前面,將服務(wù)暴露給外部流量。您可以使用 LoadBalancer 服務(wù)直接公開一組 Pod,但這會在沒有任何過濾或路由支持的情況下推送流量。而使用 Ingress,您可以在服務(wù)之間切換流量,例如將?api.example.com?發(fā)送到您的 API 以及將?app.example.com?發(fā)送到您的前端。
?

要使用 Ingress,必須在集群中安裝一個 Ingress 控制器。它負(fù)責(zé)將傳入流量與您的 Ingress 對象進(jìn)行匹配。
?

Kubernetes 默認(rèn)情況下不捆綁任何選項;NGINX Ingress 和 Traefik 是易于配置的推薦選項。

?

Ingress 定義了一個或多個 HTTP 路由及其映射到的 Service。下面是一個將來自?example.com?的流量導(dǎo)向您的?demo?服務(wù)的基本示例:

<span class="hljs-attribute">apiVersion</span>: networking.k8s.io/v1<span class="hljs-attribute">kind</span>: Ingress<span class="hljs-attribute">metadata</span>: ?<span class="hljs-attribute">name</span>: demo<span class="hljs-attribute">spec</span>: ?<span class="hljs-attribute">ingressClassName</span>: nginx ?<span class="hljs-attribute">rules</span>: ? ?- <span class="hljs-attribute">host</span>: example.com ? ? ?<span class="hljs-attribute">http</span>: ? ? ? ?<span class="hljs-attribute">paths</span>: ? ? ? ? ?- <span class="hljs-attribute">path</span>: / ? ? ? ? ? ?<span class="hljs-attribute">pathType</span>: Prefix ? ? ? ? ? ?<span class="hljs-attribute">backend</span>: ? ? ? ? ? ? ?<span class="hljs-attribute">service</span>: ? ? ? ? ? ? ? ?<span class="hljs-attribute">name</span>: demo ? ? ? ? ? ? ? ?<span class="hljs-attribute">port</span>: ? ? ? ? ? ? ? ? ?<span class="hljs-attribute">number</span>: <span class="hljs-number">80</span>

?

spec.ingressClassName?的正確值取決于您使用的 Ingress 控制器。
?

網(wǎng)絡(luò)策略

網(wǎng)絡(luò)策略是一種機制,用于控制哪些 Pod 可以相互聯(lián)網(wǎng)。在沒有網(wǎng)絡(luò)策略的情況下,無論 Pods 是否被 Service 公開,都可以自由通信。
?

每個策略使用選擇器(selector)針對一個或多個 Pod。策略可以列出單獨的 Ingress 和 Egress 規(guī)則:?Ingress規(guī)則定義目標(biāo) Pod 可以從哪些 Pod 接收流量;Egress 規(guī)則限制目標(biāo) Pod 的流量流向
?

下面是一個示例:

<span class="hljs-attribute">apiVersion</span>: networking.k8s.io/v1<span class="hljs-attribute">kind</span>: NetworkPolicy<span class="hljs-attribute">metadata</span>: ?<span class="hljs-attribute">name</span>: demo-policy<span class="hljs-attribute">spec</span>: ?<span class="hljs-attribute">podSelector</span>: ? ?<span class="hljs-attribute">matchLabels</span>: ? ? ?<span class="hljs-attribute">app-component</span>: database ?<span class="hljs-attribute">policyTypes</span>: ? ?- Ingress ? ?- Egress ?<span class="hljs-attribute">ingress</span>: ? ?- <span class="hljs-attribute">from</span>: ? ? ? ?- <span class="hljs-attribute">ipBlock</span>: ? ? ? ? ? ?<span class="hljs-attribute">cidr</span>: <span class="hljs-number">172.17</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">16</span> ? ? ? ?- <span class="hljs-attribute">podSelector</span>: ? ? ? ? ? ?<span class="hljs-attribute">matchLabels</span>: ? ? ? ? ? ? ?<span class="hljs-attribute">app-component</span>: api ? ? ?<span class="hljs-attribute">ports</span>: ? ? ? ?- <span class="hljs-attribute">protocol</span>: TCP ? ? ? ? ?<span class="hljs-attribute">port</span>: <span class="hljs-number">3306</span> ?<span class="hljs-attribute">egress</span>: ? ?- <span class="hljs-attribute">to</span>: ? ? ? ?- <span class="hljs-attribute">ipBlock</span>: ? ? ? ? ? ?<span class="hljs-attribute">cidr</span>: <span class="hljs-number">172.17</span>.<span class="hljs-number">0.0</span>/<span class="hljs-number">16</span> ? ? ? ?- <span class="hljs-attribute">podSelector</span>: ? ? ? ? ? ?<span class="hljs-attribute">matchLabels</span>: ? ? ? ? ? ? ?<span class="hljs-attribute">app-component</span>: api ? ? ?<span class="hljs-attribute">ports</span>: ? ? ? ?- <span class="hljs-attribute">protocol</span>: TCP ? ? ? ? ?<span class="hljs-attribute">port</span>: <span class="hljs-number">3306</span>

?

該策略規(guī)定,只有標(biāo)有?app-component: api?的 Pod 可以與標(biāo)有?app-component: database?的 Pod 通信。
?

策略可以包括多個 Ingress 和 Egress 規(guī)則,也可以選擇完全忽略一種流量類型。如果流量類型被排除在外,過濾則不適用。如果多個網(wǎng)絡(luò)策略針對一個 Pod,那么流量需要滿足組合列表中的每一條規(guī)則。
?

為所有 Pod 設(shè)置網(wǎng)絡(luò)策略是一種良好做法。這樣有助于防止受到攻擊的 Pod 向群集中的其他工作負(fù)載發(fā)送惡意流量。雖然默認(rèn)情況下流量不進(jìn)行過濾,但您可以創(chuàng)建名稱空間級的?deny all?規(guī)則,防止與缺乏更具體策略的 Pod 進(jìn)行通信:

<span class="hljs-symbol">apiVersion:</span> networking.k8s.io/v1<span class="hljs-symbol">kind:</span> NetworkPolicy<span class="hljs-symbol">metadata:</span><span class="hljs-symbol"> ?name:</span> deny-all<span class="hljs-symbol">spec:</span><span class="hljs-symbol"> ?podSelector:</span> {}<span class="hljs-symbol"> ?policyTypes:</span> ? ?- Ingress ? ?- Egress

?

Secrets 和 ConfigMap

Kubernetes 集群中的工作負(fù)載經(jīng)常使用到機密信息,如數(shù)據(jù)庫密碼和 API 密鑰。這些值一旦暴露,就會構(gòu)成嚴(yán)重的安全威脅。Kubernetes ConfigMap 對象是向 Pod 提供鍵值數(shù)據(jù)的標(biāo)準(zhǔn)方式。它們封裝了 Pod 所需的任意配置值。
?

下面是帶有幾個數(shù)據(jù)字段的簡單 ConfigMap 的 YAML 定義:

<span class="hljs-symbol">apiVersion:</span> v1<span class="hljs-symbol">kind:</span> ConfigMap<span class="hljs-symbol">metadata:</span><span class="hljs-symbol"> ?name:</span> app-config<span class="hljs-symbol">data:</span><span class="hljs-symbol"> ?default_auth_token_lifetime:</span> <span class="hljs-number">900</span><span class="hljs-symbol"> ?default_user_name:</span> <span class="hljs-string">"admin"</span><span class="hljs-symbol"> ?external_auth_enabled:</span> true

?

你可以在 Pod 中以環(huán)境變量或掛載卷的形式使用 ConfigMap。前一種策略允許你通過訪問命名的環(huán)境變量來檢索 ConfigMap 密鑰的值,而后一種策略則使用掛載卷將 ConfigMap 的內(nèi)容存入容器文件系統(tǒng)中的文件。
?

由于 ConfigMap 數(shù)據(jù)是以純文本形式未加密存儲的,因此用戶不會將其用于密碼和 API 密鑰等用途。相反,在與敏感數(shù)據(jù)交互時,請創(chuàng)建一個 Secret 對象。Secrets 對象的工作原理與 ConfigMap 類似,但它們是專為更安全的憑證處理而設(shè)計的。Secrets 對象默認(rèn)以 Base64 編碼顯示值,并將其與應(yīng)用程序的常規(guī)配置分開,從而降低了無意暴露的風(fēng)險。這樣就能最大限度地降低意外暴露的風(fēng)險。
?

你可以在啟動集群時配置 Kubernetes API 服務(wù)器,選擇啟用 Secrets 數(shù)據(jù)加密。
?

Kubernetes 中的監(jiān)控和日志記錄

繼安全性之后,有效的監(jiān)控和日志記錄功能應(yīng)成為 Kubernetes 的下一個優(yōu)先事項。對工作負(fù)載性能的良好可見性能讓你在新出現(xiàn)的問題造成更大問題之前快速做反應(yīng)。您可以使用指標(biāo)、警報日志來跟蹤集群活動。
?

Metrics API

Kubernetes Metrics Server 是一個可以安裝在集群中的插件。它提供一個 API,用于從節(jié)點和 Pod 中提取資源利用率數(shù)據(jù)。
?

運行以下 kubectl 命令來部署 Metrics Server:

$ kubectl apply -f https:<span class="hljs-regexp">//gi</span>thub.com<span class="hljs-regexp">/kubernetes-sigs/m</span>etrics-server<span class="hljs-regexp">/releases/</span>latest<span class="hljs-regexp">/download/</span>components.yaml

?

安裝完成后,使用?kubectl top?查看集群節(jié)點和 Pod 的 CPU 和內(nèi)存利用率:

$ kubectl top nodes NAME ? ? ? CPU(cores) ? CPU% ? MEMORY(bytes) ? MEMORY% ? minikube ? <span class="hljs-number">265</span>m ? ? ? ? <span class="hljs-number">6</span>% ? ? <span class="hljs-number">640</span>Mi ? ? ? ? ? <span class="hljs-number">8</span>% $ kubectl top pod NAME ? ?CPU(cores) ? MEMORY(bytes) ? nginx ? <span class="hljs-number">0</span>m ? ? ? ? ? <span class="hljs-number">4</span>Mi

?

Kube State Metrics 是另一個度量數(shù)據(jù)源。它提供與集群內(nèi)對象相關(guān)的指標(biāo),如運行中的部署、失敗的 Pod 和有效任務(wù)的數(shù)量。
?

警報和儀表板

如果你必須手動查詢才能獲得所需的信息,那么度量指標(biāo)就不會特別有用。而設(shè)置警報和儀表板可確保您了解重要的集群事件,如資源利用率攀升或 Pod 出現(xiàn)故障。
?

Kubernetes 項目沒有為這些功能提供內(nèi)置解決方案。因此最好部署一個專用的可觀察性平臺,如 Prometheus。Prometheus 的 Alertmanager 可以在特定事件發(fā)生時向通信平臺發(fā)送通知。將 Prometheus 與 Grafana 等儀表盤工具搭配使用,可將數(shù)據(jù)可視化并發(fā)現(xiàn)指標(biāo)趨勢。
?

設(shè)置操作儀表盤是監(jiān)控集群的有效方法,可讓您對 Kubernetes 和應(yīng)用程序的健康狀況和性能一目了然。
?

日志整合

顯然,了解指標(biāo)變化或 Pod 失效的原因至關(guān)重要,應(yīng)用程序生成的日志應(yīng)該能揭示這些信息。
?

您可以使用?kubectl logs?命令按 Pod 檢索日志,但使用 Fluentd、Logstash 或 Loki 等整合工具可以更輕松地收集、過濾和歸檔記錄。這些解決方案能將集群中的日志流式傳輸?shù)絾为毜拇鎯ζ脚_,以供長期參考。
?

日志整合還能讓搜索日志和分析重復(fù)消息變得更容易。它們會對報文內(nèi)容進(jìn)行索引,因此您無需使用 shell 工具手動解析日志,就能對其進(jìn)行查詢。這有助于您發(fā)現(xiàn)應(yīng)用程序中的新錯誤,追蹤問題的根本原因,并在出現(xiàn)異常時及時發(fā)現(xiàn)。
?

總 結(jié)

本系列由兩部分組成,介紹了 Kubernetes 的基礎(chǔ)知識,包括為什么它是開發(fā)人員亟需的技能,以及它的抽象如何有效地模擬不同的應(yīng)用組件。通過該文章,您應(yīng)該已經(jīng)了解了如何創(chuàng)建部署、設(shè)置網(wǎng)絡(luò)和安全以及監(jiān)控集群內(nèi)的工作負(fù)載。
?

無論您是從事開發(fā)還是運維工作,Kubernetes 知識都很有價值。它能讓你更深入地了解云原生應(yīng)用如何在生產(chǎn)中運行、操作員為何偏愛某些技術(shù)、哪里可能出現(xiàn)問題,以及您的系統(tǒng)如何映射到基礎(chǔ)設(shè)施資源。當(dāng)然,使用本地 Kubernetes 集群進(jìn)行開發(fā)也有助于避免環(huán)境之間的差異。
?

參考鏈接
https://komodor.com/blog/a-software-developers-guide-to-getting-started-with-kubernetes-part-1/

?


軟件開發(fā)人員 Kubernetes 入門指南|Part 2的評論 (共 條)

分享到微博請遵守國家法律
望城县| 济阳县| 剑河县| 华蓥市| 泾源县| 扎囊县| 炉霍县| 丽江市| 贵南县| 聊城市| 五河县| 许昌市| 巴楚县| 安义县| 新乡县| 郎溪县| 黑山县| 文登市| 丰顺县| 屏南县| 邢台市| 吉木乃县| 明水县| 司法| 峨眉山市| 丰顺县| 策勒县| 枣强县| 贵州省| 昌平区| 邛崃市| 宿迁市| 葵青区| 陕西省| 呼和浩特市| 舒兰市| 桃园市| 文山县| 泾川县| 梧州市| 西吉县|