ЁЯПл The SchoolтА║тШ╕я╕П KubernetesтА║ЁЯЪк рдзрдбрд╛ 05 тАФ Namespaces: рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд░реНрдЧрдЦреЛрд▓реНрдпрд╛
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯЪк рдзрдбрд╛ 05 тАФ Namespaces: рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд╡рд░реНрдЧрдЦреЛрд▓реНрдпрд╛

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧрдЪрд╛: lesson-04-services ┬╖ рдкреБрдврдЪрд╛: lesson-06-configmaps-secrets


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ04, рдЖрдгрд┐: Namespace тАФ рдЕрдиреЗрдХ teams рдЖрдгрд┐ projects рдПрдХрдЪ cluster рд╡рд╛рдЯреВрди рдШреЗрддрд╛рдд рддреЗрд╡реНрд╣рд╛ рддреЛ рдиреАрдЯрдиреЗрдЯрдХрд╛ рдХрд╕рд╛ рд░рд╛рд╣рддреЛ. рдЦрд░реА file:

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЗрдорд╛рд░рддреАрдд рдЕрдиреЗрдХ рд╡рд░реНрдЧрдЦреЛрд▓реНрдпрд╛ ЁЯЪк рдЕрд╕рддрд╛рдд. 3A рдЖрдгрд┐ 3B рджреЛрдиреНрд╣реА рд╡рд░реНрдЧрд╛рдВрдд "рдРрд╢реНрд╡рд░реНрдпрд╛" рдирд╛рд╡рд╛рдЪреА рдореБрд▓рдЧреА рдЕрд╕реВ рд╢рдХрддреЗ тАФ рдХрд╛рд╣реА рд╣рд░рдХрдд рдирд╛рд╣реА! 3A рдЪреНрдпрд╛ рдЖрдд рддреБрдореНрд╣реА рдлрдХреНрдд "рдРрд╢реНрд╡рд░реНрдпрд╛" рдореНрд╣рдгрддрд╛ рдЖрдгрд┐ рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рдХрд│рддреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЛрдг рд╣рд╡реА рдЖрд╣реЗ. рджреБрд╕рд▒реНрдпрд╛ рдЦреЛрд▓реАрддреВрди рддреБрдореНрд╣реА рдореНрд╣рдгрд╛рд▓ "3B рдордзрд▓реА рдРрд╢реНрд╡рд░реНрдпрд╛".

рдкреНрд░рддреНрдпреЗрдХ рдЦреЛрд▓реАрдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ рд╕реВрдЪрдирд╛-рдлрд▓рдХ, рд╕реНрд╡рддрдГрдЪреЗ рд╕рд╛рд╣рд┐рддреНрдпрд╛рдЪреЗ рдХрдкрд╛рдЯ рдЕрд╕рддреЗ, рдЖрдгрд┐ рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рдЦреЛрд▓реАрдЪреЗ рдирд┐рдпрдо рдард░рд╡реВ рд╢рдХрддрд╛рдд ("3A рдордзреНрдпреЗ рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд 30 рдореБрд▓реЗ").

Namespace рдореНрд╣рдгрдЬреЗ Kubernetes рдЗрдорд╛рд░рддреАрддрд▓реА рдПрдХ рд╡рд░реНрдЧрдЦреЛрд▓реА:

рдЖрдкрд▓реНрдпрд╛ рдЦреЛрд▓реАрдЪреЗ рдирд╛рд╡ school рдЖрд╣реЗ, рдЖрдгрд┐ рдпрд╛ repo рдордзрд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ object рддрд┐рдЪреНрдпрд╛рддрдЪ рд░рд╛рд╣рддреЛ.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart TB
    subgraph cluster["ЁЯПл One Kubernetes cluster - the building"]
        subgraph ns1["ЁЯЪк namespace: school - our room"]
            d1["Deployment school-api"]
            d2["Deployment school-analytics"]
            s1["Service school-api"]
            cm["ConfigMap + Secret"]
        end
        subgraph ns2["ЁЯЪк namespace: kube-system - the school office"]
            dns["CoreDNS, metrics-server..."]
        end
        subgraph ns3["ЁЯЪк namespace: default"]
            x["experiments end up here<br/>if you forget -n ЁЯШЕ"]
        end
    end

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдПрдХ cluster рдорд╣рд╛рдЧ рдЕрд╕рддреЛ (рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛: nodes рдЖрдзреАрдЪ EKS тЙИ $73/month!) тАФ рдореНрд╣рдгреВрди teams clusters рд╡рд╛рдЯреВрди рдШреЗрддрд╛рдд. рдЦреЛрд▓реНрдпрд╛ рдирд╕рддреАрд▓ рддрд░ рдирд╛рд╡реЗ рдЖрдкрд╕рд╛рдд рднрд┐рдбрддреАрд▓, рджреБрд╕рд▒реНрдпрд╛рдВрдЪреНрдпрд╛ рдЧреЛрд╖реНрдЯреА рдЪреБрдХреВрди delete рд╣реЛрддреАрд▓, рдЖрдгрд┐ "staging рд╕рдЧрд│рд╛ CPU рдЦрд╛рдК рд╢рдХрдд рдирд╛рд╣реА" рдЕрд╕реЗ рд╕рд╛рдВрдЧрд╛рдпрд▓рд╛ рдорд╛рд░реНрдЧ рдирд╕реЗрд▓. Namespaces рдЬрд╛рд╕реНрдд clusters рди рдШреЗрддрд╛ рд╡реЗрдЧрд│реЗрдкрдгрд╛ рджреЗрддрд╛рдд. рддреЗ рдиреБрдХрд╕рд╛рдирд╛рдЪреА рд╕реНрд╡рдЪреНрдЫ рд╕реАрдорд╛ (blast radius) рдкрдг рдЖрд╣реЗрдд: kubectl delete namespace school рдпрд╛ project рдордзрд▓реЗ рд╕рдЧрд│реЗ рдХрд╛рдврддреЗ, рдЖрдгрд┐ рдлрдХреНрдд рдпрд╛рдЪ project рдордзрд▓реЗ.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

k8s/namespace.yaml рдЫреЛрдЯреА рдЖрд╣реЗ рдкрдг рддреА рд╕рд░реНрд╡рд╛рдд рдЖрдзреА apply рдХрд░рд╛рд╡реА рд▓рд╛рдЧрддреЗ (рдЦреЛрд▓реАрдд рдмрд╛рдХ рдареЗрд╡рдгреНрдпрд╛рдЖрдзреА рдЦреЛрд▓реА рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реА):

apiVersion: v1
kind: Namespace
metadata:
  name: school

рдордЧ рдмрд╛рдХреА рдкреНрд░рддреНрдпреЗрдХ manifest metadata.namespace: school рдиреЗ рд╕реНрд╡рддрдГрд▓рд╛ рдпрд╛ рдЦреЛрд▓реАрд╢реА рдЬреЛрдбрддреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ kubectl command рд▓рд╛ -n school рд▓рд╛рдЧрддреЗ тАФ рдореНрд╣рдгреВрдирдЪ рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реЗ рдпрд╛ рдзрдбреНрдпрд╛рдВрдордзреНрдпреЗ рд╕рддрдд рджрд┐рд╕рддреЗ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

kubectl apply -f k8s/namespace.yaml
kubectl get namespaces                       # school, default, kube-system...

kubectl -n school get all                    # our room's contents
kubectl -n kube-system get pods              # peek into the school office ЁЯСА

# Same name, two rooms тАФ totally legal:
kubectl create namespace room-b
kubectl -n room-b create deployment api --image=nginx
kubectl -n school get deploy; kubectl -n room-b get deploy

# Clean sweep of the experiment room:
kubectl delete namespace room-b

ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl

kubectl get ns ┬╖ kubectl config set-context --current --namespace=school

ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯкк AWS L02 (groups: рджреБрд╕рд▒реНрдпрд╛ account рд╢рд┐рд╡рд╛рдп рд╡реЗрдЧрд│реЗрдкрдгрд╛)

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

kubectl get all -n school рдлрдХреНрдд school рдЪреЗ objects рджрд╛рдЦрд╡рддреЗ; kubectl get all (default) рддреНрдпрд╛рддрд▓рд╛ рдПрдХрд╣реА рджрд╛рдЦрд╡рдд рдирд╛рд╣реА.

ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ

kubectl delete namespace school рд╕рдВрдкреВрд░реНрдг рдЦреЛрд▓реА рдХрд╛рдвреВрди рдЯрд╛рдХрддреЗ тАФ рддрд┐рдЪреНрдпрд╛рддрд▓реНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рд╕рд╣

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

тПня╕П рдкреБрдвреЗ

рдЖрдкрд▓реНрдпрд╛ pods рдирд╛ settings (port numbers) рдЖрдгрд┐ secrets (database passwords) рд▓рд╛рдЧрддрд╛рдд тАФ рдЖрдгрд┐ рддреЗ image рдордзреНрдпреЗрдЪ рднрд╛рдЬреВрди рдЯрд╛рдХрдгреЗ рдореНрд╣рдгрдЬреЗ рдЬреЗрд╡рдгрд╛рдЪрд╛ рдореЗрдиреВ рдбрдмреНрдпрд╛рддрдЪ laminate рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ. рдЖрддрд╛ рдпреЗрддрд╛рдд ConfigMaps рдЖрдгрд┐ Secrets.

git checkout lesson-06-configmaps-secrets

ЁЯЪк Lesson 05 тАФ Namespaces: separate classrooms

ЁЯУН You are here: Lesson 05 of 13 ┬╖ Previous: lesson-04-services ┬╖ Next: lesson-06-configmaps-secrets


ЁЯУж What's in this branch

Lessons 01тАУ04, plus: the Namespace тАФ how one cluster stays tidy when many teams and projects share it. Real file:

ЁЯзТ Explain like I'm 5

A school building has many classrooms ЁЯЪк. Class 3A and Class 3B can BOTH have a kid named "Aishwarya" тАФ no problem! Inside 3A, you just say "Aishwarya" and everyone knows who you mean. From another room you'd say "Aishwarya from 3B".

Each room also has its own notice board, its own supplies cupboard, and the teacher can set room rules ("3A gets at most 30 kids").

A Namespace is a classroom inside the Kubernetes building:

Our room is called school, and every object in this repo lives in it.

ЁЯЧ║я╕П Diagram

flowchart TB
    subgraph cluster["ЁЯПл One Kubernetes cluster - the building"]
        subgraph ns1["ЁЯЪк namespace: school - our room"]
            d1["Deployment school-api"]
            d2["Deployment school-analytics"]
            s1["Service school-api"]
            cm["ConfigMap + Secret"]
        end
        subgraph ns2["ЁЯЪк namespace: kube-system - the school office"]
            dns["CoreDNS, metrics-server..."]
        end
        subgraph ns3["ЁЯЪк namespace: default"]
            x["experiments end up here<br/>if you forget -n ЁЯШЕ"]
        end
    end

тЭУ What

ЁЯдФ Why

One cluster is expensive (remember: EKS тЙИ $73/month before nodes!) тАФ so teams share clusters. Without rooms you'd get name collisions, accidental deletions of other people's stuff, and no way to say "staging may not eat all the CPU". Namespaces give isolation-without-more-clusters. They're also a clean blast radius: kubectl delete namespace school removes everything in this project, and only this project.

ЁЯФз How (in this repo)

k8s/namespace.yaml is tiny but must be applied first (a room must exist before you put desks in it):

apiVersion: v1
kind: Namespace
metadata:
  name: school

Then every other manifest pins itself to the room with metadata.namespace: school, and every kubectl command needs -n school тАФ that's why you keep seeing it in these lessons.

ЁЯзк Try it

kubectl apply -f k8s/namespace.yaml
kubectl get namespaces                       # school, default, kube-system...

kubectl -n school get all                    # our room's contents
kubectl -n kube-system get pods              # peek into the school office ЁЯСА

# Same name, two rooms тАФ totally legal:
kubectl create namespace room-b
kubectl -n room-b create deployment api --image=nginx
kubectl -n school get deploy; kubectl -n room-b get deploy

# Clean sweep of the experiment room:
kubectl delete namespace room-b

ЁЯФз kubectl for this lesson

kubectl get ns ┬╖ kubectl config set-context --current --namespace=school

ЁЯФЧ Builds on: ЁЯкк AWS L02 (groups: separation without a second account)

тЬЕ Verify тАФ what you should see

kubectl get all -n school shows only the school's objects; kubectl get all (default) shows none of them.

ЁЯз╣ Clean up

kubectl delete namespace school removes the whole room тАФ everything in it

тЪая╕П Common mistakes

тПня╕П Next

Our pods need settings (port numbers) and secrets (database passwords) тАФ and baking those into the image would be like laminating the lunch menu into the lunchbox. Enter ConfigMaps & Secrets.

git checkout lesson-06-configmaps-secrets
тЖР PreviousservicesNext тЖТconfigmaps secrets

This page is the lesson's README from the lesson-05-namespaces branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.