CNTUG meetup #23
Session 1. Vishwakarma - A self-hosting Kubernetes cluster on AWS - Kyle Bai
Vishwakarma: Terraform modules for deloying EKS and Self-hosting Kubernetes
Infrastructure as Code (IaC)
一般建 VM 大多都是使用類似 vagranet 這種 CLI Tool 或是用 Web Console 去部署,但是這樣 infra team 很難去維運。
透過 code 去定義資訊跟資源,用IaC 可以直接使用改 code 就可以自動部署在多個雲環境,會比手動使用 web console 更加有效率。
The problems IaC tools can solve
- Create/Change/Destroy 多個 infrastructure 資源,如 compute, storage, networking 或是如 database, kubernetes cluster 等。
- Update/Deploy infrastructure: 可以簡單地對 infra 去做升級及部署。
- Versioning infrastructure: 可以對 infra 架構做版本控管(因為是以code去表示)。
可對 Infrastructure 做版本控管
可先 dry run 確認,之後再真正 deploy Infra
(dry-run 可以預顯指令改變後的結果)
災難復原,可以快速 deploy different region or cloud provider。實際案例:17 play 由於 GCP 炸掉,導致服務掛掉,透過 IaC 能夠直接使用 code 部署在 Amazon 上面,不需要花太多時間去重建跟部署。
cloud-init: VM開啟時初始化(執行一些 pre-script/post-script),一般 private/public cloud 都會預先把它裝在 VM 裡。
Use the Hashicorp Configuration Language (HCL) to descrube the infrastructure resource.
- 專注於管理Infra, 可以管理不同的公有雲, 不適合做應用程式的部署。
Concepts:
- Provider: 哪個公有雲
- Provisioner: EC2, ELB, etc.
- Modules: 可以把 HCL 寫成一個 Modules 拿來 reuse ,類似 Library。
- Plan Phase: 寫完 HCL 時,可以先使用 Plan Phase 看看結果。
- HCL: 可以定義描述Infrastructure resource
- Apply Phase: 確定沒問題後執行 HCL。
Comparation:
Ues CLI or Console deploy VM on multi-cloud:
- 不同 Cloud 可能需要不同的 CLI 或是不同 Web Console
Terraform CLI:
- 不需要管不同的 Web Console, 只需要透過 Terraform 就可以部署 VM 在 multi-cloud。
terraform.tfvars 可以定義一些參數,例如: region, instance size or VPC …etc
Terraform 執行後會產生 terraform.tfstate ,之後的變動都會跟這個檔案做比對,類似 git diff 的功能
Kubernetes + Terraform
- 較少人使用,大多用
yaml
, Helm
部署。
- 可以使用 Terraform 部署 Kubernetes resource, 如: pod, deployment, service。
Vishwakarma
Vishwakarma can be used to ceate a Kubernetes cluster in AWS by leveraging HashiCorp Terraform and CoreOS.
- OS: coreOS, immutable, read-only
Challenges on build Kubernetes on AWS
- Maintain all AWS resource (EC2, instance, VPC)
- Kubernetes node(worker) scalability.
- Kubernetes components upgrade.
- Logging and monitoring.
- Configuration management.
Why deploy K8s by ourselves?
- Different instance type ASG(Auto Scaling Group).
- Network environment customize.
- Apply company policies: 例如網路不能對外,或是相關權限控管。
- Want more specific features: 可能需要自己客製化一些 Kubernetes 本身沒有的功能。
…
ElastKube
ElastKube is highly configurable Terraform module with building blocks. The motivation to build ElastiKube is that we need:
- Kubernetes master HA
- Kubernetes worker HA
- …
Session 2. Shift-Left Testing IaC With PaC - 蔡宗城 (Smalltown)
IaC project:
- Terraform
- Pulumi
- AWS CDK
…
More Security and Compliance Testing
shift left testing
Policy as Code (PaC)
what is policy?
- Compliance Policy: infrastructure 或 code 是否有符合 PCI, GDPR 規範。
- Security Policies: code或是傳輸是否有作加密,或是是否有其他安全疑慮。
- Operational Excellence: Cluster是否有做HA, Fail over等服務相關的機制。
some policy as code tools:
- ModSecurity:
- Sentinel: only for Hashicorp
- Inspec:
- Open Policy Agent:
Open Policy Agent
OPA Feature:
- Declarative Policy Language (Rego)
- Library, Sidecar,Host-Level Daemon。
OPA Integrations:
- Admission Control
- API Auth
How does OPA work?
Scenario 1.
A salary system: You and your supervisor can view your salary
Case 1: Network Misconfiguration
OPA test 可以確保 Terraform Code 是否是安全的以及這樣配置是否適當,例如防火牆禁止配置如 0.0.0.0/0
這樣完全公開的設定。
* configuration check
* Code Check
* PR can run OPA test in CI
Case 2. Audit K8s Cluster
- Require specific lables on all resources
How OPA Audit K8s
將 OPA agent 部署在 K8s (OPA 會變成 AdmissinoController),只要有部署資源,或是對 K8s 有任何操作, OPA 就會做 AdmissionView。
案例:某個使用者部署 OOM (Out of Memory) 的 pod ,導致同個 node 上的 pod 都被影響。因此可以透過 OPA 強制限定一定要撰寫 resources limit(quota)。
Session 3. 從大鯨魚 (Docker) 到地鼠三兄弟 (Podman: Pod manager) 的第一次旅程- Phil Huang 黃秉鈞
大部分從 Docker 轉移到 Podman 理由:
- Security
- Daemon 設計問題(使用量太大後,Daemon 資源會吃到 100%,會卡住沒辦法對 Docker 操作)
Podman 是 daemonless
改名稱:
Docker Registry => Container Registry
Docker Images => Container Images
Docker Container => OCI Container
Dockerfile => Containerfile
實作範例:
https://github.com/pichuang/debug-container
Podman 不可跟 Docker 併用
bud = build-using-dockerfile
What is the missing commands in podman?
- docker {network node plugin secret service stack swarm volume}
- docker container {update rename}
- Docker has daemon, but podman doesn't, so there's no command is "podman -d"
- podman-compose: 實作沒有完整,估計明年中可以使用
- 常用的做法: podman + systemd
- 要以Pod的觀點來維運,而非單一container (類似 k8s pod 概念)
- podman 打的是 root-less container
- Podman ,
Reference 建議閱讀
Experience sharing & Job sharing