docker
一個應用想以容器化的形式部署運行起來饰豺,需要經(jīng)過2個步驟:
構(gòu)建鏡像
實例化
以dmp為例肥荔,按照一個鏡像只包含單個應用的原則楔脯,dmp需要構(gòu)建3個鏡像:console污尉、client示弓、front。
那么每次部署需要執(zhí)行 docker build 行冰、docker run 各3次溺蕉,且3個容器run的參數(shù)是很不一樣的,再加上要考慮多個容器之間的依賴悼做、網(wǎng)絡(luò)問題疯特,這就導致部署變得非常復雜。
舉例一個mysql的 docker run :
docker run -d --rm --name mysql \
-v /data/mysql/conf:/etc/mysql/conf.d \
-v /data/mysql/init:/docker-entrypoint-initdb.d \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
docker-compose
用途:docker容器快速編排肛走,解決了容器依賴漓雅、組網(wǎng)等問題
適用場景:本地開發(fā)、測試環(huán)境
不適用場景:生產(chǎn)環(huán)境
docker-compose.yaml朽色,以dmp為例
version: "3"
services:
console:
build: ./console
ports:
- "8020:8020"
volumes:
- /data1/release/dmp/${test_env}/logs:/home/nginx/release/logs
- /etc/hosts:/etc/hosts
env_file:
- ./console/console.env
networks:
dmp:
aliases:
- console
client:
build: ./client
ports:
- "8080:8080"
volumes:
- /data1/release/dmp/${test_env}/logs:/home/nginx/release/logs
- /etc/hosts:/etc/hosts
env_file:
- ./client/client.env
networks:
dmp:
aliases:
- client
front:
build: ./front
ports:
- "${port}:80"
volumes:
- /data1/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- /data1/nginx/conf/vhosts:/etc/nginx/conf/vhosts
- /data1/nginx/logs/${test_env}:/data/logs/nginx
- /data1/release/dmp/${test_env}/front/dmp-resource:/data/www/release/dmp-resource
- /data1/release/dmp/${test_env}/front/dmp-front-v2:/data/www/release/dmp-front-v2
networks:
- dmp
networks:
dmp:
鏡像倉庫
集中存放docker鏡像的地方邻吞,叫鏡像倉庫,類似于git的遠程倉庫葫男。
鏡像倉庫有公用的如docker hub抱冷,也有私有的registry,比如自己搭建harbor梢褐。
與遠程鏡像倉庫交互:
docker push:將本地鏡像推送至鏡像倉庫
docker pull:從鏡像倉庫拉取鏡像到本地
鏡像倉庫也可以用來管理helm charts旺遮,后面會介紹到。
kubernetes
what is k8s
Kubernetes 是一個提供了基于容器的應用集群管理解決方案利职,Kubernetes 為容器化應用提供了部署運行趣效、資源調(diào)度瘦癌、服務發(fā)現(xiàn)和動態(tài)伸縮等一系列完整功能猪贪。
Kubernetes 的核心設(shè)計理念是: 用戶定義要部署的應用程序的規(guī)則,而 Kubernetes 則負責按照定義的規(guī)則部署并運行應用程序讯私。如果應用程序出現(xiàn)問題導致偏離了定義的規(guī)則热押,Kubernetes 負責對其進行自動修正。例如:定義的應用規(guī)則要求部署兩個實例(Pod)斤寇,其中一個實例異常終止了桶癣,Kubernetes 會檢查到并重新啟動一個新的實例。
a k8s cluster
Master:負責管理集群娘锁,只有一個
Node:節(jié)點是運行容器服務的機器牙寞,可以有多個,可以是虛擬機或者物理機
節(jié)點與master之間通過Kubernetes API進行通信。
https://kubernetes.io/docs/tutorials/kubernetes-basics/
k8s objects
用戶通過使用 Kubernetes API 對象來描述應用程序規(guī)則间雀,包括 Pod悔详、Service、Volume惹挟、Namespace茄螃、Deployment、Job等等连锯。
名詞解釋
Pod:最小管理單元归苍,可以包含一個或多個緊密相連的容器應用
Deployment:為Pod提供聲明式定義
Service:是一個抽象概念,定義了一個服務的多個pod邏輯合集和訪問pod的策略
Labels & Selectors:鍵值對运怖,用來標識和識別對象
Ingress:為進入集群的請求提供路由規(guī)則的集合
ConfigMap:用來保存配置數(shù)據(jù)的鍵值對拼弃,可以是單個屬性,也可以是配置文件
Volumes:數(shù)據(jù)卷驳规,用來做數(shù)據(jù)持久化
一般這些資源對象的定義需要寫入一系列的 YAML 文件中肴敛,如:
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
kubectl
k8s集群的命令行工具,通過kubectl能夠?qū)罕旧磉M行管理吗购,并能夠在集群上進行容器化應用的安裝部署医男。
kubectl get - list resources
kubectl describe - show detailed information about a resource
kubectl logs - print the logs from a container in a pod
kubectl exec - execute a command on a container in a pod
kubectl version
kubectl get nodes
kubectl get deployments
kubectl get pods
kubectl describe pods
kubectl logs $pod_name
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
kubectl create -f nginx.yaml
Rancher
what is rancher
Rancher是一個開源的企業(yè)級容器管理平臺。通過Rancher捻勉,企業(yè)再也不必自己使用一系列的開源軟件去從頭搭建容器服務平臺镀梭。Rancher提供了在生產(chǎn)環(huán)境中使用的管理Docker和Kubernetes的全棧化容器部署與管理平臺踱启。
使用rancher部署應用
以DMP為例:
https://k8s-test-rancher.mycompany.com/p/c-xpl64:p-lc589/workloads
工作負載
負載均衡
服務發(fā)現(xiàn)
配置映射
部署一個DMP下來报账,我們會發(fā)現(xiàn)一個DMP應用需要維護多份YAML文件。面臨問題:
如何管理埠偿、編輯和更新這些分散的 Kubernetes 應用配置文件透罢。
如何把一套相關(guān)的配置文件作為一個應用進行管理。
如何分發(fā)和重用 Kubernetes 的應用配置冠蒋。
Helm
Helm 是 Deis 開發(fā)的一個用于 Kubernetes 應用的包管理工具羽圃,主要用來管理 Charts算芯。有點類似于 Ubuntu 中的 apt 或 CentOS 中的 yum 或 Python 中的 pip 切心。
Helm Chart 是用來封裝 Kubernetes 原生應用程序的一系列 YAML 文件〈挡海可以在你部署應用的時候自定義應用程序的一些 Metadata斩郎,以便于應用程序的分發(fā)脑融。
對于應用發(fā)布者而言,可以通過 Helm 打包應用缩宜、管理應用依賴關(guān)系肘迎、管理應用版本并發(fā)布應用到軟件倉庫。
對于使用者而言,使用 Helm 后不用需要編寫復雜的應用部署文件妓布,可以以簡單的方式在 Kubernetes 上查找窿侈、安裝、升級秋茫、回滾史简、卸載應用程序。
Helm應用
helm chart目錄結(jié)構(gòu)
helm chart管理
打包后上傳鏡像倉庫進行管理
在rancher上使用helm進行一鍵部署
運行中的狀態(tài)
一鍵回滾肛著、升級圆兵、刪除
參考文檔:
What is Kubernetes
helm入門指南