Linux中國

Kubernetes 命名空間入門

kubernetes 命名空間 namespace 是什麼?正如 Shakespeare 以前寫過的,我們所謂的命名空間,或者任何其他名字,就是虛擬集群。通過虛擬集群,意味著 kubernetes 可以在單個集群上提供多個 kubernetes 的集群,類似一個在其主機抽象出來的虛擬機。kubernetes 文檔 中的解釋:

kubernetes 在一個物理集群上提供了多個虛擬集群。這些虛擬集群被稱為命名空間。

你為什麼需要命名空間?一言以蔽之:隔離。

隔離有很多優點,如它提供了安全和乾淨的環境。如果你是基礎設施的所屬者,並且要為開發者提供環境,隔離就相當重要。你最不需要的就是,一個不熟悉你集群是如何搭建的人去修改系統配置 —— 這可能導致所有人都無法登錄。

初始命名空間

一個集群的三個初始命名空間:defaultkube-systemkube-public。雖然技術上你可以用這三個命名空間作部署,但我還是推薦你把這三個命名空間留作系統配置用,而不是你的項目。

  • Default 用於某些沒有指明命名空間的部署,這是一種快速創建混亂的做法,如果你在沒有正確信息的情況下做了很多部署,將很難清理。我不會去動它,因為它只有這一個用途,而且在不止一種情況下誤導過我。
  • Kube-systemKubernetes 系統相關的所有對象組成的命名空間。任何對此命名空間的部署都可能是危險的操作,可能對系統本身造成不可挽回的破壞。沒錯,我試過;所以我不推薦。
  • Kube-public 所有人可讀,但是這個命名空間是為系統保留的。

用命名空間來實現隔離

我用了多種方式通過命名空間來實現隔離。我經常用命名空間來把多個用戶項目分割到不同的環境。這種方式可以有效防止跨項目的污染,因為命名空間提供了獨立的環境。例如,用戶可以安裝不同版本的 Jenkins,如果它們的環境變數是在不同的命名空間,就不會衝突。

這種隔離對於清理也很有幫助。如果開發小組的多個項目突然被廢棄,你可以用命令 kubectl delete ns <$NAMESPACENAME> 一鍵刪除命名空間,清理命名空間內的所有東西。(請確認被刪除的是正確的命名空間。我曾經在生產環境刪除了錯誤的命名空間,這很不好。)

如果你是基礎設施所有者,請謹慎操作,因為這可能會引發其他團隊的的故障或引發其他問題。例如,如果你創建了一個特定的命名空間,裡面有特殊的額外安全的 DNS 功能,但是其他人刪除了它,那麼命名空間內的所有 pod 和它們運行的應用都會被清空。所有的刪除操作在真正實施之前都應該由同事(通過 GitOps)評審一下。

雖然官方文檔不建議 10 人以下團隊 使用多個命名空間,但出於架構需要,在我自己的集群上還是用了多個命名空間。集群越乾淨越好。

關於命名空間管理員應該知道的

首先,命名空間不能嵌套。部署只能在一個命名空間中進行。對於版本化項目,你不一定要用命名空間,你可以使用標籤來區分有相同名字的版本化應用。命名空間使用配額來為不同的用戶劃分資源;例如,某個命名空間最多能有 x 個節點。最後,所有的命名空間對於該資源類型只能使用一個獨一無二的名字。

命名空間命令操作

你需要安裝 MinikubeHelmkubectl 命令行,才能使用下面的命名空間命令。我的文章《安全掃描你的 DevOps 流水線》中有它們的安裝教程,你也可以去每個項目的官方主頁去找安裝教程。我使用的是最新的 Minikube。手動安裝很快,第一次就能成功運行。

獲取你的第一組命名空間:

jess@Athena:~$ kubectl get namespace
NAME            STATUS   AGE
default         Active   5m23s
kube-public     Active   5m24s
kube-system     Active   5m24s

創建一個命名空間:

jess@Athena:~$ kubectl create namespace athena
namespace/athena created

現在開發者可以部署到你創建的命名空間了;例如,這裡是一個簡短的 Helm chart:

jess@Athena:~$ helm install teset-deploy stable/redis --namespace athena
NAME: teset-deploy
LAST DEPLOYED: Sat Nov 23 13:47:43 2019
NAMESPACE: athena
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
` Please be patient while the chart is being deployed `
Redis can be accessed via port 6379 on the following DNS names from within your cluster:

teset-deploy-redis-master.athena.svc.cluster.local for read/write operations
teset-deploy-redis-slave.athena.svc.cluster.local for read-only operations

獲取你的密碼:

export REDIS_PASSWORD=$(kubectl get secret --namespace athena teset-deploy-redis -o jsonpath="{.data.redis-password}" | base64 --decode)

連接你的 redis 服務:

  1. 運行一個你可以作為客戶端用的 Redis pod:
kubectl run --namespace athena teset-deploy-redis-client --rm --tty -i --restart=&apos;Never&apos; 
       --env REDIS_PASSWORD=$REDIS_PASSWORD 
       --image docker.io/bitnami/redis:5.0.7-debian-9-r0 -- bash 
  1. 使用 Redis CLI 連接:
redis-cli -h teset-deploy-redis-master -a $REDIS_PASSWORD
redis-cli -h teset-deploy-redis-slave -a $REDIS_PASSWORD

從集群外連接你的資料庫:

kubectl port-forward --namespace athena svc/teset-deploy-redis-master 6379:6379 &
redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD

現在這一套部署已經完成了,你有一個在命名空間 test-deploy 中部署的 chart。

查看你的命名空間中有哪些 pod:

jess@Athena:~$ kubectl get pods --namespace athena
NAME                            READY   STATUS  RESTARTS   AGE
teset-deploy-redis-master-0   1/1       Running   0             2m38s
teset-deploy-redis-slave-0      1/1     Running   0             2m38s
teset-deploy-redis-slave-1      1/1     Running   0             90s

現在,你已經正式把你的應用隔離到了一個命名空間,創建了一個只在內部通信的虛擬集群。

一鍵刪除所有東西:

jess@Athena:~$ kubectl delete namespace athena
namespace "athena" deleted

因為這會刪除應用的所有內部配置,所以這個刪除操作可能會持續一段時間,持續時間取決於你的部署到底有多大。

再次檢查一下所有東西是否被刪除了:

jess@Athena:~$ kubectl get pods --all-namespaces
NAMESPACE       NAME                            READY   STATUS  RESTARTS   AGE
kube-system   coredns-5644d7b6d9-4vxv6          1/1     Running   0             32m
kube-system   coredns-5644d7b6d9-t5wn7          1/1     Running   0             32m
kube-system   etcd-minikube                     1/1     Running   0             31m
kube-system   kube-addon-manager-minikube       1/1     Running   0             32m
kube-system   kube-apiserver-minikube           1/1     Running   0             31m
kube-system   kube-controller-manager-minikube  1/1     Running   0             31m
kube-system   kube-proxy-5tdmh                  1/1     Running   0             32m
kube-system   kube-scheduler-minikube           1/1     Running   0             31m
kube-system   storage-provisioner               1/1     Running   0             27m

這是一個所有 pod 及它們存在於的已知命名空間的列表。你可以看到,之前創建的應用和命名空間現在已經不在了。

命名空間實踐

當前我是出於安全考慮才使用命名空間,如限制用戶的許可權。你可以限制所有的東西 —— 從哪些角色可以訪問命名空間,到命名空間可使用的集群資源(CPU 等)的配額等級。例如,我通過資源配額和 基於角色的訪問控制 role-based access control (RBAC)配置來確保只有允許的服務賬號可以訪問命名空間。

對於隔離方面的安全,我不希望我的私人 Jenkins 應用可以通過一個信任的本地網路被當做一個有公共 IP 地址的安全鏡像來訪問(我不得不假定,可能會被侵襲)。

如果你很難提前計算出到底要在你的雲平台上部署多少節點(或者,就我而言,是在搞崩我的家庭伺服器之前我能部署多少個),那麼命名空間在預算方面也很有用。雖然這超出了本文的討論範圍,而且很複雜,但值得你去調研和使用來防止你的集群過分擴展。

總結

命名空間是一個很好的隔離項目和應用的方法。本文僅是一個關於命名空間的簡短介紹,所以我建議你更深入地研究下命名空間,在你的實踐中更多地去使用它們。

via: https://opensource.com/article/19/12/kubernetes-namespaces

作者:Jessica Cherry 選題:lujun9972 譯者:lxbwolf 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國