容器與Cloud Native雲原生應用基礎修鍊內容拓展
之前提到過,這個時代對程序員來說,是最好的時代,也是最壞的時代。說其好,是群雄逐鹿,英雄輩出的時代;說其壞,是因為一旦固步自封會淘汰的比任何其他行業都要快。
雲計算時代,你是否意識到自己所設計的一切都應該是「現代服務」,是以容器承載,運行在彈性計算環境中的CloudNative應用?既然是在建設「現代服務」,需要學習和了解哪些方面的知識才能讓我們作出更好的服務設計?下面我們來簡單梳理一下。
作為雲計算時代的CloudNative應用,我們至少應了解和學習:容器,存儲,網路,監控,日誌,部署和安全等方面的知識。
1 容器
1.1 技術原理
容器本質上並不存在,當執行「docker run -dnginx:1.10」命令時,宿主機上並沒有運行一個容器,而是啟動了一個進程組,如下圖所示:
Advertisements
這個進程組的資源耗用是受控的。因此,容器是一個抽象概念,指代的是Linux的namespaces和cgroups。從概念上講,一個Linux容器由如下三部分構成:
namespaces,用於計算隔離
cgroups,用於資源耗用限制和資源耗用報告
支持寫入時複製(copy-on-write),用於保存狀態的文件系統
容器是一個進程(組),一個進程(組)可以在一個或多個命名空間中,並且可以被一個或多個cgroup控制。
1.1.1 Linux namespaces
Mount/CLONE_NEWNS
(始於Linux 2.4.19) 通過/proc/$PID/mounts: 文件系統掛載點
Advertisements
UTS/CLONE_NEWUTS
(始於Linux 2.6.19) 通過 uname -n, hostname -f : 節點名/主機名和 (NIS)域名
IPC/CLONE_NEWIPC
(始於Linux 2.6.19) 通過 /proc/sys/fs/mqueue, /proc/sys/kernel,/proc/sysvipc: 進程間通信資源隔離,通道為System V IPC對象,POSIX消息隊列
PID/CLONE_NEWPID
(始於Linux 2.6.24) 通過 /proc/$PID/status:進程ID編號空間隔離;PID名稱空間可以嵌套
Network/CLONE_NEWNET
(完成於Linux 2.6.29) 通過 ip netns list, /proc/net, /sys/class/net:網路系統資源(網路設備,IP地址,IP路由表,埠號等)
User/CLONE_NEWUSER
(完成於Linux 3.8) 通過 id, /proc/$PID/uid_map, /proc/$PID/gid_map:用戶和組ID編號空間隔離. UID+GIDs在名稱空間內部或外部
Cgroup/CLONE_NEWCGROUP
(始於Linux 4.6)通過/sys/fs/cgroup/,/proc/cgroups,/proc/$PID/cgroup
1.1.2 Linux cgroups
cpu/CONFIG_CGROUP_SCHED ( Linux 2.6.24)
cpuacct/CONFIG_CGROUP_CPUACCT ( Linux2.6.24)
cpuset/CONFIG_CPUSETS (Linux 2.6.24)
memory/CONFIG_MEMCG (Linux 2.6.25)
devices/CONFIG_CGROUP_DEVICE (Linux 2.6.26)
freezer/CONFIG_CGROUP_FREEZER (Linux2.6.28)
net_cls/CONFIG_CGROUP_NET_CLASSID (Linux2.6.29)
blkio/CONFIG_BLK_CGROUP (Linux 2.6.33)
perf_event/CONFIG_CGROUP_PERF (Linux2.6.39)
net_prio/CONFIG_CGROUP_NET_PRIO (Linux 3.3)
hugetlb/CONFIG_CGROUP_HUGETLB (Linux 3.5)
pids/CONFIG_CGROUP_PIDS (Linux 4.3)
1.1.3 COW(copy-on-write)文件系統
AUFS
btrfs
Overlay File system
Unionfs
ZFS on Linux
1.1.4 namespaces和cgroups相關工具
cinf
nsenter
unshare
man lsns (also: announcement lsns)
systemd-cgtop
cgroup-utils
yadutaf/ctop
1.2 運行時
容器的具體廠商實現有多種,如:Docker, CoreOS appc,Canonical LXC/LXD, 和OpenVZ等。
AppC/rkt,是由CoreOS推動的新興標準
Docker,是由同名公司提供的,現已改名為Moby
LXC, 由Canonical驅動的
OCI runC,後起之秀,或許在2017年可能成為新的標準。
cri-o,基於OCI的Kubernetes容器運行時介面的實現
containerd, 兼容OCI的Docker運行時
systemd-nspawn
1.3 設施供應和容器編排
Kubernetes (orchestration)
Marathon (orchestration)
Nomad (orchestration)
Swarm Kit (orchestration)
Terraform (provisioning)
1.4 容器倉庫
在線容器倉庫服務:
AWS EC2 Container Registry
CoreOS Quay.io
Docker Hub
Google Cloud Container Registry
JFrog Artifactory
SUSE Portus
本地
Docker registry
Nexus
Artifactory
Gitlab
1.5 CaaS
Amazon EC2 Container Service (ECS) 是一個Containeras a Service
Empire, 基於ECS的 PaaS
Convox, 基於ECS的 PaaS
Blox, 開源工具集,用於為ECS構建自定義的Schedulers
Azure Container Service (ACS) 有三種選擇: DC/OS,Docker Swarm, 或 Kubernetes
Google Container Engine (GKE)一個託管的Kubernetes產品
Last.Backend, 基於Kubernetes的CaaS / PaaS產品
1.6 測試,調試和內省
AWS X-Ray
docker exec 或調試一個Docker容器(http://pothibo.com/2015/7/how-to-debug-a-docker-container)
artillery.io, 一個現代的負載測試工具包
asobti/kube-monkey, 為Kubernetes集群提供的一個Netflix'sChaos Monkey實現
dcos-labs/drax, DC/OS的彈性自動化Xenodiagnosis工具
mhausenblas/cinf, 用於查看命名空間和cgroup的命令行工具
OpenTracing
Weave Scope
2 存儲(Storage)
2.1 容器存儲解決方案
EMC REX-ray
libStorage
2.2 消息隊列
ActiveMQ,SQS,Apollo,Apache Kafka,RabbitMQ,...,參考:queues.io
2.3 對象存儲
Amazon S3 (受控)
Azure Storage (受控)
Google Cloud Storage (受控)
LeoFS是一種非結構化的高可靠的對象/數據存儲系統,支持S3和NFS。
minio是S3的開源替代品,可以自行決定部署在何處以及如何使用。另請參閱Minio客戶端mc。
2.4 時間序列存儲
Geras:支持一些IoT格式/協議,如開箱即用的MQTT。
InfluxDB:用Go編寫的開放源碼的分散式時間序列資料庫,沒有任何外部依賴關係。擁有強大的類SQL查詢語言,利用正則表達式並支持連續查詢,以及一些聚合函數如PERCENTILE。提供基於Raft的群集模式。
KairosDB: 一個以Cassandra為底層存儲的分散式可擴展的時間序列資料庫。
kdb+: 提供具有時間原語和執行控制查詢語言,支持與R集成。
OpenTSDB: 在ApacheHBase之上提供的一種成熟的實現。支持數十億個數據點存儲,每秒可獲取10萬個數據點。
Prometheus:Soundcloud開源的服務監控系統和時間序列資料庫。Prometheus適用於記錄任何純數字時間序列。它適合以機器為中心的監控以及高度動態的面向服務架構的監控。
2.5 工具
boto, Amazon Web Services的一個Python介面
lsyncd 將本地目錄與遠程目標同步
rsync 跨(遠程)文件系統進行同步
rclone 是一個命令行程序,可以將文件和目錄同步到幾乎所有的目標。
scp 複製到遠程文件系統或者從遠程文件系統複製。
3 網路
3.1 負載均衡
AWS Elastic Load Balancing
Azure Load Balancer
Docker Cloud proxy
Google Cloud Load Balancing
HAProxy, the work horse
Kubernetes external load balancer
Marathon-LB
NGINX
Træfɪk
3.2 DNS
數字IP地址,如123.45.6.7,很不方便:機器和人類都更好地處理邏輯名稱,如selfie-service.example.com。可以參考howdns.works,了解如何將數字IP地址映射到邏輯名稱(實際上稱為完全限定域名或FQDN)及其查找由域名服務(DNS)規範定義。
3.3 Content Delivery Networks (CDN)
如果物理距離遠離伺服器,則數據到達之前需要更長時間。現在留出可用的帶寬,可以通過就近為最終用戶提供內容獲得更多的收益。內容分發網路(CDN)完全符合這一點:它們在物理上靠近你,減少延遲並提供更好的UX,通常用於靜態內容。
3.4 時間同步
分散式系統的一個非常重要的方面就是時間。存在多重挑戰:
在集群中的每個機器上,都有一個本地概念即當前時間是什麼;我們需要確保所有節點都是時間同步(不會發生時鐘偏移)的。解決方案通常是使用逐漸過時的ntp或者新的systemd-timesyncd與外部的NTP伺服器進行同步。
時間可能不會單調增加。這很像是時間倒退,如閏秒等。
現代分散式系統對時間的同步要求越來越高。
4 監控
在運行一個節點集群,每個節點運行一個或多個容器時。我們很希望在任何時間點都能夠了解節點、容器和服務中發生的情況。
對每一個節點,我們可以使用collectd 和 cAdvisor在本地歸集數據,然後可以選擇其他功能進行後續處理:
event router:
fluentd http://www.fluentd.org
Flume https://flume.apache.org
Kafka https://kafka.apache.org
logstashhttps://www.elastic.co/products/logstash
Riemann http://riemann.io
storage:
Elasticsearchhttps://www.elastic.co/products/elasticsearch
Graphite https://graphiteapp.org
InfluxDBhttps://influxdata.com/time-series-platform/influxdb
KairosDB (on top of Cassandra)https://kairosdb.github.io
OpenTSDB (on top of HBase)http://opentsdb.net
(others such as using a local filesystem, Ceph FS, HDFS ,etc.)
dashboard:
D3 https://d3js.org
Grafana https://grafana.net
signal fx https://signalfx.com
alerting:
BigPanda https://bigpanda.io
PagerDuty https://www.pagerduty.com
signal fx https://signalfx.com
VictorOps https://victorops.com
還有一些集成的端到端的解決方案以及第三方提供的監控管理的產品:
Amazon CloudWatchhttps://aws.amazon.com/cloudwatch
AppDynamics https://www.appdynamics.com
Azure Monitorhttps://azure.microsoft.com/services/application-insights
Circonus https://www.circonus.com
DataDog https://www.datadoghq.com
dcos/metrics
Ganglia http://ganglia.info
Google Stackdriverhttps://cloud.google.com/monitoring
Hawkular http://www.hawkular.org/
Icinga https://www.icinga.com
Librato https://www.librato.com
Nagios https://www.nagios.org
New Relic https://newrelic.com
OpsGenie https://www.opsgenie.com
Pingdom https://www.pingdom.com
Prometheus https://prometheus.io
Ruxit http://www.dynatrace.com/en/ruxit
Sensu https://sensuapp.org
Sysdig https://sysdig.com
Zabbix http://www.zabbix.com
5 日誌
日誌可分為三個級別:
主機級別或主機間日誌,指主機上的系統日誌和服務日誌以及捕獲不同主機之間的通信的日誌。
容器級和容器間日誌,也就是說,容器是如何運行的,具體取決於Docker引擎級別或其他主管進程的運行時類型。
服務或應用程序級以及業務相關的日誌,也就是在容器中運行的服務中生成的日誌及其通信方面的日誌。
具體的工具有:
Centralized App Logging with fluentd
DC/OS logging
Docker logging drivers
ELK stack log shipping, with ELK == Elasticsearch, Logstash,Kibana
Graylog
Kubernetes logging
Loggly
Papertrail
Scalyr
Splunk Logging Driver for Docker
Sumo Logic
systemd's journalctl
6 部署
健康檢查
滾動升級
金絲雀部署
藍-綠部署
可用的工具:
DC/OS zero downtime deployment
Docker Swarm
Kubernetes
VAMP
7 安全
7.1 Encryption, Authn & Authz
使用Let's Encrypt獲取SSL證書
使用SSO Auth0 和 JWT
了解HTTP 安全頭,並通過securityheaders.io進行檢查
7.2 容器
了解容器相關的安全理論
不要將敏感信息打包到容器鏡像中,可以使用環境變數或分散式內存鍵值對存儲來保存秘密數據。常用方案:
Vault
Keywhiz
Crypt
對容器進行脆弱性分析。
總結
本文大多數內容整理自http://some.ops4devs.info/,文中很多連接請參考原網站。