Docker资源控制与TLS加密通信
文章目錄
- Docker資源控制
- 使用stress工作測試cpu和內存
- cup周期限制
- CPU Core 控制
- cpu配額控制參數的混合使用
- 內存限額
- IO限制
- bps和iops的限制
- Docker-TLS加密通信
- 實驗需求
- 遠程連接docker
Docker資源控制
-
Docker通過Cgroup 來控制容器使用的資源配額,包括CPU、內存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制。
-
Cgroup是Control Groups的縮寫,是Lnux內核提供的一種可以限制、記錄、隔離進程組所使用的物理資源(如CPU、內存、磁盤IO等等)的機制,
這些具體的資源管理功能稱為Cgroup子系統,有以下幾大子系統實現:
-
**blkio:**設置限制每個塊設備的輸入輸出控制。例如:磁盤,光盤以及usb等
-
**CPU:**使用調度程序為cgroup任務提供CPU的訪問。
-
**cpuacct:**產生cgroup任務的CPU 資源報告。
-
cpuset:如果是多核心的CPU,這個子系統會為cgroup任務分配單獨的CPU和內存。
-
**devices:**允許或拒絕cgroup任務對設備的訪問。
-
**freezer:**暫停和恢復cgroup任務。
-
memory:設置每個cgroup的內存限制以及產生內存資源報告。
-
**net_cls:**標記每個網絡包以供cgroup方便使用。
-
**ns:**命名空間子系統。
-
**perf_event:**增加了對每個group的監測跟蹤的能力,可以監測屬于某個特定的group的所有線程以及運行在特定CPU上的線程。
下面開始利用stress壓力測試工具來測試CPU 和內存使用狀況。
使用stress工作測試cpu和內存
使用Dockerfile來創建一個基于Centos的stress的工作鏡像
[root@localhost opt]# mkdir stress [root@localhost opt]# cd stress [root@localhost stress]# vim Dockerfile FROM centos:7 MAINTAINER chen "zhang@kgc.com" RUN yum -y install wget RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo RUN yum install -y stress運行腳本
[root@localhost stress]# docker build -t centos:stress .使用下面命令創建容器,命令中–cpu-shares參數不能保證獲得1個VCPU或多個CPU資源,它僅僅是一個彈性加權值
docker run -itd --cpu-shares 100 centos:stress1:說明:說明:默認情況下,每個Docker容器的CPU份額都是1024。單獨一個容器的份額是沒有意義的。只有在同時運行多個容器時,容器的CPU加權的效果
2:例如,兩個容器AB的CPU份額分別為1000和500,在CPU進行時間片分配的時候,容器A比容器B多一倍的機會獲得CPU的時間片。分配的結果取決于當時主機和其他容器的運行狀態,實際上也無法保證容器A一定能獲得CPU時間片。比如容器A的進程一直是空閑的,那么容器B是可以獲取比容器A更多的CPU時間片的。極端情況下,例如主機上只運行了一個容器,即使它的CPU份額只有50,它也可以獨占整個主機
創建容器
docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10stress -c 10:容器產生10個子函數進程
進入容器
docker exec -it 0aa895961d13 bash輸入top查看我們已經創建了10個進程(1master帶10個進程)
再開一臺終端容器做比較
docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10進入容器
docker exec -it f5f6dac70fa2 bash兩臺cpu對比,我們可以看到%CPU份額是另一臺的一半(使用top對比兩個的%CPU,比例是1:2)
cup周期限制
Docker提供了–cpu-period、–cpu-quota兩個參數控制容器可以分配到的CPU時鐘周期。
- –cpu-period是用來指定容器對CPU的使用要在多長時間內做一次重新分配.
- --cpu-quota是用來指定在這個周期內,最多可以有多少時間用來跑這個容器。與–cpu-shares 不同的是,這種配置是指定一個絕對值,容器對CPU資源的使用絕對不會超過配置的值。
- cpu-period和cpu-quota 的單位為微秒(us). cpu-period的最小值為1000微秒,最大值為1秒(10^6 us),默認值為0.1秒(10000 us)cpu-quota的值默認為-1,表示不做控制。cpu-period和cpu-quota參數一般聯合使用。
- 例如:容器進程需要每1秒使用單個CPU的0.2秒時間,可以將cpu-period設置為1000000 (即1秒),cpu-quota設置為20000(0.2秒)當然,在多核情況下,如果允許容器進程完全占用兩個CPU,則可以將cpu-period 設置為100000(即0.1秒),cpu-quota設置為200000 (0.2)
我么先把前面的容器停止
停止容器 [root@localhost stress]# docker stop f5f6dac70fa2 f5f6dac70fa2 [root@localhost stress]# docker stop b69f01e20458下面我們配置容器名字為cuptest 資源分配100000秒,cpu配額為200000,針對 centos:stress鏡像
docker run -itd --name cuptest --cpu-period 100000 --cpu-quota 200000 centos:stress進入容器
[root@localhost stress]# docker exec -it 6078e84e4b6c bash查看資源分配,cpu配額
[root@6078e84e4b6c /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us 100000 [root@6078e84e4b6c /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us 200000修改內存8G核心數4
CPU Core 控制
對多核CPU的服務,Docker還可以控制容器運行使用哪些CPU內核,即使用–cpuuset-cpus參數。這對具多CPU的服務器尤其有用,可以對需要高性能計算進行性能最優的配置
docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stressps:以上命令需要宿主機為雙核,表示創建容器只可以用0,1兩內核
進入容器
[root@localhost ~]# docker exec -it 9cdded9c10de bash 查看cpu [root@9cdded9c10de /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus 0-1下面指令可以看到容器中進程與cpu核心的綁定關系,達到綁定CPU內核的目的
[root@localhost ~]# docker exec c0ffab515796 taskset -c -p 1壓測測試
[root@localhost ~]# docker exec -it 9cdded9c10de bash [root@9cdded9c10de /]# stress -c 10cpu配額控制參數的混合使用
通過cpuset-cpus參數指定容器A使用CPU內核0,容器B只是用CPU內核1.
在主機上只有這兩個容器使用對應CPU內核的情況,它們各自占用全部的內核資源,cpu-shares沒有明顯效果。
cpuset-cpus、cpuset-mems參數只在多核、多內存節點上的服務器上有效,并且必須與實際的物理配置匹配。否則也無法達到資源控制的目的。
在系統具有多個CPU內核的情況下,需要通過cpuset-cpus參數為設置容器CPU內核才能方便地進行測試。
進入查看資源
[root@localhost ~]# docker exec -it af8b5f7b10fb bash在開一臺
[root@localhost ~]# docker run -tid --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1總結:上面的centos:stress鏡像安裝了stress工具,用來測試CPU和內存的負載。通過在兩個容器上分別執行stress -c1命令,會給系統一個隨機負載,產生1個進程。這個進程都反復不停的計算由rand()產生隨機數的平方根,直到資源耗盡。察到宿主機上的CPU使用率,第三個內核的使用率接近100%,并且一批進程的CPU使用率明顯存在2:1的使用比例的對比。
內存限額
與操作系統類似,容器可使用的內存包括兩部分:物理內存和Swap.
Docker通過下面兩組參數來控制容器內存的使用量。
-m或–memory:設置內存的使用限額,例如10OM、1024M.
–memory-swap:設置內存+swap的使甩限額。
執行如下命令允許該容器最多使用20OM的內存和30OM的swap.
[root@localhost ~]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M–vm 1:啟動1個內存工作線程。
–vm-bvtes 280M:每個線程分配28OM內存。
如果讓工作線程分配的內存超過300M,分配的內存超過限額,stress線程報錯,容器退出。
[root@localhost stress]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310MIO限制
默認情況下,所有容器能平等地讀寫磁盤,可以通過設置–blkio-weight參數來改變容器block lO的優先級。
–blkio-weight與–cpu-shares類似。設置的是相對權重值,默認為500。
在下面的例子中,容器A讀寫磁盤的帶寬是容器B的兩倍。
在建立一個權重為300的
[root@localhost ~]# docker run -idt --name container_B --blkio-weight 300 centos:stress [root@localhost ~]# docker exec -it a9799eb70c64 bash [root@a9799eb70c64 /]# cat /sys/fs/cgroup/blkio/blkio.weight 300總結600的讀寫更快
bps和iops的限制
- bps是byte per second,每秒讀寫的數據量。
- ops是io per second.每秒IO的次數。
通過以下參數控制客器的bps和iops: - -device-read-bps。限制讀某個設備的bps.
- -device-write-bps,限制寫某個設備的bps.
- -device-read-iops,限制讀某個設備的iops.
- -device-write-iops,限制寫某個設備的iops.
面的示例是限制容器寫/dev/sda的速率為5MB/s.
docker run -it --device-write-bps /dev/sda:5MB centos:stress先容器中不停的讀寫(我們發現寫的很慢)
[root@24ce8fee6b6a /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 204.806 s, 5.2 MB/s我們不設置限制(發現很快就好了)
[root@localhost ~]# docker run -it centos:stress[root@ef487c7c1cee /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 1.89416 s, 567 MB/sDocker-TLS加密通信
安全傳輸層協議(TLS)用于在兩個通信應用程序之間提供保密性和數據完整性。
該協議由兩層組成: TLS 記錄協議(TLS Record)和 TLS(TLS Handshake)。
- 對稱:DES 3DES AES 長度不同 長度越長安全越高,解密速度越慢
- 非對稱:RSA公鑰,私鑰 ,公鑰:所有人可知(鎖)私鑰 (鑰匙)個人身份信息,不可抵賴。
- 證書:個人信息,密鑰,有效期
- ca:證書頒發機構 ca證書
實驗過程;
創建ca密鑰>>創建ca證書
創建服務器私鑰>>簽名密鑰>>使用ca證書與私鑰證書簽名
生成客戶端密鑰>>簽名客戶端>>使用ca證書與客戶簽名證書
實驗需求
使用需要服務2臺服務去,一臺配置證書:一臺實驗對接
centos7:192.168.136.90
centos7:192.168.136.81
設置master主機名
[root@localhost ~]# hostnamectl set-hostname master配置解析(在另一臺也配上為了名稱對應地址)
[root@ef487c7c1cee /]# vim /etc/hosts 192.168.136.90 master配置步驟:
創建ca密鑰 [root@master ~]# openssl genrsa -aes256 -out ca-key.pem 4096輸入密碼:123123創建ca證書openssl req -new -x509 -days 1000 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem創建服務器私鑰openssl genrsa -out server-key.pem 4096簽名密鑰openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr使用ca證書與私鑰證書簽名,輸入123123openssl x509 -req -days 1000 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem生成客戶端密鑰openssl genrsa -out key.pem 4096簽名客戶端openssl req -subj "/CN=client" -new -key key.pem -out client.csr創建配置文件 echo extendedKeyUsage=clientAuth > extfile.cnf簽名證書,輸入123123(需要簽名客戶端,ca證書,ca密鑰) openssl x509 -req -days 1000 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf刪除多余文件 [root@localhost ~]# rm -rf ca.srl client.csr server.csr extfile.cnf配置docker證書
[root@localhost ~]# vim /lib/systemd/system/docker.service 14行加#號 15 ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/tls/ca.pem --tlscert=/tls/server-cert.pem --tlskey=/tls/server-key.pem -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock創建證書目錄
[root@localhost ~]# mkdir /tls [root@localhost ~]# mv *.pem /tls/重啟服務
[root@localhost ~]# systemctl daemon-reload [root@localhost ~]# systemctl restart docker查看端口
[root@master ~]# netstat -ntap | grep 2376 tcp6 0 0 :::2376 :::* LISTEN 13907/dockerd本地驗證(查看docker版本)
[root@master tls]# cd /tls/ [root@localhost docker]#docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version遠程連接docker
開啟客戶端192.168.136.81
服務端復制證書給客戶端
[root@maseter tls]# scp ca.pem root@192.168.136.81:/etc/docker [root@maseter tls]# scp cert.pem root@192.168.136.81:/etc/docker [root@maseter tls]# scp key.pem root@192.168.136.81:/etc/docker在客戶端查看查看docker版本
[root@localhost docker]# cd /etc/docker/ [root@localhost docker]#docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://master:2376 version總結
以上是生活随笔為你收集整理的Docker资源控制与TLS加密通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存大对决:金士顿VS美光,谁才是速度之
- 下一篇: 揭秘维沃x9手机:内存卡插入教程大公开