1. 2019 Global Azure Bootcamp Seoul
Windows Kubernetes Deep Dive
DEVSISTERS
Korea Azure User Group
Microsoft Azure MVP
남정현
2. Global Azure Bootcamp |
스피커 소개
남정현 (jeonghyun.nam@devsisters.com)
• DEVSISTERS DevOps Engineer
• 한국 Azure 사용자 그룹 운영진
• Microsoft MVP (Since 2009)
3. Global Azure Bootcamp |
Agenda
• Real World Story
• Why We Use Windows Kubernetes
• Windows Container
• Windows Kubernetes
• AKS Engine
• What’s Next
4. Global Azure Bootcamp |
Real World Story
• 데브시스터즈에서 출시한 게임은 콘
텐츠는 물론, 기술적으로 좋은 레퍼런
스가 되고 있습니다.
• 그러나 기술에 매우 도전적인 자세로
임했던 데브시스터즈 조차도 한 가지
풀기 쉽지 않은 숙제가 있었습니다.
5. Global Azure Bootcamp |
DEVSISTERS와 Windows Workload
• DEVSISTERS에서는 게임 서버 개발과 테스트 자동화를 위하
여 Kubernetes를 성공적으로 도입했습니다.
• https://www.slideshare.net/seungyongoh3/ndc17-kubernetes
• 하지만 Kubernetes의 Windows OS 지원은 1.5 버전이 되어서
야 겨우 시작되었습니다.
• 2017년 말부터 Kuberntes 클러스터에 Windows Node 지원을
추가하기 위한 R&D를 시작했습니다.
6. Global Azure Bootcamp |
DEVSISTERS와 Windows Workload (Cont.)
• 2017년 하반기부터 시작된 여정을 2019년 2월에 완료했습니
다.
• https://github.com/kubernetes/kubernetes/issues/65163
• https://github.com/kubernetes/kubernetes/issues/66947
• 위의 이슈들을 해결할 수 있도록 도와주신 모든 분들께 다시
한 번 감사드립니다.
7. Global Azure Bootcamp |
구축 목표, 과정, 성과
구축 목표
• Windows와 Linux Pod
동시 사용
• 동일 서브넷에서 서로
다른 노드 OS 구동
구축 과정 및 성과
• 2018년 여름에
한시적으로 하이브리드
클러스터 운영
• 그 과정에서 발견된
2개의 이슈를 Windows
SIG 팀과 협업하여 해결
• 구축 및 운영 노하우
획득
구축 결과
• KOPS 클러스터에
Windows 노드 추가
• Windows Server 2019
대상
• MS SDN 스크립트로부터
설치 자동화를 위한 자체
Tool 개발
8. KOPS Cluster +
Windows Node Example
• IIS Pod
• NGINX Ingress Controller
• Kubernetes 1.10.3 Cluster
10. 컨테이너화를 하는 이유
빠른 개발 좀 더 많은
반복 주기
클라우드
플랫폼 중립성
손쉬운 재현
환경 불변성
일관성
서비스 간의
분리 높은 가용성
대규모 테스
트 지원
확장성
저렴한 비용
효율성
11. Global Azure Bootcamp |
오케스트레이션의 필요성
• 그러나 컨테이너화 하는 것만으로 일이 끝나지 않습니다.
• 여러 컨테이너 호스트에 효율적으로 컨테이너를 배포하고,
상황에 따라 제어하는 기술이 필요합니다.
• 이것이 컨테이너 오케스트레이션입니다.
• 지금은 Kubernetes가 시장을 장악했습니다.
12. 앱을 빠르고 예측
가능하게 배포
즉시 앱을
스케일 업/다운
중단 없이 새로운
기능 배포
하드웨어 사용을
필수 리소스로만
제한
Kubernetes
14. Global Azure Bootcamp |
Windows에서의 문제
• Kubernetes가 좋긴 하지만 현실적인 문제가 있습니다.
• Windows가 Kubernetes와 호환되지 않는다는 것!
15. Global Azure Bootcamp |
Windows에서의 문제 (Cont.)
• 그렇다고 해서 Windows 기반 기술을 Linux 기반 기술로 대체
하는 것은 큰 리스크를 동반합니다.
• 제한된 시간과 비용으로 이런 리스크는 감당할 수 없습니다.
• 하지만 이제 그 격차가 줄어들고 있습니다.
• 지금이 바로 여러분의 Windows Server App을 컨테이너화 할
시간입니다.
18. Global Azure Bootcamp |
Windows 서버 컨테이너 (Cont.)
• OS 수준의 가상화이므로 하이퍼바이저 불필요
• 커널이 컨테이너 내부의 모든 프로세스를 관리
• 기본 이미지로부터 차등분만 이미지로 저장
• VM을 사용하는 것 보다 훨씬 더 조밀한 서비스 제공 가능
• 단, 동일 커널을 사용하여 발생할 수 있는 이슈가 존재
• 이것은 리눅스 기반 컨테이너에서도 동일한 이슈
• Shared Kernel 방식의 컨테이너 실행 가능 개수는 무제한
19. Global Azure Bootcamp |
컨테이너 이미지
IIS
웹 사이트
기본 이미지 (OS)
프레임워크 이미지
애플리케이션
이미지 콘텐츠
파일과 폴더
License.txt PerfLogs Program Files
Program Files (x86) Users Windows
레지스트리
HKLM HKCU
HKCR HKU
이미지 콘텐츠
파일과 폴더
mysite.html
레지스트리
inetpub
SOFTWARE/
mykey
HKLM
20. Global Azure Bootcamp |
자동화된 이미지 빌드
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
21. 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
23. 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 지원 베타)
Windows Kubernetes 개발 히스토리
24. Windows Kubernetes 개발 히스토리
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)
25. Global Azure Bootcamp |
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
26. Global Azure Bootcamp |
Linux Kubernetes와의 차이점
• HCS, HNS를 지원하는 컨테이너 런타임이 필요
• ContainerD 출시 전까지는 Windows Server용 Docker Enterprise
Edition을 기반으로 함
• Kube-Proxy가 컨테이너가 아닌 별도 바이너리로 Kubelet과
같은 위치에서 실행되어야 함
• Kube-Proxy를 별도의 NT 서비스로 실행해야 하고, Kubelet 시작 후
별도 실행이 필요함
27. Global Azure Bootcamp |
Windows Kubernetes를 설치하는 방법
• 쉬운 방법: Azure + AKS Engine
• 다른 방법: Rancher 2.x의 Windows 지원 활용
• 어려운 방법: Microsoft SDN Script (with Reverse Engineering) +
Win-Bridge + IPAM + 장인정신
• 만약 Kubernetes의 동작 원리를 체험하고 직접 살펴보기 원
한다면 Kubernetes the Hard Way 시리즈를 찾아보세요.
28. Global Azure Bootcamp |
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
29. Global Azure Bootcamp |
Windows
Kubernetes의
핵심
• HCS와 HNS가 핵심
• Kubernetes 입장에서는
Docker REST API와 통신
• Docker는 HCS와 HNS와 커뮤
니케이션 진행
• Windows의 경우 추후 CRI
(Container Runtime Interface)
가 도입될 예정
30. Global Azure Bootcamp |
Host Compute Service
커널 수준의 가상화
• 컨테이너 내부의 OS 버전과 호스트 OS
버전이 반드시 일치해야 함
• 서버가 Insider 빌드면 컨테이너 이미지도
Insider 빌드이면서 빌드 번호 일치 필수
• Windows 10 클라이언트 PC에서 서버
커널은 이 방식으로 호스팅이 불가하며,
오로지 Hyper-V Isolation만 지원
Hyper-V Isolation
• 이름만 Hyper-V를 차용하고 가상화 기술을
응용했을 뿐 VM이 아님
• 호스트 OS 버전보다 높은 버전의 컨테이너
OS는 실행 불가
• https://bit.ly/2JSTo5A
31. Global Azure Bootcamp |
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
32. Global Azure Bootcamp |
Host Network Service
• 각종 네트워크 설정 제어 가능
• https://github.com/Microsoft/SDN
• /Kubernetes/Windows/HNS.psm1
• VmCompute.dll의 HNSCall 메서드 사용
• REST API 방식으로 호출 (Method + Resource Path + JSON Payload)
• HNS를 이용하여 주로 제어하는 부분
• 네트워크: 내부 네트워크
• 엔드포인트: 컨테이너들이 사용하는 가상 어댑터
• 정책: 다른 노드 (리눅스, 윈도)에서 실행되는 Pod의 네트워크 연결 정보
33. Global Azure Bootcamp |
Host Network Service (Cont.)
• Compartment
• Windows 내부의 VLAN과 유사한 개념
• Kubernetes에서는 Pod에 대응
• Endpoint
• Container가 Kubernetes 내의 다른 Container나 외부와 통신할 수 있
게 하는 수단
• Windows Application 입장에서는 가상의 Network Interface Card로
취급됨
34.
35. Global Azure Bootcamp |
Pod Endpoint
Pod ==
Compartment
Linux와는 달리 별도의 NT 서비스로 구성 필수
Master에서 할당
Container
Node의 기본 IP 주소
Node의 기본 NIC
Linux Kubernetes의 cbr0과 동일
CIDR 대역의 첫 IP 주소
[중요] Pod IP 대역의 패
킷을 어디로 전달할지
라우팅 테이블을 지정해
야 함
36. Global Azure Bootcamp |
네트워킹 구성 방법
• Microsoft SDN Git Repo의 Kubernetes 코드 샘플에 HNS 네트워크 제어 모듈이 들
어있음
• HNS 네트워크 제어 모듈을 이용하여 새 L2Bridge HNS 네트워크를 생성
• L2Bridge HNS 네트워크에 현재 Worker Node를 연결하기 위하여 새 HNS
Endpoint를 생성하고 만든 네트워크에 Attach
• CNI 플러그인 설정 파일 수정
• Kubelet, Kubeproxy 시작
• 수동 라우팅 정보 추가
37. Global Azure Bootcamp |
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”
로 끝나는 주소
39. Global Azure Bootcamp |
AKS Engine
• Microsoft가 제공하는 Azure Kubernetes Service를 실제로 만
들기 위해 사용하는 핵심 도구
• Azure CLI를 이용하여 AKS를 만드는 것과 동일한 기능을 제공
• 과금의 경우 마스터 컨트롤러 비용까지 같이 청구됨
• 다만 실제 AKS 서비스에 도입되기 전의 시나리오를 먼저 테스트
가능
• AKS Engine은 오픈소스
• https://github.com/azure/aks-engine
40. Global Azure Bootcamp |
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 준비됨
41. Global Azure Bootcamp |
Hybrid Kubernetes Workload
• https://github.com/Azure/aks-
engine/blob/master/examples/windows/kubernetes-
hybrid.json
• Linux Agent Pool과 Windows Agent Pool을 동시에 구축
44. 2019 Global Azure Bootcamp Seoul
Create and Test Hybrid Kubernetes
Cluster with AKS Engine
Demo
45.
46. Global Azure Bootcamp |
Azure Vote Hybrid Example
• Frontend와 Backend를 동시에 사용하는 Well-formed Example
• 보통은 양쪽 모두 Linux 컨테이너를 사용합니다.
• Hybrid Workload 테스트를 위하여 Backend는 Windows용으로
이식된 Microsoft Open Tech의 Redis Container로 변경해서 테
스트합니다.
49. Global Azure Bootcamp |
YAML Code
• https://gist.github.com/rkttu/e30542d75b8e48d0cca1eec6eb0c
f86b
• Hybrid Workload에서 중요한 것은 Node Selector를 통한 적절
한 노드 선택.
• Windows 노드에 Linux 컨테이너를 배정하거나, 반대의 상황
이 발생하면 서비스가 시작되지 못함.
51. Global Azure Bootcamp |
Limitations
• 호스트 OS는 Windows Server 2019만 지원
• 컨테이너 이미지의 OS도 Windows Server 2019로 통일해야 함
• 네트워크 CNI 플러그인의 선택의 폭이 제한됨
• Kubenet, Flannel 정도가 검증된 선택지
• Calico, Open Virtual Network 등은 아직 개발 중
• 아직은 수동으로 설치해야 함 (Microsoft SDN 스크립트 참고)
• 1.15 버전에서 kubeadm 지원 추가 예정
• 그 외에 검토할 부분들이 있음
• https://kubernetes.io/docs/setup/windows/#limitations
52. Global Azure Bootcamp |
Future
• 아직 Windows Kubernetes의 개발이 진행 중
• Kubernetes 1.15에서 개선될 예정인 다수의 기능들
• Docker EE에서 ContainerD로의 전환
• Hyper-V 컨테이너 정식 지원 추가
53. Global Azure Bootcamp |
Wrap Up
• 효율적으로 설치하고 실행하는 방법을 찾으신다면 Azure
AKS Engine을 사용하세요.
• Managed Kubernetes Cluster가 아니라면 Kubernetes 1.11을
제외한 나머지 버전에서 곧바로 테스트해볼 수 있습니다.
• 조만간 Windows Kubernetes 지원이 여러분의 Managed
Kubernetes Cluster에 추가될 것입니다.
• 이제 Windows App을 Cloud Native App으로 Transform해야 할
때입니다.