4. Multi Master Nodes (1)
● kubeadm 명령을 이용해 Multi Master Nodes 클러스터 구축 가능
● 노드 여유가 있다면 클러스터를 생성할 때 Multi Master 구성 적용
● Kubernetes 1.14.x 이상
○ --experimental-upload-certs 옵션을 이용해 인증서 공유
● Kubernetes 1.13.x 이하
○ Master Node 생성 후에 인증서를 다른 Master 노드로 복사하는 작업 필요
5. Multi Master Nodes (2)
● kubeadm-config.yaml
● controlPlaneEndpoint 항목에 내부에서 사용하는 LoadBalancer IP 지정
○ HAProxy 등을 이용한 LoadBalancer IP
○ Keepalived, Heartbeat 등을 이용한 Failover 구성 적용 가능
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: 1.14.1
controlPlaneEndpoint: "NODEIP:6443"
7. Master Node 추가: 1.13.x 이하 (1)
● Master Node 생성
● 복사할 인증서 목록
$ sudo kubeadm init --config kubeadm-config.yaml
/etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/front-proxy-ca.crt
/etc/kubernetes/pki/ca.key /etc/kubernetes/pki/front-proxy-ca.key
/etc/kubernetes/pki/sa.key /etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/sa.pub /etc/kubernetes/pki/etcd/ca.key
8. Master Node 추가: 1.13.x 이하 (2)
● Master Node 추가
● 구성 확인
$ sudo kubeadm join NODEIP:6443
--token 9vr73a.a8uxyaju799qwdjv
--discovery-token-ca-cert-hash
sha256:7c2e69131a36ae2a042a339b33381c6d0d43887e2de83720eff5359e26aec866
--experimental-control-plane
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-1 Ready master 3d v1.14.1
k8s-2 Ready master 3d v1.14.1
k8s-3 Ready master 3d v1.14.1
9. ETCD Cluster (1)
● Etcd 클러스터 구성
○ External Etcd 구성은 노드 여유가 있고 관리할 여력이 있다면 고려
○ Etcd 클러스터 최소 가용 노드 수를 유지하는 것이 매우 중요
○ (n / 2) + 1 노드 수를 유지하지 못할 경우에는 클러스터 운영에 영향
Cluster Size Majority Failure Tolerance
3 2 1
4 3 1
5 3 2
6 4 2
10. ETCD Cluster (2)
● Etcd client 설치
● Etcd member list 확인
$ sudo ETCDCTL_API=3 etcdctl --cacert /etc/kubernetes/pki/etcd/ca.crt
--cert /etc/kubernetes/pki/etcd/peer.crt
--key /etc/kubernetes/pki/etcd/peer.key member list
18b80ec995adf496, started, k8s-3, https://10.10.1.4:2380, https://10.10.1.4:2379
2ee7a00cdb8ac627, started, k8s-1, https://10.10.1.2:2380, https://10.10.1.2:2379
bcd6b446c02976ab, started, k8s-2, https://10.10.1.3:2380, https://10.10.1.3:2379
$ sudo apt install etcd-client
11. Pod Network Add-on
● Network Add-on IP 대역과 노드에서 사용하는 대역이 겹칠 경우 문제
○ 예) Weave Net 은 기본값으로 10.32.0.0/12 사용
○ 노드에서 10.0.0.0/8 대역을 사용할 경우
○ 10.32.x.y IP 주소에 대한 라우팅을 결정할 수 없음
● 사용하는 Network Add-on 에 IP 대역을 변경할 수 있는 옵션 이용
○ 예) 노드에서 10.0.0.0/8 대역 사용 중
○ Weave Net 이 기본값으로 사용하는 10.32.0.0/12 는 사용 불가
○ IPALLOC_RANGE 옵션을 이용해 172.30.0.0/16 대역으로 변경
12. Proxy Mode (1)
● iptables
○ Kubeadm 을 이용해 클러스터를 구축할 경우 기본값
○ iptables 를 이용해 적절한 성능 보장
○ 노드가 늘어나고 Pod 증가에 따라 성능 저하 우려
● ipvs
○ Kubeadm 을 이용해 클러스터를 구축할 때 kubeproxy 옵션을 통해 지정
○ 대규모 노드에서도 성능 보장
○ MetalLB 와 동시에 사용할 때 문제 발생 가능성 존재
■ 적용 전 테스트 필요
13. Proxy Mode (2)
● ipvsadm 명령을 이용해 제대로 설정되었는지 확인 가능
$ sudo ipvsadm –ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.0.1:30000 rr
-> 172.30.192.6:8443 Masq 1 0 0
TCP 172.17.0.1:31868 rr
-> 172.30.192.1:9000 Masq 1 0 0
TCP 172.30.0.1:30000 rr
-> 172.30.192.6:8443 Masq 1 0 0
TCP 172.30.0.1:30443 rr
-> 172.30.192.8:9000 Masq 1 0 0
15. Management Tools (1)
● Kubernetes Dashboard
○ Web 기반 오픈소스 프로젝트
○ 사용자 인증 기능
○ YAML, JSON 파일을 직접 작성해 배포 가능
○ Deployment, ReplicaSet Scale 조절 가능
○ 컨테이너 로그 확인 기능
○ 웹 기반 터미널 기능 제공
16. Management Tools (2)
● kubectl
○ Command Line Interface 기반
○ 터미널로 접속하여 빠르게 원하는 작업 수행 가능
○ Kubectl Plugin 을 통해 추가적인 기능 제공
● Visual Studio Code: Kubernetes Plugin
○ Kubeconfig 파일을 이용해 로컬 클러스터 관리 가능
○ YAML 파일 템플릿 제공
○ TreeView 를 통해 클러스터 내부 컨테이너 상태 확인 가능
17. Namespace 관리 정책
● 프로젝트 별로 Namespace 할당
○ 프로젝트와 관계 있는 모든 자원을 하나의 Namespace 안에서 관리
○ 구성원이 Namespace 접근 권한을 공유하여 서비스 배포
○ 예) project-front, project-backend
● 조직 별로 Namespace 할당
○ 팀에서 사용할 수 있는 자원을 Namespace 별로 나눠 관리
○ 팀원은 Namespace 안에 있는 자원에 접근 가능
○ 예) dev-team: default, application, …
18. Namespace 접근 제어: ServiceAccount
● ServiceAccount 생성
● Role & RoleBinding 을 이용해 ServiceAccount 접근 권한 제어
● Namespace 에 접근할 때 사용할 ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: ghost-sa
namespace: ghost
19. Namespace 접근 제어: Role
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: ghost-role
namespace: ghost
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["*"]
verbs: ["*"]
- apiGroups: ["batch"]
resources:
- jobs
- cronjobs
verbs: ["*"]
22. MetalLB (1)
● On Premise 환경에서 LoadBalancer 지원
● Layer 2 Mode or BGP Mode 선택 가능
● 클러스터 외부에 노출할 IP 대역 지정 필요
● Proxy Mode 로 ipvs 를 사용할 경우 동작 테스트 필요
● MetalLB 설치
$ kubectl apply –f
https://raw.githubusercontent.com/google/metallb/v0.7.3/manifests/metallb.yaml
24. Rook with Ceph (1)
● Open-Source, Cloud-Native Storage for Kubernetes
○ https://rook.io
● Rook 을 이용해 Ceph 클러스터 생성 및 관리
● Pod 를 특정 노드에 종속시키지 않고 배포 가능
● Ceph 클러스터 구축
○ Bluestore 저장소 설정
○ 물리 디스크당 OSD
○ 복제본 개수를 2 이상으로 지정하여 데이터 유실 방지
36. Pod Quality of Service (1)
● Kubernetes 노드에서 필요한 메모리 자원이 부족할 경우 Pod 제거
○ BestEffort Pod, Burstable Pod 순으로 삭제
● Guaranteed
○ Pod 안에 있는 모든 컨테이너가 CPU, Memory 자원 Limit & Requests 지정
○ CPU, Memory 항목별로 Limit 과 Requests 값이 동일
○ Memory Limit 제한을 넘기 전에는 강제로 종료되지 않음을 보장
37. Pod Quality of Service (2)
● Burstable
○ Pod 안에 있는 하나 이상의 컨테이너가 CPU 혹은 Memory 자원 Requests 를 가짐
○ BestEffort Pod 가 하나도 없고, Requests 이상의 자원을 사용할 경우 제거 가능
● BestEffort
○ Pod 안에 있는 어떤 컨테이너도 Limit 혹은 Requests 를 가지지 않음
○ Memory 자원이 부족할 경우 먼저 제거되는 Pod
38. HostPath vs. Local Volume
● HostPath
○ 로컬 디스크를 컨테이너에서 사용할 수 있도록 연결
○ 노드에 장착되어 있는 디스크를 직접 사용하기 때문에 높은 성능 보장
○ 컨테이너가 다른 노드로 옮겨갈 경우에 데이터 유실 가능성
● Local Volume (1.14.x 이상)
○ 로컬 디스크를 컨테이너에 연결해주는 것은 HostPath 와 동일
○ Pod 와 연결된 Local Volume 을 인식하여 동일 노드에 배포되도록 보장
39. Deployment: MySQL (1)
● MySQL 에서 사용할 PersistentVolumeClaim 생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: ghost
spec:
storageClassName: rook-ceph-block
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
44. Prometheus
● Prometheus 를 설치해 클러스터 Metric 데이터 수집
● Helm 을 이용해 설치 가능
● Prometheus 와 Alertmanager 에서 사용할 Persistent Volume 필요
○ HostPath 혹은 Local Volume 사용 가능
○ 네트워크 대역폭이 충분하다면 Ceph 저장소를 연결하는 것도 가능
45. Grafana (1)
● Prometheus 에서 수집한 데이터를 다양한 Dashboard 로 표현
○ Kubernetes 클러스터를 보여주는 많은 Dashboard 가 이미 존재
■ 클러스터 전체적인 Metric 을 보여주는 Dashboard
■ Pod 상태를 보여주는 Dashboard
■ 노드 별 상태를 보여주는 Dashboard
● 내부 데이터를 저장하는데 사용할 Persistent Volume 필요
○ HostPath 혹은 Local Volume 사용 가능
○ Metric 데이터를 직접 저장하지 않기 때문에 Ceph 저장소도 고려해 볼만함
47. Filebeat
● DaemonSet 형태로 모든 노드에 배포
● 다양한 로그 수집
○ Kubernetes 노드에 쌓이는 syslog, auth 관련
○ 컨테이너에서 기록하는 로그
● 수집한 로그를 Elasticsearch 로 전달
○ 전달 전에 로그 안에서 불필요한 내용 제거
■ INFO, DEBUG 로그 제외
■ 테스트 목적을 가진 Namespace 에서 생성한 로그 등
48. Metricbeat (1)
● DaemonSet 형태로 모든 노드에 배포
● 시스템, 컨테이너, Kubernetes 상태 Metric 정보 수집
○ CPU, Load, Memory, Network, Process
○ Node, Pod, Container, Volume
● Kibana Infrastructure 기능을 통해 컨테이너 세부 Metric 정보 확인 가능
49. Metricbeat (2)
● Kubernetes Metric 수집 설정
kubernetes.yml: |-
- module: kubernetes
metricsets:
- node
- system
- pod
- container
- volume
period: 10s
host: ${NODE_NAME}
hosts: ["localhost:10255"]
50. Metricbeat (3)
● Kubelet 정보 수집을 위해 Read-Only-Port 열기 (기본값: 비활성화)
● /var/lib/kubelet/kubeadm-flags.env 파일에 옵션 추가
● Kubelet 재시작
KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --network-plugin=cni --pod-
infra-container-image=k8s.gcr.io/pause:3.1 --read-only-port 10255
sudo systemctl restart kubelet
51. Elasticsearch & Kibana
● 수집한 로그를 Kibana 에서 확인
● 원하는 키워드로 검색 가능
● Elasticsearch 를 배포할 때 Persistent Volume 사용
○ HostPath 혹은 Local Volume 사용 가능
○ 외부 Elasticsearch 클러스터도 괜찮은 구성
● Kibana Log 기능을 통해 원본 로그 확인 가능
56. NexClipper
● Open-Source Kubernetes Monitoring Service
○ https://github.com/NexClipper/NexClipper
● NexclipperAgent 를 DaemonSet 형태로 모든 노드에 배포
● Agent 에서 보내주는 데이터 수집
● 클러스터 Host, Container 등에서 Metric 데이터 수집
● Kubernetes Workloads Metric 데이터 수집
● Incident Manager 에 RuleSet 설정을 통해 중요 이벤트 검출 가능
63. Summary
● Multi Master Nodes 는 클러스터 구축 시에 같이
○ Etcd 클러스터 유효 노드 수 ((n / 2) + 1) 유지하는 것이 매우 중요
● Network Add-on 에서 사용하는 IP 대역과 노드 IP 대역 겹치지 않도록
● 노드 규모가 크다면 Proxy Mode 로 ipvs 고려
○ MetalLB 를 사용한다면 같이 동작하는지 테스트 필요
● Rook & Ceph 를 이용해 동적 Persistent Volume 사용 가능
● 다양한 Monitoring 방법 적용