- 주어진 범위 내에서 관리 = "Administion" - 범위 외 관리 = "Management"
사용자 인증 - 기본 : SAM DB로 인증처리(개인) - 중/고급 : AD로 인증처리(기업) (SAM : lusrmgr.msc 혹은 netusers / AD : AD관리도구 를 통해 확인할 수 있다.)
AD(Active Directory)
: 네트워크 상의 모든 리소스에 관한 정보(사용자 및 컴퓨터, 그룹 등)를 논리적 계층 구조로 중앙 저장소에 저장하여 네트워크 상에서 인증을 통해언제 어디서라도 그 리소스를 검색하고 엑세스 할 수 있게 해주는 디렉터리 서비스
AD를 통해 직원들에게는 편리함을 주고 관리자는 보안(사용자 인증과 접근 권한 제어)을 구현할 수 있다.
ex) AD로 도메인을 형성 → 사용자가 로그인할 때 AD에 속한 계정으로 로그인 → 별도의 인증 작업을 할 필요가 없다
AD DS(AD Domain Service)
: 사용자, 주변 장치 등의 정보를 네트워크 상에 저장하고 이 정보들을 관리자가 통합하여 관리하도록 해준다. AD DS 를 사용하기 위해선 DNS서버를 설치해야 한다.
※ AD DS를 통하여 아래와 같은 작업이 가능하다
앱의 설치, 구성, 업데이트
보안 인프라 관리
원격 액세스 서비스 및 DirectAccess를 사용하도록 설정
디지털 인증서 발급 및 관리
AD DS는 논리적 및 물리적 구성 요소를 모두 포함한다.
ⓐ 논리적 구성요소 : 조직에 적합한 AD DS 설계를 구현하는 데 사용하는 구조
파티션: 복제 단위
스키마: AD DS에서 생성되는 개체를 정의하는 데 사용하는 개체 형식 및 특성의 정의 집합
도메인 : AD의 가장 기본이 되는 단위. AD가 설치된 윈도우 서버가 하나의 도메인이라고 보면 된다. 즉, 관리를 하기 위한 하나의 큰 범위 단위이다.회사와 같은 것
도메인 트리: 도메인의 집합. 부모 도메인 및 연속 DNS 네임스페이스를 공유하는 도메인의 계층 구조 집합.
포리스트: 두 개 이상의 트리로 AD가 구성된 것. 같은 포리스트 안의 도메인 사이에는 상호 양방향 전이 트러스트를 갖는다.(서로 신뢰)
조직 구성 단위(Organization Unit, OU):조직, 부서와 같은 것.일종의 폴더와 같은 개념(권한 위임과 그룹 정책을 적용할 수 있는 최소한의 단위)
컨테이너
ⓑ 물리적 구성요소 : 구체적인 개체 또는 실제 세계의 구체적인 구성 요소를 설명하는 개체
도메인 컨트롤러(Domain Controller, DC) : AD가 설치된 컴퓨터. AD 설치를 통해 도메인을 만들고 이를 운영(로그인, 이용 권한 확인, 새로운 사용자 등록, 암호 변경, 그룹 등을 처리)한다. AD DS DB의 복사본을 포함한다. DC는 변경 내용을 처리하고 도메인에 있는 다른 모든 DC에게 변경 내용을 복제할 수 있다. 회사의 대표/사장과 같은 것 DC가 여러개 있으면 가용성이 좋고(하나가 죽어도 됨) 보안성이 좋다.
데이터 저장소
글로벌 카탈로그 : AD 트러스트 내의 도메인들에 포함된 개체에 대한 정보를 수집하여 저장하는 통합 저장소. AD를 구성하면 가상 먼저 설치하는 DC가 글로벌 카탈로그 서버로 지정된다. 글로벌 카탈로그를 사용하면 포리스트의 다른 도메인에 있는 도메인 컨트롤러에 저장되어 있을 수 있는 개체를 빠른 속도로 검색할 수 있다.
RODC(읽기 전용 도메인 컨트롤러) : 주 DC로부터 AD와 관련된 데이터를 전송받아 저장한 후 사용하지만 스스로 데이터를 추가하거나 변경하지는 않는다.
(cat devuser.csr | base64 | tr -d "\n" 했던 결과를 복사하여 request 부분에 작성한다)
ⓒ CertificateSigningRequest(CSR) 승인하기
- k apply -f csr-devuser.yaml
- kubectl get csr devuser -o yaml : 사용자 추가 - kubectl get csr devuser -o jsonpath='{.status.certificate}' | base64 -d > devuser.crt - kubectl get serviceaccounts - kubectlgetsecrets (sa의 토큰(암호)을 알 수 있음)
2) 권한 관리 - Role 및 RoleBinding (권한(role)을 만들고 이를 부여(binding)한다)
- kubectl apply -f csr-devuser.yaml - kubectl get csr : 확인 - kubectl get csr devuser -o yaml - kubectlgetserviceaccount
• kubectl get pods -o wide (## 성공) • kubectl get svc (## 실패) • kubectl get nodes (## 실패) • kubectl run myweb --image=nginx (## 성공) • kubectl delete pod --all (## 성공) 권한을 부여한 대로 잘 작동한다.
: kubectl 및 yaml 파일로 Pod를 배포하라고 명령 → master의 API Server가 Master의 Scheduler로 보냄 → Scheduler가 어느 node에 Pod를 배포할 것인지를 결정 (==> 요청하는 명령 및 Node 상태에 따라)
Pod 배정 시 특정한 Node에만 배치할 수 있다 (nodeName, nodeSelector, nodeAffinity, podAffinity)
특정한 Node에는 배정하지 않도록 설정할 수도 있다 (podAntiAffinity, Taint, cordon) ex) 기본적으로 master에는 Taint 설정되어 있어서 Pod이 실행되지 않음
nodeName : node 이름 사용하여 배정 nodeSelector : node 라벨 사용하여 배정 nodeAffinity : nodeSelector와 유사, 가중치 부과 podAffinity : 특정 label을 가진 Pod가 실행중인 node에 배정 podAntiAffinity : 특정 label을 가진 Pod가 실행중이지 않는 node에 배정 Cordon : 노드에 cordon 설정 시 그 노드는 Pod를 배정받지 않음 Drain : 기존에 실행중인 Pod를 뽑아내어 다른 node로 이동하고, cordon 설정이 된다.
- kubectl apply -f replicationcontroller.yaml
- kubectl get rc,pod -o wide - kubectl delete pod nginx-g5wrg → 특정 pod 삭제 시 새로운 pod 생성됨
- kubectl run myhttp --image=httpd --labels="app=nginx" --port 80 - kubectl get rc,pod -o wide --show-labels
- kubectl edit rc nginx → pod의 이미지, 갯수 등 다시 설정할 수 있다.
- kubectl delete rc nginx → Replication Controller 삭제 시 Pod도 삭제됨!! - kubectl delete rc nginx --cascade=orphan → Replication Controller만 삭제되고 Pod는 그대로 유지
ReplicaSet
: Replication Controller와 동일한 역할
차이점은 Replicaion Controller보다 더 많은 selector를 가진다는 점이다.
: 상태를 유지하는 항목 ▶ Pod 이름을 순서대로 명명(0~N), Pod의 Volume(PVC 이름), Network (Headless Service)
※ 주의 ※ StatefulSet 생성 시 yaml 파일에는 serviceName, replicas, podManagementPolicy, terminationGracePeriodSeconds이 반드시 포함되어야 한다
- kubectl apply -f statefulset.yaml
실습) StatefulSet의 rollingUpdate.partition 수정하기 : StatefulSet에 변경사항이 있을 때 rollingUpdate.partition에서 지정한 값보다 작은번호의 Pod은 변경되지 않고 크거나 같은 번호만 변경시킨다 : 서버 패치할 때 등의 경우에 사용한다
동일한 서비스를 제공하는 여러 개의 Pod에 접근할 수 있는 하나의 IP를 제공 (Service 자신이 갖고 있는 Selector 값과 Cluster에서 운영중인 Pod의 Label 값이 동일한 Pod으로 연결된다. Service는 자신의 EndPoint에 Pod를 추가시켜 관리한다.)
추가) kubectl run으로 pod 생성 후, Service도 생성했는데 오류가 나는 경우
→ pod의 labels 값과 service의 selector 값을 비교해볼 필요가 있다.
※ Pod의 Labels 값 확인
- kubectl get pod -o wide --show-labels
※ Service 내부 설정 정보 확인
- kubectl edit service 서비스명
Service는 Pod에 연결시켜주는 Network
어느 Service 유형이든 결국 Cluster IP를 통해 Pod에 접근 (Pod는 기본적으로 한 Node에서만 실행되지 않고 상황에 따라 Cluster내에 속한 여러 Node로 옮겨다닌다. 그러므로 Pod의 IP로 접속하는 데는 한계가 있고 동일한 서비스의 대표 IP인 Service의 IP로 접근하는 것이 편리하다.)
Service 종류
1. ClusterIP
: Default Service로서 Pod들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는가상의 클러스터 전용 IP
(IP는 Container에는 없고 Pod 에만 있다. Pod IP는 변경이 가능하므로 변경되지 않는 Virtual IP를 갖는 Service를 사용해야 한다)
: Cluster 내에서 Pod에 접속할 때는 Cluster IP를 이용한다.(Pod는 언제든지 죽고 다시 생성되어 IP가 변경되기 때문)
: Cluster IP로는 Cluster 내부에서만 접속할 수 있다.
: ClusterIP → Pod
2. NodePort
: 외부에서 노드 IP의 특정 포트(<NodeIP>:<NodePort>)로 들어오는 요청을 감지하여, 해당 포트와 연결된 파드로 트래픽을 전달하는 유형의 서비스다.
: 이때 클러스터 내부로 들어온 트래픽을 특정 파드로 연결하기 위한ClusterIP역시 자동으로 생성된다.
: Cluster 내의 아무 Node의 IP에 대한 Port 번호로 접속하도록 한다.
(30,000 ~ 32,767 포트 사용)
: NodePort → ClusterIP → Pod
3. LoadBalancer
: Layer2 ~ Layer4를 지원하는 부하조정 장비 (domain은 Layer7의 Ingress Controller가 처리)
: 클라우드 공급자(Public Cloud)의 로드 밸런서, 외부 장비, Metallb를 사용하여 서비스를 외부에 노출시킨다.
: 외부 로드 밸런서가 라우팅되는NodePort와ClusterIP서비스가 자동으로 생성된다.
: OnPoremises(사내)에서는 외부 LB 장비를 이용하거나 그것보다는 k8s의 Metallb라는 Load Balancer를 이용한다.
Metallb에 사용할 Secret 생성 - kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
** 외부에서 접속할 때 사용되는 IP생성을 위해 ConfigMap 생성 ** - wget http://down.cloudshell.kr/k8s/ConfigMap-Metallb.yaml - vi ConfigMap-Metallb.yaml (## 원하는 대역으로 수정 (기본IP 구성은 10.0.2.200-10.0.2.250인데 사내에 맞게 수정)) - kubectl apply -f ConfigMap-Metallb.yaml ▷ 이제 Load Balancer에 이 IP를 할당한다
Pod Object 특징 : 1개의 pod는 내부에 여러 개의 컨테이너를 가질 수 있지만 대부분 1~2개의 컨테이너를 갖는다. = "고래(Containers)들의 떼"
: 클러스터 내에서 사용할 수 있는 고유한 IP 주소를 할당 받지만, 이 ip는 Service에서 사용하지 않는다. : Pod의 외부에서는 'Service'를 통해 Pod에 접근한다.(Service가 Pod의 Endpoint를 관리한다.) : Pod 내부의 컨테이너들은 네트워크와 볼륨등을 공유하고 서로 localhost로 통신할 수 있다.