2장. 인프라 구성 요소
2.1. Kubernetes 인프라
2.1.1. 개요
OpenShift Container Platform 내에서 Kubernetes는 컨테이너 또는 호스트 집합에서 컨테이너화된 애플리케이션을 관리하고 배포, 유지 관리 및 애플리케이션 확장에 대한 메커니즘을 제공합니다. 컨테이너화된 애플리케이션을 인스턴스화 및 실행합니다. Kubernetes 클러스터는 하나 이상의 마스터와 노드 집합으로 구성됩니다.
클러스터에 단일 장애 지점이 없는지 확인하기 위해 선택적으로 HA(고가용성 )를 위해 마스터를 구성할 수 있습니다.
OpenShift Container Platform은 Kubernetes 1.11 및 Docker 1.13.1을 사용합니다.
2.1.2. 마스터
마스터는 API 서버, 컨트롤러 관리자 서버 및 etcd를 포함하여 컨트롤 플레인 구성 요소가 포함된 호스트 또는 호스트입니다. 마스터는 Kubernetes 클러스터에서 노드를 관리하고 해당 노드에서 실행되도록 포드를 예약합니다.
구성 요소 | 설명 |
---|---|
API 서버 | Kubernetes API 서버는 포드, 서비스 및 복제 컨트롤러의 데이터를 검증하고 구성합니다. 또한 노드에 포드를 할당하고 서비스 구성과 포드 정보를 동기화합니다. |
etcd | etcd는 영구 마스터 상태를 저장하고 다른 구성 요소는 etcd에서 변경 사항을 원하는 상태로 표시합니다. 고가용성을 위해 etcd를 선택적으로 구성할 수 있으며 일반적으로 2n+1 피어 서비스로 배포할 수 있습니다. |
컨트롤러 관리자 서버 | 컨트롤러 관리자 서버는 etcd에서 복제 컨트롤러 오브젝트의 변경 사항을 감시한 다음 API를 사용하여 원하는 상태를 적용합니다. 이러한 여러 프로세스는 한 번에 하나의 활성 리더가 있는 클러스터를 생성합니다. |
HAProxy |
API 마스터 엔드포인트 간에 부하를 분산하도록 |
2.1.2.1. 컨트롤 플레인 정적 포드
핵심 컨트롤 플레인 구성 요소, API 서버 및 컨트롤러 관리자 구성 요소는 kubelet에서 작동하는 정적 Pod 로 실행됩니다.
etcd가 동일한 호스트에 공동 배치된 마스터의 경우 etcd도 정적 포드로 이동합니다. RPM 기반 etcd는 여전히 마스터가 아닌 etcd 호스트에서 지원됩니다.
또한 노드 구성 요소 openshift-sdn 및 openvswitch 는 systemd 서비스 대신 DaemonSet을 사용하여 실행됩니다.
그림 2.1. 컨트롤 플레인 호스트 아키텍처 변경
컨트롤 플레인 구성 요소가 정적 포드로 실행되는 경우에도 마스터 호스트는 마스터 및 노드 구성 항목에 설명된 대로 /etc/origin/master/master-config.yaml 파일에서 구성을 계속 제공합니다.
시작 순서 개요
Hyperkube 는 모든 Kubernetes(kube-apiserver,controller- manager,스케줄러,프록시, kubelet)를 포함하는 바이너리입니다. 시작 시 kubelet 은 kubepods.slice 를 생성합니다. 다음으로 kubelet 은 kubepods.slice 내에 QoS 수준 슬라이스 burstable.slice 및 best-effort.slice 를 생성합니다. Pod가 시작되면 kubelet 은 pod<UUID-of-pod>.slice
형식을 사용하여 Pod 수준 슬라이스를 생성하고 CRI(컨테이너 런타임 인터페이스)의 다른 쪽의 런타임에 해당 경로를 전달합니다. 그런 다음 Docker 또는 CRI-O가 Pod 수준 슬라이스 내에 컨테이너 수준 슬라이스를 생성합니다.
미러 Pod
마스터 노드의 kubelet은 kube-system 프로젝트의 클러스터에 표시되도록 각 컨트롤 플레인 정적 Pod에 대해 API 서버에 미러 Pod를 자동으로 생성합니다. 이러한 정적 포드의 매니페스트는 기본적으로 마스터 호스트의 /etc/origin/node/pods 디렉터리에 있는 openshift-ansible 설치 프로그램에서 설치합니다.
이러한 Pod에는 다음과 같은 hostPath
볼륨이 정의되어 있습니다.
/etc/origin/master | 모든 인증서, 구성 파일 및 admin.kubeconfig 파일을 포함합니다. |
/var/lib/origin | 바이너리의 볼륨 및 잠재적인 코어 덤프를 포함합니다. |
/etc/origin/cloudprovider | 클라우드 공급자별 구성(AWS, Azure 등)을 포함합니다. |
/usr/libexec/kubernetes/kubelet-plugins | 추가 타사 볼륨 플러그인을 포함합니다. |
/etc/origin/kubelet-plugins | 시스템 컨테이너용 추가 타사 볼륨 플러그인을 포함합니다. |
정적 Pod에서 수행할 수 있는 작업 세트는 제한됩니다. 예를 들면 다음과 같습니다.
$ oc logs master-api-<hostname> -n kube-system
API 서버에서 표준 출력을 반환합니다. 그러나 다음을 수행합니다.
$ oc delete pod master-api-<hostname> -n kube-system
포드를 실제로 삭제하지 않습니다.
또 다른 예로 클러스터 관리자는 문제가 발생하는 경우 더 자세한 데이터를 제공하기 위해 API 서버의 로그
수준을 늘리는 등 일반적인 작업을 수행해야 할 수 있습니다. 이 값이 컨테이너 내부에서 실행되는 프로세스로 전달되므로 /etc/origin/master/master.env 파일을 편집해야 합니다. 여기서 OPTIONS
변수의 --loglevel
매개 변수를 수정할 수 있습니다. 변경 사항을 적용하려면 컨테이너 내부에서 실행 중인 프로세스를 다시 시작해야 합니다.
마스터 서비스 다시 시작
컨트롤 플레인 정적 포드에서 실행 중인 컨트롤 플레인 서비스를 다시 시작하려면 마스터 호스트에서 master-restart
명령을 사용합니다.
마스터 API를 다시 시작하려면 다음을 수행합니다.
# master-restart api
컨트롤러를 다시 시작하려면 다음을 수행합니다.
# master-restart controllers
etcd를 다시 시작하려면 다음을 수행합니다.
# master-restart etcd
마스터 서비스 로그 보기
컨트롤 플레인 정적 Pod에서 실행되는 컨트롤 플레인 서비스의 로그를 보려면 해당 구성 요소에 대해 master-logs
명령을 사용합니다.
# master-logs api api
# master-logs controllers controllers
# master-logs etcd etcd
2.1.2.2. 고가용성 마스터
클러스터에 단일 장애 지점이 없는지 확인하기 위해 선택적으로 HA(고가용성)를 위해 마스터를 구성할 수 있습니다.
마스터 가용성에 대한 우려를 완화하려면 다음 두 가지 활동을 사용하는 것이 좋습니다.
- 마스터를 다시 만들기 위해 런북 항목을 만들어야 합니다. 런북 항목은 고가용성 서비스에 필요한 백플레이스입니다. 추가 솔루션은 런북을 참조해야 하는 빈도만 제어합니다. 예를 들어 마스터 호스트의 콜드 대기 모드는 새 애플리케이션을 생성하거나 실패한 애플리케이션 구성 요소를 복구하기 위해 몇 분 이상의 다운타임이 필요한 SLA를 적절히 이행할 수 있습니다.
-
고가용성 솔루션을 사용하여 마스터를 구성하고 클러스터에 단일 장애 지점이 없는지 확인합니다. 클러스터 설치 문서에서는
기본
HA 방법을 사용하고 HAProxy를 구성하는 특정 예를 제공합니다. HAProxy 대신기본
방법을 사용하여 개념을 사용하여 기존 HA 솔루션에 적용할 수도 있습니다.
프로덕션 OpenShift Container Platform 클러스터에서는 API 서버 로드 밸런서의 고가용성을 유지 관리해야 합니다. API 서버 로드 밸런서를 사용할 수 없는 경우 노드에서 상태를 보고할 수 없으며, 모든 포드가 dead으로 표시되며 포드 엔드포인트가 서비스에서 제거됩니다.
OpenShift Container Platform용 HA를 구성하는 것 외에도 API 서버 로드 밸런서에 대해 HA를 별도로 구성해야 합니다. HA를 구성하려면 F5 Big-IP™ 또는 Citrix Netscaler™ 어플라이언스와 같은 LB(엔터프라이즈 로드 밸런서)를 통합하는 것이 좋습니다. 이러한 솔루션을 사용할 수 없는 경우 여러 HAProxy 로드 밸런서를 실행하고 Keepalived를 사용하여 HA에 유동 가상 IP 주소를 제공할 수 있습니다. 그러나 이 솔루션은 프로덕션 인스턴스에 권장되지 않습니다.
HAProxy와 함께 기본
HA 방법을 사용하는 경우 마스터 구성 요소는 다음과 같은 가용성을 갖습니다.
Role | 스타일 | 참고 |
---|---|---|
etcd | active-active | 부하 분산을 통해 배포를 완전히 중복합니다. 별도의 호스트에 설치하거나 마스터 호스트에 배치할 수 있습니다. |
API 서버 | active-active | HAProxy에서 관리합니다. |
컨트롤러 관리자 서버 | active-passive | 한 번에 하나의 인스턴스가 클러스터 리더로 선택됩니다. |
HAProxy | active-passive | API 마스터 엔드포인트 간에 부하 분산. |
클러스터형 etcd에는 쿼럼에 대한 홀수의 호스트가 필요하지만 마스터 서비스에는 홀수의 호스트가 있다는 쿼럼이나 요구 사항이 없습니다. 그러나 HA에 대해 두 개 이상의 마스터 서비스가 필요하므로 마스터 서비스 및 etcd를 함께 배치할 때 일관된 홀수의 호스트를 유지하는 것이 일반적입니다.
2.1.3. 노드
노드는 컨테이너를 위한 런타임 환경을 제공합니다. Kubernetes 클러스터의 각 노드에는 마스터에서 관리하는 데 필요한 서비스가 있습니다. 노드에는 컨테이너 런타임, kubelet 및 서비스 프록시를 포함하여 Pod를 실행하는 데 필요한 서비스도 있습니다.
OpenShift Container Platform은 클라우드 공급자, 물리적 시스템 또는 가상 시스템에서 노드를 생성합니다. Kubernetes는 해당 노드를 나타내는 노드 오브젝트 와 상호 작용합니다. 마스터는 노드 오브젝트의 정보를 사용하여 상태 점검에서 노드를 검증합니다. 노드는 상태 점검을 통과할 때까지 무시되며 마스터는 노드가 유효할 때까지 노드를 계속 확인합니다. Kubernetes 설명서 에는 노드 상태 및 관리에 대한 자세한 정보가 있습니다.
관리자는 CLI를 사용하여 OpenShift Container Platform 인스턴스에서 노드를 관리할 수 있습니다. 노드 서버를 시작할 때 전체 구성 및 보안 옵션을 정의하려면 전용 노드 구성 파일을 사용합니다.
권장되는 최대 노드 수는 클러스터 제한 섹션을 참조하십시오.
2.1.3.1. kubelet
각 노드에는 Pod를 설명하는 YAML 파일인 컨테이너 매니페스트에서 지정한 대로 노드를 업데이트하는 kubelet이 있습니다. kubelet은 매니페스트 세트를 사용하여 해당 컨테이너가 시작되고 계속 실행되도록 합니다.
다음을 통해 kubelet에 컨테이너 매니페스트를 제공할 수 있습니다.
- 20초마다 확인되는 명령줄의 파일 경로입니다.
- 20초마다 확인되는 명령줄에서 HTTP 엔드포인트가 전달됩니다.
- kubelet은 /registry/hosts/$(hostname -f) 와 같은 etcd 서버를 모니터링하고 변경 사항을 적용합니다.
- HTTP를 수신 대기하고 간단한 API에 응답하여 새 매니페스트를 제출하는 kubelet입니다.
2.1.3.2. 서비스 프록시
각 노드는 해당 노드의 API에 정의된 서비스를 반영하는 간단한 네트워크 프록시도 실행합니다. 이를 통해 노드는 백엔드 집합에서 간단한 TCP 및 UDP 스트림 전달을 수행할 수 있습니다.
2.1.3.3. 노드 오브젝트 정의
다음은 Kubernetes의 노드 오브젝트 정의의 예입니다.
apiVersion: v1 1 kind: Node 2 metadata: creationTimestamp: null labels: 3 kubernetes.io/hostname: node1.example.com name: node1.example.com 4 spec: externalID: node1.example.com 5 status: nodeInfo: bootID: "" containerRuntimeVersion: "" kernelVersion: "" kubeProxyVersion: "" kubeletVersion: "" machineID: "" osImage: "" systemUUID: ""
2.1.3.4. 노드 부트스트랩
노드의 구성이 마스터에서 부트스트랩되므로 노드가 마스터에서 사전 정의된 구성과 클라이언트 및 서버 인증서를 가져옵니다. 따라서 노드 간 차이점을 줄이고 더 많은 구성을 중앙 집중화하고 원하는 상태에 클러스터가 병합되므로 더 빠른 노드 시작이 가능합니다. 인증서 교체 및 중앙 집중식 인증서 관리는 기본적으로 활성화되어 있습니다.
그림 2.2. 노드 부트스트랩 워크플로 개요
노드 서비스가 시작되면 노드는 클러스터에 참여하기 전에 /etc/origin/node/node.kubeconfig 파일 및 기타 노드 구성 파일이 있는지 확인합니다. 노드가 없는 경우 노드는 마스터에서 구성을 가져온 다음 클러스터에 결합합니다.
ConfigMaps 는 /etc/origin/node/node-config.yaml 의 노드 호스트에서 구성 파일을 채우는 클러스터에 노드 구성을 저장하는 데 사용됩니다. 기본 노드 그룹 및 해당 ConfigMap 세트의 정의는 클러스터 설치에서 노드 그룹 및 호스트 맵핑 정의를 참조하십시오.
노드 부트스트랩 워크플로
자동 노드 부트스트랩 프로세스는 다음 워크플로우를 사용합니다.
기본적으로 클러스터 설치 중에 노드 부트스트랩에 사용하기 위해
및clusterrole
, clusterrolebindingserviceaccount
오브젝트 세트가 생성됩니다.system:node-bootstrapper 클러스터 역할은 노드 부트스트랩 중에 CSR(인증서 서명 요청)을 생성하는 데 사용됩니다.
$ oc describe clusterrole.authorization.openshift.io/system:node-bootstrapper
출력 예
Name: system:node-bootstrapper Created: 17 hours ago Labels: kubernetes.io/bootstrapping=rbac-defaults Annotations: authorization.openshift.io/system-only=true openshift.io/reconcile-protect=false Verbs Non-Resource URLs Resource Names API Groups Resources [create get list watch] [] [] [certificates.k8s.io] [certificatesigningrequests]
다음 node-bootstrapper 서비스 계정이 openshift-infra 프로젝트에 생성됩니다.
$ oc describe sa node-bootstrapper -n openshift-infra
출력 예
Name: node-bootstrapper Namespace: openshift-infra Labels: <none> Annotations: <none> Image pull secrets: node-bootstrapper-dockercfg-f2n8r Mountable secrets: node-bootstrapper-token-79htp node-bootstrapper-dockercfg-f2n8r Tokens: node-bootstrapper-token-79htp node-bootstrapper-token-mqn2q Events: <none>
다음 system:node-bootstrapper 클러스터 역할 바인딩은 노드 부트스트랩자 클러스터 역할 및 서비스 계정에 사용됩니다.
$ oc describe clusterrolebindings system:node-bootstrapper
출력 예
Name: system:node-bootstrapper Created: 17 hours ago Labels: <none> Annotations: openshift.io/reconcile-protect=false Role: /system:node-bootstrapper Users: <none> Groups: <none> ServiceAccounts: openshift-infra/node-bootstrapper Subjects: <none> Verbs Non-Resource URLs Resource Names API Groups Resources [create get list watch] [] [] [certificates.k8s.io] [certificatesigningrequests]
클러스터 설치 중에 openshift-ansible 설치 프로그램은 OpenShift Container Platform 인증 기관과 다양한 다른 인증서, 키 및 kubeconfig 파일을 /etc/origin/master 디렉터리에 생성합니다. 두 개의 참고 파일은 다음과 같습니다.
/etc/origin/master/admin.kubeconfig
system:admin 사용자를 사용합니다.
/etc/origin/master/bootstrap.kubeconfig
마스터 이외의 노드 부트스트랩 노드에 사용됩니다.
설치 프로그램이 다음과 같이 node- bootstrapper 서비스 계정을 사용하는 경우 /etc/origin/master/bootstrap.kubeconfig 가 생성됩니다.
$ oc --config=/etc/origin/master/admin.kubeconfig \ serviceaccounts create-kubeconfig node-bootstrapper \ -n openshift-infra
- 마스터 노드에서 /etc/origin/master/admin.kubeconfig 는 부트스트랩 파일로 사용되며 /etc/origin/node/boostrap.kubeconfig 에 복사됩니다. 다른 비마스터 노드에서 /etc/origin/master/bootstrap.kubeconfig 파일이 각 노드 호스트의 /etc/origin/node/boostrap.kubeconfig 의 다른 모든 노드에 복사됩니다.
그런 다음 /etc/origin/master/bootstrap.kubeconfig 가 다음과 같이
--bootstrap-kubeconfig
플래그를 사용하여 kubelet에 전달됩니다.--bootstrap-kubeconfig=/etc/origin/node/bootstrap.kubeconfig
- kubelet은 제공된 /etc/origin/node/bootstrap.kubeconfig 파일로 처음 시작됩니다. 내부적으로 초기 연결 후 kubelet은 CSR(인증서 서명 요청)을 생성하여 마스터로 보냅니다.
CSR은 컨트롤러 관리자(특히 인증서 서명 컨트롤러)를 통해 확인하고 승인합니다. 승인되면 kubelet 클라이언트 및 서버 인증서가 /etc/origin/node/ceritificates 디렉터리에 생성됩니다. 예를 들면 다음과 같습니다.
# ls -al /etc/origin/node/certificates/
출력 예
total 12 drwxr-xr-x. 2 root root 212 Jun 18 21:56 . drwx------. 4 root root 213 Jun 19 15:18 .. -rw-------. 1 root root 2826 Jun 18 21:53 kubelet-client-2018-06-18-21-53-15.pem -rw-------. 1 root root 1167 Jun 18 21:53 kubelet-client-2018-06-18-21-53-45.pem lrwxrwxrwx. 1 root root 68 Jun 18 21:53 kubelet-client-current.pem -> /etc/origin/node/certificates/kubelet-client-2018-06-18-21-53-45.pem -rw-------. 1 root root 1447 Jun 18 21:56 kubelet-server-2018-06-18-21-56-52.pem lrwxrwxrwx. 1 root root 68 Jun 18 21:56 kubelet-server-current.pem -> /etc/origin/node/certificates/kubelet-server-2018-06-18-21-56-52.pem
- CSR 승인 후 node.kubeconfig 파일이 /etc/origin/node/node.kubeconfig 에 생성됩니다.
- kubelet은 /etc/origin/node/node.kubeconfig 파일과 /etc/origin/node/certificates/ 디렉터리의 인증서로 다시 시작됩니다. 이 인증서는 클러스터에 참여할 준비가 되었습니다.
노드 설정 워크플로
노드의 구성을 소싱하려면 다음 워크플로우를 사용합니다.
- 처음에 노드의 kubelet은 노드 프로비저닝 시 생성된 /etc/origin/ node/ 디렉터리에 부트스트랩 구성 파일 bootstrap-node -config.yaml 로 시작됩니다.
- 각 노드에서 노드 서비스 파일은 /usr/local/bin/ 디렉터리에 있는 로컬 스크립트 openshift-node 를 사용하여 제공된 bootstrap-node-config.yaml 을 사용하여 kubelet을 시작합니다.
- 각 마스터에서 /etc/origin/node/pods 디렉터리에는 마스터에서 정적 포드로 생성되는 apiserver,controller 및 etcd 의 Pod 매니페스트가 포함되어 있습니다.
클러스터 설치 중에 각 노드에 동기화 Pod를 생성하는 동기화 DaemonSet이 생성됩니다. 동기화 포드는 /etc/sysconfig/atomic-openshift-node 파일의 변경 사항을 모니터링합니다.
BOOTSTRAP_CONFIG_NAME
이 설정되도록 특히 감시합니다.BOOTSTRAP_CONFIG_NAME
은 openshift-ansible 설치 프로그램에서 설정하며 노드가 속하는 노드 구성 그룹에 따라 ConfigMap의 이름입니다.기본적으로 설치 프로그램은 다음 노드 구성 그룹을 생성합니다.
- node-config-master
- node-config-infra
- node-config-compute
- node-config-all-in-one
- node-config-master-infra
각 그룹의 ConfigMap은 openshift-node 프로젝트에 생성됩니다.
-
동기화 Pod는
BOOTSTRAP_CONFIG_NAME
에 설정된 값을 기반으로 적절한 ConfigMap을 추출합니다. - 동기화 Pod는 ConfigMap 데이터를 kubelet 구성으로 변환하고 해당 노드 호스트에 대한 /etc/origin/node/node-config.yaml 을 생성합니다. 이 파일(또는 파일의 초기 생성)을 변경하면 kubelet이 다시 시작됩니다.
노드 구성 수정
노드의 구성은 openshift-node 프로젝트에서 적절한 ConfigMap을 편집하여 수정합니다. /etc/origin/node/node-config.yaml 은 직접 수정해서는 안 됩니다.
예를 들어 node -config-compute 그룹에 있는 노드 의 경우 다음을 사용하여 ConfigMap을 편집합니다.
$ oc edit cm node-config-compute -n openshift-node