이 세션에서는 Windows Kubernetes 클러스터를 구축하는 방법에 대해 자세히 설명하고 Windows 노드와 Linux 노드를 동시에 구성 할 수있는 하이브리드 Kubernetes 클러스터와 함께 Polyglot DevOps 환경을 활용하는 예제를 제공합니다.
Windows 기반 노드를 Linux 기반 노드로 구성된 기존 Kubernetes 클러스터에 통합하여 복잡한 응용 프로그램을 호스팅하는 방법을 배울 수 있습니다.
4. Agenda
• Real World Story
• Why We Use Windows Kubernetes
• Windows Container
• Windows Kubernetes
• AKS Engine
• What’s Next
5. Real World
Story
• 데브시스터즈에서 출시한 게임은 콘
텐츠는 물론, 기술적으로 좋은 레퍼
런스가 되고 있습니다.
• 그러나 기술에 매우 도전적인 자세로
임했던 데브시스터즈 조차도 한 가지
풀기 쉽지 않은 숙제가 있었습니다.
6. DEVSISTERS와 Windows Workload
• DEVSISTERS에서는 게임 서버 개발과 테스트 자동화를 위하여
Kubernetes를 성공적으로 도입했습니다.
• https://www.slideshare.net/seungyongoh3/ndc17-kubernetes
• 하지만 Kubernetes의 Windows OS 지원은 1.5 버전이 되어서야 겨
우 시작되었습니다.
• 2017년 말부터 Kuberntes 클러스터에 Windows Node 지원을 추가
하기 위한 R&D를 시작했습니다.
7. DEVSISTERS와 Windows Workload
(Cont.)
• 2017년 하반기부터 시작된 여정을 2019년 2월에야 끝맺었습니
다.
• https://github.com/kubernetes/kubernetes/issues/65163
• https://github.com/kubernetes/kubernetes/issues/66947
• 위의 이슈들을 해결할 수 있도록 도와주신 모든 분들께 다시 한
번 감사드립니다.
8. 구축 목표, 과정, 성과
구축 목표
• Windows와 Linux Pod
동시 사용
• 동일 서브넷에서 서로
다른 노드 OS 구동
구축 과정 및 성과
• 2018년 여름에
한시적으로 하이브리드
클러스터 운영
• 그 과정에서 발견된
2개의 이슈를 Windows
SIG 팀과 협업하여 해결
• 구축 및 운영 노하우
획득
구축 결과
• KOPS 클러스터에
Windows 노드 추가
• Windows Server 2019
대상
• MS SDN 스크립트로부
터 설치 자동화를 위한
자체 Tool 개발
9. KOPS Cluster + Windows
Node Example
• IIS Pod
• NGINX Ingress Controller
• Kubernetes 1.10.3 Cluster
11. 컨테이너화를 하는 이유
빠른 개발 좀 더 많은
반복 주기
클라우드
플랫폼 중립성
손쉬운 재현
환경 불변성
일관성
서비스 간의
분리 높은 가용성
대규모
테스트 지원
확장성
저렴한 비용
효율성
12. 오케스트레이션의 필요성
• 그러나 컨테이너화 하는 것만으로 일이 끝나지 않습니다.
• 여러 컨테이너 호스트에 효율적으로 컨테이너를 배포하고, 상황
에 따라 제어하는 기술이 필요합니다.
• 이것이 컨테이너 오케스트레이션입니다.
• 지금은 Kubernetes가 시장을 장악했습니다.
13. 앱을 빠르고 예측
가능하게 배포
즉시 앱을
스케일 업/다운
중단 없이 새로운
기능 배포
하드웨어 사용을
필수 리소스로만
제한
Kubernetes
16. Windows에서의 문제 (Cont.)
• 그렇다고 해서 Windows 기반 기술을 Linux 기반 기술로 대체하
는 것은 큰 리스크를 동반합니다.
• 제한된 시간과 비용으로 이런 리스크는 감당할 수 없습니다.
• 하지만 이제 그 격차가 줄어들고 있습니다.
• 지금이 바로 여러분의 Windows Server App을 컨테이너화 할
시간입니다.
19. Windows 서버 컨테이너 (Cont.)
• OS 수준의 가상화이므로 하이퍼바이저 불필요
• 커널이 컨테이너 내부의 모든 프로세스를 관리
• 기본 이미지로부터 차등분만 이미지로 저장
• VM을 사용하는 것 보다 훨씬 더 조밀한 서비스 제공 가능
• 단, 동일 커널을 사용하여 발생할 수 있는 이슈가 존재
• 이것은 리눅스 기반 컨테이너에서도 동일한 이슈
• Shared Kernel 방식의 컨테이너 실행 가능 개수는 무제한
20. 컨테이너 이미지
IIS
웹 사이트
기본 이미지 (OS)
프레임워크 이미지
애플리케이션
이미지 콘텐츠
파일과 폴더
License.txt PerfLogs Program Files
Program Files (x86) Users Windows
레지스트리
HKLM HKCU
HKCR HKU
이미지 콘텐츠
파일과 폴더
mysite.html
레지스트리
inetpub
SOFTWARE/
mykey
HKLM
21. 자동화된 이미지 빌드
Docker Build 명령과 Dockerfile
자동화된 이미지 빌드 방법
“docker build” 명령으로 실행
단계별 명령 수행 결과가 캐시됨
Docker Hub에 연동됨
Dockerfile 예제
IIS
FROM mcr.microsoft.com/windows/servercore
RUN powershell -Command Add-WindowsFeature Web-Server
웹 사이트
FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
ADD mysite.htm inetpubmysite.htm
22. Windows 컨테이너의 버전 선택
• 커널 구조의 차이로 도입
• Process 방식, Hyper-V 방식
• Windows 10에서 Windows
Container를 실행 시
• 클라이언트 커널 ≠ 서버 커널
• Hyper-V Isolation 필요
• 버전 간 호환성에 대하여
• https://bit.ly/2JSTo5A
Host >
Container
V
Win
Server
2016
Win 10
Creators
Update
1703
Win
Server
1803
Win 10
Fall
Creators
Update
1803
Win
Server
2019
Win 10
2018
April
Update
1809
Win
Server
2016
Process
Hyper-V
Hyper-V Hyper-V Hyper-V Hyper-V Hyper-V
Win
Server
1803
사용
불가
사용
불가
Process
Hyper-V
Hyper-V Hyper-V Hyper-V
Win
Server
2019
사용
불가
사용
불가
사용
불가
사용
불가
Process
Hyper-V
Hyper-V
25. 2016
4월: SIG-Windows 창설
- Apprenda, CloudBase,
TicketMaster, Docker, 화웨이
10월: Windows Server 2016
출시
12월: Kubernetes 1.5 출시
(Windows 지원 알파)
2017
Windows Server 버전 1709
출시
- 팟 내부에 여러 컨테이너
- WinCNI 및 kube-proxy
- OpenVirtualSwitch
2017
업계에서의 지원 확대
- Docker Enterprise Edition
- Red Hat OpenShift
- Tigera & Project Calico
Kubernetes 1.9 출시
(Windows 지원 베타)
26. 2018
Windows Server 버전 1803
출시
- 개선된 스토리지, 호환성
- 베타 – iSCSI & SMB
스토리지
- 알파 – Hyper-V Pod
Kubernetes 1.10 출시
(Windows 지원 베타)
2018
런칭을 위한 준비
- 리소스 거버넌스 & 메트릭
- 테스트 강화
- 버그 수정
Kubernetes 1.11 ~ 1.13 출시
(Windows 지원 베타)
2019
Windows Server 2019 출시
- 플랫폼 완비, LTSC
상용 제품 프리뷰 예정
- AKS, Docker, 화웨이, 레드햇
Kubernetes 1.14 출시
(Windows 지원 GA)
27. Windows Kubernetes History
Kubernetes 1.5
• Alpha State
• Transparent
Network
• Windows Server
2016
• Outbound 불가
Kubernetes 1.9
• Beta State
• L2 Bridge
• Windows Container
Network Interface
• Windows Server
1803
Kubernetes 1.14
• General Available
• Production Grade
• Windows Server
2019
29. Windows Kubernetes is now available!
• https://cloudblogs.microsoft.com/opensource/2019/03/25/win
dows-server-containers-now-supported-kubernetes/
• https://kubernetes.io/docs/setup/windows/intro-windows-in-
kubernetes/
30. Windows Kubernetes를 설치하는 방법
• 쉬운 방법: Azure + AKS Engine
• 다른 방법: Rancher 2.x의 Windows 지원 활용
• 어려운 방법: Microsoft SDN Script (with Reverse Engineering)
+ Win-Bridge + IPAM + 장인정신
31. Bootstrapping Windows Kubernetes
Windows Server 1803
VM 또는 베어메탈 준비
1
Node를 시작하기 전에
kubelet으로 노드를
먼저 등록하여 Pod
CIDR 확보
2
HNS에 새로운 L2
Bridge HNS Network
생성, Pod Gateway
어댑터 생성 및 부착
3
Kubelet, Kubeproxy 설
정 후 기동
4
Pod 간 수동 Routing
Table 등록
5
32. Windows
Kubernetes의
핵심
• HCS와 HNS가 핵심
• Kubernetes 입장에서는 Docker
REST API와 통신
• Docker는 HCS와 HNS와 커뮤니
케이션 진행
• Windows의 경우 추후 CRI
(Container Runtime Interface)가
도입될 예정
33. Host Compute Service
커널 수준의 가상화
• 컨테이너 내부의 OS 버전과 호스트
OS 버전이 반드시 일치해야 함
• Windows 10 클라이언트 PC에서
서버 커널은 이 방식으로 호스팅이
불가하며, 오로지 Hyper-V
Isolation만 지원
Hyper-V Isolation
• 가장 많이 오해를 받는 Windows
Docker 확장 기능
• 전체가 격리된 VM은 아니기
때문에 호스트 OS 버전보다 높은
버전의 컨테이너 OS는 실행 불가
• https://bit.ly/2JSTo5A
34. Host Compute Service (Cont.)
https://blogs.technet.microsoft.com/virtualization/2017/01/27/introducing-the-host-compute-service-hcs/
35. Host Compute Service (Cont.)
• Linux 커널의 일부 컴포넌트에 대응되는 기능을 하나의 컴포넌트로 통합 제공
• Control Group, Namespace
• Layer Capabilities: Union File System + Registry
• Windows Kubernetes에 공헌할 목적으로 Microsoft가 직접 Go Lang으로 HCS Shim도 제
공함
• https://github.com/Microsoft/hcsshim
• .NET Framework 버전의 HCS 제어 프로그램 소스 코드도 제공함
• https://github.com/Microsoft/dotnet-computevirtualization
36. Host Network Service
• 각종 네트워크 설정 제어 가능
• https://github.com/Microsoft/SDN
• /Kubernetes/Windows/HNS.psm1
• VmCompute.dll의 HNSCall 메서드 사용
• REST API 방식으로 호출 (Method + Resource Path + JSON Payload)
• HNS를 이용하여 주로 제어하는 부분
• 네트워크: 내부 네트워크
• 엔드포인트: 컨테이너들이 사용하는 가상 어댑터
• 정책: 다른 노드 (리눅스, 윈도)에서 실행되는 Pod의 네트워크 연결 정보
37. Host Network Service (Cont.)
• Compartment
• Windows 내부의 VLAN과 유사한 개념
• Kubernetes에서는 Pod에 대응
• Endpoint
• Container가 Kubernetes 내의 다른 Container나 외부와 통신할 수 있게 하는 수단
• Windows Application 입장에서는 가상의 Network Interface Card로 취급됨
40. 네트워킹 구성 (Cont.)
• Microsoft SDN Git Repo의 Kubernetes 코드 샘플에 HNS 네트워크 제어 모듈이 들어있음
• HNS 네트워크 제어 모듈을 이용하여 새 L2Bridge HNS 네트워크를 생성
• L2Bridge HNS 네트워크에 현재 Worker Node를 연결하기 위하여 새 HNS Endpoint를 생성하
고 만든 네트워크에 Attach
• CNI 플러그인 설정 파일 수정
• Kubelet, Kubeproxy 시작
• 수동 라우팅 정보 추가
41. WinBridge Configuration (Cont.)
{
"cniVersion": "0.2.0",
"name": "<NetworkMode>",
"type": "wincni.exe", "master": "Ethernet", "capabilities": { "portMappings": true },
"ipam": {
"environment": "azure", "subnet":"<PODCIDR>", "routes": [{ "GW":"<PODGW>" }]
},
"dns" : {
"Nameservers" : [ "<KubeDNSServiceIP>" ], "Search": [ "svc.cluster.local" ]
},
"AdditionalArgs" : [{
"Name" : "EndpointPolicy", "Value" : { "Type" : "OutBoundNAT", "ExceptionList": [ "<ClusterCIDR>", "<ServerCIDR>",
"<MgmtSubnet>" ] }
},{
"Name" : "EndpointPolicy", "Value" : { "Type" : "ROUTE", "DestinationPrefix": "<ServerCIDR>", "NeedEncap" : true }
},{
"Name" : "EndpointPolicy", "Value" : { "Type" : "ROUTE", "DestinationPrefix": "<MgmtIP>/32", "NeedEncap" : true }
}
]
}
HNS 네트워크의 형식 (L2Bridge)
Kubelet에 지정하는 –pod-cidr 스위치의
CIDR 값
kube-controller-manager의 –cluster-cidr
스위치에 지정하는 CIDR 값
현재 Node 컴퓨터의 IP 주소
현재 Node 컴퓨터에 할당된 IP 주소
대역 (Subnet Mask를 CIDR로 변환)
Kubelet에 지정하는 –cluster-dns
스위치의 CIDR 값
kube-api-server의 --service-
cluster-ip-range 스위치에
지정하는 CIDR 값
HNS 네트워크 생성 시 지정한
“.2”로 끝나는 주소
43. 간편하게 Kubernetes를
배포하고 관리
안심하고 응용프로그램
확장 및 실행
Kubernetes 실행
환경에 대한 확실한
보안
컨테이너화된
애플리케이션의 개발
가속화
오픈 소스 도구 및
API로 원하는 방식으로
작업
몇 번의 클릭만으로
CI/CD 설정
44. AKS Engine
• Microsoft가 제공하는 Azure Kubernetes Service를 실제로 만들기 위
해 사용하는 핵심 도구
• Azure CLI를 이용하여 AKS를 만드는 것과 동일한 기능을 제공
• 과금의 경우 마스터 컨트롤러 비용까지 같이 청구됨
• 다만 실제 AKS 서비스에 도입되기 전의 시나리오를 먼저 테스트 가능
• AKS Engine은 오픈소스
• https://github.com/azure/aks-engine
45. AKS Engine의 동작 방식
API Model Template
AKS Engine용
Template을 GitHub
에서 다운로드
Fill Out Params
Template의
Placeholder를 실제
값으로 교체
ARM Template
AKS Engine이 ARM
Template을 생성
Deploy
Azure CLI를 이용하
여 ARM Template
을 배포
Kubernetes
Cluster
새로운 Kubernetes
Cluster 준비됨
46. Hybrid Kubernetes Workload
• https://github.com/Azure/aks-
engine/blob/master/examples/windows/kubernetes-
hybrid.json
• Linux Agent Pool과 Windows Agent Pool을 동시에 구축
48. Create and Test Hybrid
Kubernetes Cluster with AKS
Engine
Demo
https://www.youtube.com/watch?v=8CMjgxccSOM
49. Azure Vote Hybrid Example
• Frontend와 Backend를 동시에 사용하는 Well-formed Example
• 보통은 양쪽 모두 Linux 컨테이너를 사용합니다.
• Hybrid Workload 테스트를 위하여 Backend는 Windows용으로
이식된 Microsoft Open Tech의 Redis Container로 변경해서 테
스트합니다.
53. Limitations
• 호스트 OS는 Windows Server 2019만 지원
• 컨테이너 이미지의 OS도 Windows Server 2019로 통일해야 함
• 네트워크 CNI 플러그인의 선택의 폭이 제한됨
• Kubenet, Flannel 정도가 검증된 선택지
• Calico, Open Virtual Network 등은 아직 개발 중
• 아직은 수동으로 설치해야 함 (Microsoft SDN 스크립트 참고)
• 1.15 버전에서 kubeadm 지원 추가 예정
54. Future
• 아직 Windows Kubernetes의 개발이 모두 완료되지 않았습니다.
• Kubernetes 1.15에서 개선될 예정인 다수의 기능들
• Docker EE에서 ContainerD로의 전환
• Hyper-V 컨테이너 정식 지원 추가
55. Wrap Up
• 효율적으로 설치하고 실행하는 방법을 찾으신다면 Azure AKS Engine을
사용하세요.
• Managed Kubernetes Cluster가 아니라면 Kubernetes 1.11을 제외한 나머
지 버전에서 곧바로 테스트해볼 수 있습니다.
• 조만간 Windows Kubernetes 지원이 여러분의 Managed Kubernetes
Cluster에 추가될 것입니다.
• 이제 Windows App을 Cloud Native App으로 Transform해야 할 때입니다.