1. 程式人生 > >如何使用名稱空間管理Kubernetes資源?

如何使用名稱空間管理Kubernetes資源?

640

本文是Google Developer Advocate Sandeep Dinesh的七部分視訊和部落格系列的第二篇,介紹如何充分利用您的Kubernetes環境。
第一篇:如何構建儘可能小的容器映象?
當您開始在Kubernetes之上構建越來越多的服務時,簡單的任務開始變得更加複雜。 例如,團隊無法建立具有相同名稱的Kubernetes Service或Deployment。 如果你有成千上萬的Pod,只是列出它們都需要一些時間,更不用說實際管理它們了!當然,這些還只是冰山一角。
在本期Kubernetes最佳實踐中,讓我們來看看如何使用Kubernetes名稱空間來更輕鬆地管理您的Kubernetes資源。


什麼是名稱空間(Namespace)?

640

您可以將名稱空間視為Kubernetes叢集中的虛擬叢集。 您可以在單個Kubernetes叢集中擁有多個名稱空間,並且它們在邏輯上彼此隔離。 他們可以為您和您的團隊提供組織,安全甚至效能方面的幫助!
預設名稱空間(Default Namespace)

640

在大多數Kubernetes發行版中,叢集開箱即用,名稱空間預設為default。事實上,Kubernetes上有三個名稱空間:default、kube-system(用於Kubernetes元件)和kube-public( 用於公共資源)。 kube-public現在並沒有真正使用過,而且通常單獨隔離一個kube-system是個好主意,尤其是在Google Kubernetes Engine這樣的託管系統中。 預設名稱空間是你建立服務和應用程式的預設位置,如果你不指定namespace引數的話。
這個名稱空間絕對沒有什麼特別之處,只是Kubernetes工具是開箱即用的設定使用這個名稱空間,而且你無法刪除它。 它很適合入門和小型生產系統,我建議不要在大型生產系統中使用它。 這是因為團隊很容易在沒有意識到的情況下,意外地覆蓋或破壞其他服務。 相反,我們應該建立多個名稱空間並使用它們來將服務劃分為可管理的塊。
建立名稱空間

640

不要害怕建立名稱空間。 它們不會增加效能損失,而且實際上,在許多情況下它們可以提高效能,因為這樣的話Kubernetes API使用的是較小的物件集合。
可以使用單個命令來建立名稱空間。 如果你想建立一個名為test的名稱空間,你可以執行如下命令:
kubectl create namespace test

或者您可以像建立其他任何Kubernetes資源一樣,建立一個YAML檔案並應用它。
test.yaml:
kind: Namespace
apiVersion: v1
metadata:
  name: test
  labels:
    name: test
kubectl apply -f test.yaml

檢視名稱空間

640

您可以使用以下命令檢視所有名稱空間:
kubectl get namespace
640
如上圖,您可以看到三個內建名稱空間,以及名為test的新名稱空間。
在名稱空間中建立資源

640

讓我們看一個簡單的YAML,它用來建立一個Pod:
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
    name: mypod
spec:
  containers:
  - name: mypod
    image: nginx

您可能會注意到在任何地方都沒有提到名稱空間。 如果在此檔案上執行kubectl apply,它將在當前活動的名稱空間中建立Pod。 除非您更改它,否則這將是“預設”名稱空間。
有兩種方法可以明確告訴Kubernetes您要在哪個Namespace中建立資源。
一種方法是在建立資源時設定namespace標識:
kubectl apply -f pod.yaml --namespace=test

您還可以在YAML宣告中指定名稱空間:
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: test
  labels:
    name: mypod
spec:
  containers:
  - name: mypod
    image: nginx

如果在YAML宣告中指定名稱空間,則將始終在該名稱空間中建立資源。如果您嘗試使用namespace標誌來設定另一個名稱空間,則該命令將會失敗。
在名稱空間中檢視資源

640

如果你試圖找到你的Pod,你可能會注意到你不能!
$ kubectl get pods
No resources found.

這是因為所有命令都是針對當前active的名稱空間執行的。 要查詢Pod,您需要指定namespace。
$ kubectl get pods --namespace=test
NAME      READY     STATUS    RESTARTS   AGE
mypod     1/1       Running   0          10s

這可能會很快讓人覺得很煩,特別是如果您是一個開發團隊的開發人員,該團隊使用自己的名稱空間來處理所有事情,並且不希望對每個命令都指定namespace。 讓我們看看我們如何解決這個問題。
管理active名稱空間

640

初始狀態下,您的活動名稱空間是default。 除非在YAML中指定名稱空間,否則所有Kubernetes命令都將使用當前active名稱空間。
不幸的是,嘗試使用kubectl管理您的active名稱空間可能會很痛苦。 幸運的是,有一個非常好的工具叫做kubens(由優秀的Ahmet Alp Balkan建立)可以讓它變得輕而易舉!
執行kubens命令時,您應該看到所有名稱空間,並突出顯示active名稱空間:
640
要將active名稱空間切換到test名稱空間,請執行:
kubens test

現在您可以看到test名稱空間處於active狀態:
640
現在,如果你執行kubectl命令,名稱空間將是test而不是default!
這意味著您不需要指定名稱空間來檢視測試名稱空間中的Pod。
$ kubectl get pods
NAME      READY     STATUS    RESTARTS   AGE
mypod     1/1       Running   0          10m

跨名稱空間通訊

640

名稱空間彼此“隱藏”,但預設情況下它們不是完全隔離的。一個名稱空間中的服務可以與另一個名稱空間中的服務進行通訊。 這通常非常有用,例如讓您的團隊的服務(在您的名稱空間中)與另一個團隊的服務(在另一個名稱空間中)進行通訊。
當您的應用想要訪問Kubernetes Service時,您可以使用內建的DNS服務發現,只需將您的應用指向該Service的名稱即可。 但是,您可以在多個名稱空間中建立具有相同名稱的Service!值得慶幸的是,通過使用擴充套件形式的DNS地址很容易解決這個問題。
Kubernetes中的服務使用通用DNS模式公開其endpoint。 它看起來像這樣:
<Service Name>.<Namespace Name>.svc.cluster.local

通常,您只需要服務名稱,DNS將自動解析為完整地址。 但是,如果需要訪問另一個名稱空間中的服務,則需使用服務名稱加上名稱空間名稱。
例如,如果要連線到test名稱空間中的database服務,可以使用以下地址:
database.test

如果要連線到production名稱空間中的database服務,可以使用以下地址:
database.production

警告:如果您建立一個對映到“com”或“org”等TLD的名稱空間,然後建立一個與網站名稱相同的服務,例如“google”或“reddit”,Kubernetes將攔截“google.com“或”reddit.com“的請求並將其傳送到您的服務。 這通常對於測試和代理非常有用,但也可以輕鬆破壞叢集中的內容!
注意:如果確實要隔離名稱空間,則應使用網路策略(Network Policies)來完成此操作。 更多資訊請繼續關注未來劇集!
命令空間粒度

640

一個常見問題是要建立多少個名稱空間以及用於何種目的。 什麼是可管理的塊? 建立太多的名稱空間,它們會讓你變得沒有效率,但是建立太少,你會錯過它們的好處。
我認為答案在於您的專案或公司處於什麼階段 ——從小團隊到成熟企業,每個階段都有自己的組織架構。 根據您的具體情況,您可以採用對應的名稱空間策略。
小團隊
在這種情況下,您是一個小團隊的一員,該團隊正在開發5-10個微服務,可以輕鬆地進行團隊溝通。 在這種情況下,將所有生產服務放到“預設”名稱空間是個不錯的選擇。 根據你的個人喜好,你可能希望有一個production和development的名稱空間,但你很有可能是在本地機器上使用類似Minikube搭建的開發環境。
快速成長的團隊
在這種情況下,您有一個快速發展的團隊,正在開發10多個微服務。 您開始將團隊分成多個子團隊,每個團隊都擁有自己的微服務。 雖然每個人都可能知道整個系統是如何工作的,但是與其他人協調每一個變化變得越來越困難。 嘗試在本地計算機上啟動整個堆疊每天都變得越來越複雜。
此時有必要使用多個叢集或名稱空間進行生產和開發。 每個團隊可以選擇擁有自己的名稱空間,以便於管理。
大公司
在一家大公司,並不是每個人都瞭解其他人。 某個團隊正致力於其他團隊可能不瞭解的功能。 團隊可能正在使用服契約(service contract)與其他微服務通訊(例如,gRPC),也有可能使用服務網格(Service Mesh)進行通訊(例如,istio)。 試圖在本地執行整個堆疊是不可能的。 強烈建議使用Kubernetes-aware Continuous Delivery系統(例如,Spinnaker)。
此時,每個團隊肯定需要自己的名稱空間。 每個團隊甚至可以選擇多個名稱空間來執行其開發和生產環境。 設定RBAC和ResourceQuotas也是一個好主意。 多個叢集開始顯得很有意義,但可能不一定是必要的。
注意:我將在後面的文章中深入研究gRPC、Istio、Spinnaker、RBAC和Resources!
企業
在這種規模下,有些群體甚至不知道其他群體的存在。 某個組也可能是外部公司,服務之間通過標準文件定義的API來通訊。 每個小組都有多個擁有一定數量微服務的團隊。 這時使用我上面提到的所有工具是必要的。 人們不應該手工部署服務,同時應該被鎖定在他們不擁有的名稱空間之外。此時,擁有多個叢集以減少配置不當的應用程式導致的爆炸半徑,以及簡化計費和資源管理可能是有意義的。
結論

640

名稱空間可以幫助您組織Kubernetes資源,同時可以提高團隊的開發速度。 請繼續關注未來的Kubernetes最佳實踐劇集,我將向您展示如何鎖定名稱空間中的資源併為您的群集引入更多安全性和隔離性!
原文連結:https://cloudplatform.googleblog.com/2018/04/Kubernetes-best-practices-Organizing-with-Namespaces.htmlKubernetes應用實戰培訓

640

Kubernetes應用實戰培訓將於2018年9月14日在上海開課,3天時間帶你係統掌握Kubernetes本次培訓包括:容器特性、映象、網路;Docker特性、架構、元件、概念、Runtime;Docker安全;Docker實踐;Kubernetes架構、核心元件、基本功能;Kubernetes設計理念、架構設計、基本功能、常用物件、設計原則;Kubernetes的實踐、執行時、網路、外掛已經落地經驗;微服務架構、DevOps等,點選閱讀原文連結可檢視具體培訓內容。

640

相關推薦

如何使用名稱空間管理Kubernetes資源

本文是Google Developer Advocate Sandeep Dinesh的七部分視

使用 Ansible 管理 Kubernetes 資源

前兩天,一篇「Think twice before using Helm[1]」(譯文:「恕我直言,對Helm大家還是要三思而後用」) 引起了大家的關注。作者從認證,生命週期管理,錯誤處理等多個角度說明了 Helm 自身的問題。我基本贊同作者的觀點。多數情況下我們只是把 helm 當做一個模板引擎在

深入解析 kubernetes 資源管理,容器雲牛人有話說

系統 關系 充足 sig 配置信息 解釋 進行 解決 由於 資源,無論是計算資源、存儲資源、網絡資源,對於容器管理調度平臺來說都是需要關註的一個核心問題。 ? 如何對資源進行抽象、定義?? 如何確認實際可以使用的資源量?? 如何為容器分配它所申請的資源? 這些問題都是平

深入System.Web.Caching名稱空間 教你Hold住快取管理(三)

本文分三篇,從快取所在名稱空間System.Web.Caching開始,詳細的介紹.NET框架提供的快取類和操作方法。看完之後你將學會: 第一篇-如何實現簡單的資料快取 第二篇-快取從檔案中讀取的資料,並通過檔案依賴實現快取資料的及時更新 第三篇-快取資料庫中的整張表,並通過資料庫依賴實現快取

深入System.Web.Caching名稱空間 教你Hold住快取管理(二)

本文分三篇,從快取所在名稱空間System.Web.Caching開始,詳細的介紹.NET框架提供的快取類和操作方法。看完之後你將學會: 第一篇-如何實現簡單的資料快取 第二篇-快取從檔案中讀取的資料,並通過檔案依賴實現快取資料的及時更新 第三篇-快取資料庫中的整張表,並通過資料庫依賴實現快取

深入System.Web.Caching名稱空間 教你Hold住快取管理(一)

本文分三篇,從快取所在名稱空間System.Web.Caching開始,詳細的介紹.NET框架提供的快取類和操作方法。看完之後你將學會: 第一篇-如何實現簡單的資料快取 第二篇-快取從檔案中讀取的資料,並通過檔案依賴實現快取資料的及時更新 第三篇-快取資料庫中的整張表,並通過資料庫依賴實現快取

C++記憶體管理名稱空間

1.單獨編譯:跟C語言一樣,C++也允許甚至鼓勵程式設計師將元件函式放在獨立的檔案中。 2.程式結構:包括三部分:     標頭檔案:包含結構宣告和使用這些結構的函式的宣告     原始碼檔案:包含與結構有關的函式的程式碼

kubernetes通過yaml建立名稱空間

1.建立namespace.yaml檔案 apiVersion: v1 kind: Namespace metadata:    name: dev    labels:      name: dev 2.執行kub

如何擴充套件Kubernetes管理資源物件?

Kubernetes是一套容器化解決方案,也是一套資源管理的架構和標準;本次分享是基於我在餓了麼現階段容器化經驗和理念的總結,探討深化Kubernetes在企業內部的應用的方法,介紹如何利用開源的API Server框架在企業內部打造和擴充套件Kubernetes管理的資源物件。 Kubernet

kubernetes資源管理

  週末和友人聊天,友人問及“搜尋是計算密集型”,如果使用docker技術,如何資源管理?         本文來解釋一下如何使用kubernetes來進行資源分配(主要包括cpu和mem)     可能很多人還不瞭解資源設定的意義在哪,為什麼要進行資源設定?   

Kubernetes資源管理之--資源預留

1. 概述 1.1 問題 系統資源可分為兩類:可壓縮資源(CPU)和不可壓縮資源(memory、storage)。可壓縮資源比如CPU超配後,在系統滿負荷時會劃分時間片分時執行程序,系統整體會變慢(一般不會導致太大的問題)。但不可壓縮資源如Memory,

kubernetes資源配額管理

參考:https://kubernetes.io/docs/concepts/policy/resource-quotas/ 當叢集有多個使用者或者團隊時,一個重要的問題就是資源的公平分配。 資源配置就是管理員用來解決類似問題的工具。 通過定義ResourceQuota

配置Kubernetes名稱空間的預設記憶體請求和限制

如何配置名稱空間的預設記憶體請求和限制。如果在具有預設記憶體限制的名稱空間中建立Container,並且C

Serverless Kubernetes全面升級2.0架構:支援多名稱空間、RBAC、CRD、PV/PVC等功能

Serverless Kubernetes概述: 阿里雲Serverless Kubernetes容器服務最新開放香港、新加坡

Kubernetes 的層級名稱空間介紹

> 原文連結:[https://fuckcloudnative.io/posts/introducing-hierarchical-namespaces/](https://fuckcloudnative.io/posts/introducing-hierarchical-namespaces/) 在單個

linux 內存地址空間管理 mm_struct

clone mod ppr head actual rom __user 虛擬 tom http://blog.csdn.net/yusiguyuan/article/details/39520933 Linux對於內存的管理涉及到非常多的方面,這篇文章首先從對進程虛擬地址

SYSTEM 表空間管理及備份恢復

mod tab 尋找 最重要的 alter exist mit nbsp 開啟 標簽: systemoraclesqldatabasefile數據庫 2010-11-28 18:14 12689人閱讀 評論(0) 收藏 舉報 分類: -----Oracle備份恢

11、函數對象、函數的嵌套、名稱空間與作用域

() update 啟動 nbsp money 有效 產生 strip() return 一、函數對象   函數對象,函數是第一類對象,即函數可以當做數據傳遞   具體特點:     1、可以被引用;   1 def foo(): 2 print(‘from fo

名稱空間與作用域

引用 efi 執行 error: 有效 域名 內部 內部函數 沒有 一、名稱空間 名稱空間分三種: 內置名稱空間 Python解釋器自帶的名字,Python解釋器啟動就會生成內置名稱空間 全局名稱空間 文件級別定義的名字(頂頭寫,無縮進),都會存放在全局名稱空間,

day18 函數定義、參數;名稱空間;全局變量及局部變量。

意思 加載 **kwargs 方式 nbsp span 接收 none 默認 Python之路,Day6 = Python基礎6 函數的定義 def func1(): # 定義一個函數,名字叫func1,括號中沒有傳入參數 pri