목차

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

  • default: 지정된 Namespace가 없는 오브젝트를 위한 기본 NS(주로 테스트 목적)
  • kube-system: Kubernetes의 주요 구성요소를 위항 NS
  • kube-public: 모든 사용자가 공개적으로 접근 할 수 있는 object(시스템 프로세스)를 위한 NS
  • kube-node-lease: 클러스터가 스케일일 될 때 노드의 heartbeat와 리더 선출과 같은 시스템 핵심 기능과 관련된 lease 오브젝트를 위한 NS
    • 분산 시스템의 경우 공유 리소스를 잠그고 노드간 활동을 조절하는 “리스(lease)” 필요
#네임스페이스 관리 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>
#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가 가상이기게 서비스 포트와 결합된 경우에만 의미가 있음