Kubernetes Namespace
목차
Kubernetes cluster 내에서 리소스(Pod, Service 등)를 구분 및 경리 하기위한 가상의 논리적 공간(그룹, 파티셔닝)을 제공 → scope
- 서비스(애플리케이션, 팀, 환경등 목적에 따라 구분)단위의 Namespace 구분은 전체 프로젝트 운영 , 관리 측면에서 유리
- 개발 / 테스트 / QA / 운영 등의 목적에 따른 ns 구분
- 팀 내부의 업무별 구분 → frontTeam-dev / frontTeam-test / backTeam-ops
- NS를 통해 격리가 가능하기에 서로 간섭없이 실행 가능
- 클러스터 전반에 걸쳐 사용되는 object인 Node, PV, Namespace등은 Kubernetes에서 사용되는 저수준의 object로 NS에 의해 구분되지 않음
- kubectl api-resources –namespaced=true → ns에 포함되는 리소스
- kubectl api-resources –namespaced=false → ns에 포함되지 않은 리소스
- 일반적으로 사용되는 deployments, pod 등의 api-resource는 NS에 의해 구분
- NS별 접근제어(RBAC) 및 자원 소비 제어(ResourceQuata 등) 설정 가능
- 클러스터 및 NS 수준의 RBAC 구성(RoleBinding, ClusterRoleBinding)을 통해 리소스, 사용자간의 접근제어 구현 및 이를 통한 기본 보안 강화
- 민감한 데이터나 리소스에 대한 무단 액세스를 방지하는 동시에 여러팀이 Namaspace 내에서 작업할 수 있도록 허용
- ResourceQuota는 NS가 사용 가능한 최대 리소스 양을 지정하여 특정 애플리케이션의 자원 독점을 방지하여 다른 애플리케이션의 상대적 성능저하 방지
- 주로 CPU, Memory, Pod 수 등을 제한
- ResourceQuota는 NS에 사용 가능한 총 리소스
- LimintRange는 NS내 실행되는 컨테이너에 대한 제한을 할당 하는 데 사용

- 서로 다른 팀이나 프로젝트가 서로 방해하지 않고 Kubernetes 클러스터에서 워크로드 실행가능
- NS가 다를경우 중복이름 허용 → Namespace Dns
- NS로 구분해도 리소스간 통신(송수신)은 기본적으로 허용
- 제한은 NetworkPolicy를 통해 트래픽을 허용하거나 거부하는 정책 설정 가능
- Whitelist 설정 시 Pod, Namespaec, Node등 이외에는 트래픽을 보낼 수 없음
Namespace DNS
- Namespace간 통신을 가능케 함
- <service-name>.<namespace-name>.svc.cluster.local

기본제공 Namespace
- default: 지정된 Namespace가 없는 오브젝트를 위한 기본 NS(주로 테스트 목적)
- kube-system: Kubernetes의 주요 구성요소를 위항 NS
- kube-public: 모든 사용자가 공개적으로 접근 할 수 있는 object(시스템 프로세스)를 위한 NS
- kube-node-lease: 클러스터가 스케일일 될 때 노드의 heartbeat와 리더 선출과 같은 시스템 핵심 기능과 관련된 lease 오브젝트를 위한 NS
- 분산 시스템의 경우 공유 리소스를 잠그고 노드간 활동을 조절하는 “리스(lease)” 필요
Namespace 정보 확인
#네임스페이스 관리 pod
$ kubectl get po -n kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-5dd5756b68-knvn2 1/1 Running 0 17d
coredns-5dd5756b68-wl8rv 1/1 Running 0 17d
#네임스페이스 dns IP 확인
$ kubectl get svc -n kube-system -l k8s-app=kube-dns
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 17d
#네임스페이스 정보 확인
$ sudo cat /var/lib/kubelet/config.yaml
...
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
...
#configmap 내 coredns 정보 확인
$ kubectl describe cm -n kube-system coredns
Name: coredns
Namespace: kube-system
Labels: <none>
Annotations: <none>
Data
====
Corefile:
----
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf { #CoreDNS를 통한 외부 DNS 조회 문제 발생 시
#forward . 8.8.8.8 로 변경
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
BinaryData
====
Events: <none>
#busybox이용 정보 확인
$ kubectl run -it --rm dns-verify --restart Never --image busybox -- cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5
#DNS에 질의할 부분 도메인 주소 경로들
#DNS 쿼리를 보낼 곳. CoreDNS Service IP 주소 -> k8s 의 모든 Pod들은 이 IP로 조회
#FQDN으로 취급될 도메인에 포함될 .의 최소 개수
Events: <none>Namespace 생성과 활용
#ns 생성
$ kubectl create ns dev-ns
namespace/dev-ns created
$ kubectl create namespace ops-ns
namespace/ops-ns created
#ns 정보 확인
$ kubectl get ns
NAME STATUS AGE
default Active 17d
dev-ns Active 16s
ingress-nginx Active 13d
kube-node-lease Active 17d
kube-public Active 17d
kube-system Active 17d
kubernetes-dashboard Active 17d
metallb-system Active 14d
openebs Active 13d
ops-ns Active 4s
#dev-ns 확인
$ kubectl get ns dev-ns -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2024-04-22T07:41:09Z"
labels:
kubernetes.io/metadata.name: dev-ns
name: dev-ns
resourceVersion: "3607925"
uid: a4b353cc-e656-4a5f-b146-f3a4802b9d80
spec:
finalizers:
- kubernetes
status:
phase: Active
#현재 ns 확인 default
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
#빈 ns 는 default
#ns 변경
$ kubectl config set-context --current --namespace dev-ns
Context "kubernetes-admin@kubernetes" modified.
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin dev-ns
#default로 변경
$ kubectl config set-context --current --namespace default
Context "kubernetes-admin@kubernetes" modified.
#ns 확인
$ kubectl config view --minify | grep namespace:
namespace: default기타 (kubens 파일 다운로드)
#받은 파일 이동
$ sudo cp kubens /usr/local/bin/
#권한 변경
$ sudo chmod 777 /usr/local/bin/kubens
#help
$ kubens -h
USAGE:
kubens : list the namespaces in the current context
kubens <NAME> : change the active namespace of current context
kubens - : switch to the previous namespace in this context
kubens -c, --current : show the current namespace
kubens -h,--help : show this message
#현재 ns
$ kubens -c
default
#ns 변경
$ kubens ops-ns
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "ops-ns".
#이전 ns로 변경
$ kubens -
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "default".활용
#dev nginx 추가
$ kubectl create deployment nstest -n dev-ns --image nginx --port=80 --replicas 2
deployment.apps/nstest created
$ kubectl -n dev-ns expose deployment nstest --name nstest-sve --port 80 --target-port 80
service/nstest-sve exposed
#확인
$ kubectl get svc -A | grep nstest
dev-ns nstest-sve ClusterIP 10.108.183.48 <none> 80/TCP 16s
ops-ns nstest-sve ClusterIP 10.108.13.86 <none> 80/TCP 5m24s
#도메인 정보 확인
$ kubectl run dns-verify -it --rm --restart=Never --image=busybox -- nslookup 10.108.183.48
Server: 10.96.0.10
Address: 10.96.0.10:53
48.183.108.10.in-addr.arpa name = nstest-sve.dev-ns.svc.cluster.local
$ kubectl run dns-verify -it --rm --restart=Never --image=busybox -- nslookup 10.108.13.86
Server: 10.96.0.10
Address: 10.96.0.10:53
86.13.108.10.in-addr.arpa name = nstest-sve.ops-ns.svc.cluster.local
#NS dns ip 확인
$ kubectl get svc -n kube-system -l k8s-app=kube-dns
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 17d
#확인
$ nslookup nstest-sve.dev-ns.svc.cluster.local
Server: 127.0.0.53
Address: 127.0.0.53#53
** server can't find nstest-sve.dev-ns.svc.cluster.local: SERVFAIL
#NS dns 등록
$ sudo vi /etc/resolv.conf
nameserver 10.96.0.10 #추가
#dns를 통한 접속
$ nslookup nstest-sve.dev-ns.svc.cluster.local
;; Got SERVFAIL reply from 127.0.0.53, trying next server
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: nstest-sve.dev-ns.svc.cluster.local
Address: 10.108.183.48
;; Got SERVFAIL reply from 127.0.0.53, trying next server
$ curl nstest-sve.dev-ns.svc.cluster.local
...
<title>Welcome to nginx!</title>
...
#ping응답은 없음
#clusterIP가 가상이기게 서비스 포트와 결합된 경우에만 의미가 있음