Google Code Prettify

2020年1月27日 星期一

K8s: namespace

Kubernates 提供有 namespace (命名空間) 以方便管理,這應該不難理解,現在的程式語言也多半有提供命名空間 (例如 Java 的 package),終究系統大了的話,名稱很容易重複。底下整理一些 K8s 命名空間的基本觀念。
  • 列出命名空間
  • kubectl get ns
    
    Kubernates 安裝好,預設就會有這些命名空間,在建立各項資源時,如果沒有特別指命,預設使用 default。
  • 建立命名空間
  • kubectl create namespace my-ns
    
    這是使用指令的方式,另外也可以使用 yaml,如下:
    apiVersion: v1
    kind: Namespace
    metadata:
      name: my-ns
    
    命名空間的名稱,限定只能用英數字及 dash (-)。
  • 在指定的命名空間建立資源
  • 使用如下的 yaml 重新建立一次 pod host:
    apiVersion: v1
    kind: Pod
    metadata:
      name: host
      labels:
        app: host-info
    spec:
      containers:
      - name: host
        image: twleader/host:latest
        ports:
        - containerPort: 9080
    
    指令則是在原有指令後面指定命名空間:
    kubectl create -f create-pod.yaml -n my-ns
    
    建立成功後,檢查看看,確定真的建立在命名空間 my-ns 裡了!
  • 命名空間的隔離
  • 命名空間只會隔離名稱,也就是相同名稱可以存在於不同的命名空間,但是,不同命名空間的資源,仍可互相存取到對方,不會受到任何限制!
  • 刪除資源
  • 先檢查一下目前 Kubernetes 中的 pod ... 接著我們要刪除 pod host,如下:
    kubectl delete po host
    
    因為沒有指定要刪除那一個命名空間的 pod host,預設會刪除 default 裡資源,檢查如下,default 裡的被刪除了,my-ns 的還在!
    指定命名空間,重新刪除一次,如下,正確的刪除了 my-ns 命名空間裡的 pod host。
    當 Kubernetes 收到刪除 pod 的指令,會向 pod 中的所有 container 發出 SIGTERM 的信號,並等待一段時間 (通常為 30秒) 待所有 container 正常關閉,如果時間到仍有 container 未關閉,則會直接以 SIGKILL 將它的 process 終止! 為了確保程式可以正常結束,最好可以在程式中正確的處理 SIGTERM 信號。
  • 刪除命名空間
  • kubectl delete ns my-ns
    
    這樣的指令會把命名空間及其下所有資源刪除! 如果希望只刪除命名空間下的 pod,但保留命名空間呢? 如下:
    kubectl delete po --all --namespace my-ns
    
    如果要刪除命名空間下(幾乎)所有資源呢? 指令如下:
    kubectl delete all --all --namespace my-ns 
    
    為什麼說是"幾乎"而不是全部? 因為 Pod、ReplicationController、ReplicaSet、Service 真的會被刪除,但是有少數的資源,例如 Secret 不會被刪除。
  • 切換命名空間
  • 登入 kubernetes 時,沒有特別指定,使用的是 default 這個命名空間,建立資源時,沒有指定命名空間,都會建立在 default 裡,如果我們的資源都在別的命名空間,最好是切換到那個命名空間去,這樣建立的資源就會預設是在那個命名空間,怎麼切換呢? 指令有點長,一般會先建立個 alias,如下:
    alias kcd='kubectl config set-context $(kubectl config current-context) --namespace '
    
    之後要切換命名空間,例如,有個命名空間為 home,要切換到 home,就這麼下指令:
    kcd home
    

沒有留言:

張貼留言