自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Kubernetes安裝指南:從物理服務(wù)器邁向容器環(huán)境

譯文
云計算
在今天的文章中,我們將共同了解如何利用Kubernetes實現(xiàn)Docker安裝與容器管理。

目前可供選擇的容器管理系統(tǒng)已經(jīng)相當豐富,其中包括Amazon EC2 Container Service、Rancher以及Kubernetes等等。這里之所以選擇Kubernetes,是因為它能夠被安裝至多種環(huán)境當中,而且不會導(dǎo)致大家被單一供應(yīng)商所鎖定。

[[163682]]

多年以來,我一直利用物理服務(wù)器處理基礎(chǔ)服務(wù),例如Apache、Bind、MySQL以及PHP等。當然,有時候我也會出于成本考量而進行服務(wù)器遷移。不過在服務(wù)器上托管多個網(wǎng)站時往往導(dǎo)致更新工作更加困難,因為它們分別依賴于不同PHP版本??紤]到這些問題,我通常會繼續(xù)使用某些服務(wù)器以避免由遷移帶來的麻煩。相信大家在實際工作中也經(jīng)常面臨這樣的場景。

我一直在關(guān)注Docker生態(tài)系統(tǒng)的發(fā)展狀況,并且意識到一旦向容器進行遷移,我面臨的問題都將得到解決。有鑒于此,我開始將托管于法國的3套Gentoo與遷移至托管于美國的1套Debian以及托管于法國的一套Gentoo。

今天,我將向大家介紹如何利用Kubernetes安裝Docker并實現(xiàn)容器管理。

目前可供選擇的容器管理系統(tǒng)已經(jīng)相當豐富,其中包括Amazon EC2 Container Service、Rancher以及Kubernetes等等。這里之所以選擇Kubernetes,是因為它能夠被安裝至多種環(huán)境當中,而且不會導(dǎo)致大家被單一供應(yīng)商所鎖定。

安裝Docker

第一步非常簡單。

在Debian之上安裝Docker:

apt-get install docker.io

在Gentoo之上安裝Docker:

emerge -v docker

下一步是安裝Kubernetes。

安裝Kubernetes

如果選擇使用Docker簡單安裝方式,那么無需使用集群,但這也會令大家錯失Kubernetes的優(yōu)勢所在。

多Docker環(huán)境顯然屬于最佳選項。該環(huán)境會首先使用Docker服務(wù)啟動etcd與flannel,從而啟用共享網(wǎng)絡(luò)并允許Kubernetes管理并共享其配置。

  1. root@c1:/home/shared# etcdctl member list 
  2.  
  3. eacd7f155934262: name=b5.loopingz.com 
  4.  
  5. peerURLs=http://91.121.82.118:2380 
  6.  
  7. clientURLs=http://91.121.82.118:2379,http://91.121.82.118:4001 
  8.  
  9. 2f0f8b2f17fffe3c: name=c2.loopingz.com 
  10.  
  11. peerURLs=http://198.245.51.134:2380 
  12.  
  13. clientURLs=http://198.245.51.134:2379,http://198.245.51.134:4001 
  14.  
  15. 88314cdfe9bc1797: name=default 
  16.  
  17. peerURLs=http://142.4.214.129:2380 
  18.  
  19. clientURLs=http://142.4.214.129:2379,http://142.4.214.129:4001 

現(xiàn)在大家已經(jīng)擁有多套不同網(wǎng)絡(luò):

0.0.0/16代表Kubernetes服務(wù)/負載均衡器

1.0.0/16為集群各節(jié)點上的pod創(chuàng)建位置,各pod地址將為10.1.xx.0/24。

  1. flannel.1 Link encap:Ethernet HWaddr c2:67:be:06:2c:11 
  2.  
  3. inet addr:10.1.72.0 Bcast:0.0.0.0 Mask:255.255.0.0 
  4.  
  5. inet6 addr: fe80::c067:beff:fe06:2c11/64 Scope:Link 
  6.  
  7. UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1 
  8.  
  9. RX packets:5412360 errors:0 dropped:0 overruns:0 frame:0 
  10.  
  11. TX packets:4174530 errors:0 dropped:21 overruns:0 carrier:0 
  12.  
  13. collisions:0 txqueuelen:0 
  14.  
  15. RX bytes:1651767659 (1.5 GiB) TX bytes:3453452284 (3.2 GiB) 

安裝GlusterFS

根據(jù)具體pod配置與節(jié)點選擇,各容器可被創(chuàng)建至任意集群節(jié)點當中。這意味著大家需要在不同節(jié)點間進行存儲資源共享。在這方面可供選擇的方案也很多,包括Amazon EFS(仍處于beta測試)、谷歌Cloud Storage、GlusterFS等等。

GlusterFS是一款開放式共享存儲解決方案。它能夠以后臺程序方式運行并使用UDP端口24007。

安裝防火墻規(guī)則

為了一次性對全部服務(wù)器上的防火墻加以更新,我創(chuàng)建了一套小型shell腳本,旨在監(jiān)聽etcd節(jié)點上的變更,并根據(jù)規(guī)則與集群節(jié)點情況更新防火墻。

更新防火墻配置

防火墻通過一個fw.conf文件進行配置,并共享于GlusterFS分卷之上:

  1. #!/bin/sh 
  2.  
  3. MD5_TARGET=`md5sum /home/shared/configs/firewall/fw.conf | awk '{print $1}'
  4.  
  5. MD5_NEW=`md5sum fw.conf | awk '{print $1}'
  6.  
  7. if [ "$MD5_TARGET" == "$MD5_NEW" ]; then 
  8.  
  9. echo "Not config change" 
  10.  
  11. exit 0 
  12.  
  13. fi 
  14.  
  15. cp fw.conf /home/shared/configs/firewall/ 
  16.  
  17. etcdctl set /cluster/firewall/update $MD5_NEW 

其中curl命令配合?wait=true將在該值被上述腳本所變更時發(fā)生超時。在此之后,其會對該主機上的防火墻進行更新:

  1. while : 
  2.  
  3. do 
  4.  
  5. curl -L http://127.0.0.1:4001/v2/keys/cluster/firewall/update?wait=true 
  6.  
  7. NEW_HASH=`etcdctl get /cluster/firewall/update` 
  8.  
  9. if [ "$NEW_HASH" != "$FW_HASH" ]; then 
  10.  
  11. echo "Update the firewall" 
  12.  
  13. source /usr/local/bin/firewall_builder 
  14.  
  15. FW_HASH=$NEW_HASH 
  16.  
  17. fi 
  18.  
  19. done 

安裝Docker庫

要利用Kubernetes保存容器定義,大家最好建立自己的容器庫。

因此,讓我們利用Kubernetes部署自己的第一個pod:

其默認格式為YAML,但我個人更傾向于使用JSON。

以下為docker-rc.json文件內(nèi)容:

  1.  
  2. "apiVersion""v1"
  3.  
  4. "kind""ReplicationController"
  5.  
  6. "metadata": { 
  7.  
  8. "name""docker-repository"
  9.  
  10. "labels": { 
  11.  
  12. "app""docker-repository"
  13.  
  14. "version""v1" 
  15.  
  16.  
  17. }, 
  18.  
  19. "spec": { 
  20.  
  21. "replicas"1
  22.  
  23. "selector": { 
  24.  
  25. "app""docker-repository"
  26.  
  27. "version""v1" 
  28.  
  29. }, 
  30.  
  31. "template": { 
  32.  
  33. "metadata": { 
  34.  
  35. "labels": { 
  36.  
  37. "app""docker-repository"
  38.  
  39. "version""v1" 
  40.  
  41.  
  42. }, 
  43.  
  44. "spec": { 
  45.  
  46. "volumes": [ 
  47.  
  48.  
  49. "name""config"
  50.  
  51. "hostPath": { "path""/home/shared/configs/docker" } 
  52.  
  53. },{ 
  54.  
  55. "name""data"
  56.  
  57. "hostPath": { "path""/home/shared/docker" } 
  58.  
  59.  
  60. ], 
  61.  
  62. "containers": [ 
  63.  
  64.  
  65. "name""registry"
  66.  
  67. "image""registry:2.2.1"
  68.  
  69. "volumeMounts": [{"name":"config""mountPath":"/etc/docker/"},{"name":"data""mountPath": "/var/lib/registry 
  70.  
  71. "}], 
  72.  
  73. "resources": { 
  74.  
  75. "limits": { 
  76.  
  77. "cpu""100m"
  78.  
  79. "memory""50Mi" 
  80.  
  81. }, 
  82.  
  83. "requests": { 
  84.  
  85. "cpu""100m"
  86.  
  87. "memory""50Mi" 
  88.  
  89.  
  90. }, 
  91.  
  92. "ports": [ 
  93.  
  94.  
  95. "containerPort"5000 
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  

接下來是docker-svc.json文件內(nèi)容:

  1.  
  2. "apiVersion""v1"
  3.  
  4. "kind""Service"
  5.  
  6. "metadata": { 
  7.  
  8. "name""docker-repository"
  9.  
  10. "labels": { 
  11.  
  12. "app""docker-repository" 
  13.  
  14.  
  15. }, 
  16.  
  17. "spec": { 
  18.  
  19. "type""LoadBalancer"
  20.  
  21. "selector": { 
  22.  
  23. "app""docker-repository" 
  24.  
  25. }, 
  26.  
  27. "clusterIP""10.0.0.204"
  28.  
  29. "ports": [ 
  30.  
  31.  
  32. "protocol""TCP"
  33.  
  34. "port"5000
  35.  
  36. "targetPort"5000 
  37.  
  38.  
  39.  
  40.  

安裝nginx代理

為了對服務(wù)器上的各個域進行托管,反向代理自然必不可少。安裝nginx非常簡單,不過需要注意向其中添加幾條header:

在我的示例中,第一臺主機將為docker.loopingz.com:

  1. server { 
  2.  
  3. listen 443
  4.  
  5. server_name docker.loopingz.com; 
  6.  
  7. access_log /var/log/nginx/docker.loopingz.com_access_log main; 
  8.  
  9. error_log /var/log/nginx/docker.loopingz.com_error_log info; 
  10.  
  11. client_max_body_size 0
  12.  
  13. chunked_transfer_encoding on; 
  14.  
  15. location / { 
  16.  
  17. include /etc/nginx/conf.d/dev-auth; 
  18.  
  19. proxy_pass http://10.0.0.204:5000; 
  20.  
  21. proxy_set_header X-Real-IP $remote_addr; 
  22.  
  23. proxy_set_header X-Forwarded-Host $host; 
  24.  
  25. proxy_set_header X-Forwarded-Server $host; 
  26.  
  27. proxy_set_header X-Forwarded-Proto $scheme; 
  28.  
  29. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  30.  
  31. add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always; 
  32.  
  33.  
  34. ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!CAMELLIA; 
  35.  
  36. ssl_prefer_server_ciphers on; 
  37.  
  38. ssl_certificate /etc/letsencrypt/live/docker.loopingz.com/fullchain.pem; 
  39.  
  40. ssl_certificate_key /etc/letsencrypt/live/docker.loopingz.com/privkey.pem; 
  41.  

大家可以從文件中看到,我們使用IP 10.0.0.204作為定義于docker-svc.json文件內(nèi)的集群IP地址。Kubernetes會將該IP映射至我們的Docker注冊表容器處。

我希望能夠?qū)ginx部署至全部集群節(jié)點當中,從而保證全部節(jié)點皆可通過http/https入口指向該集群。因此,我們需要為nginx定義replicationController。

  1.  
  2. "apiVersion""v1"
  3.  
  4. "kind""ReplicationController"
  5.  
  6. "metadata": { 
  7.  
  8. "name""nginx"
  9.  
  10. "labels": { 
  11.  
  12. "app""nginx"
  13.  
  14. "version""v1" 
  15.  
  16.  
  17. }, 
  18.  
  19. "spec": { 
  20.  
  21. "replicas"3
  22.  
  23. "selector": { 
  24.  
  25. "app""nginx"
  26.  
  27. "version""v1" 
  28.  
  29. }, 
  30.  
  31. "template": { 
  32.  
  33. "metadata": { 
  34.  
  35. "labels": { 
  36.  
  37. "app""nginx"
  38.  
  39. "version""v1" 
  40.  
  41.  
  42. }, 
  43.  
  44. "spec": { 
  45.  
  46. "volumes": [ 
  47.  
  48.  
  49. "name""config"
  50.  
  51. "hostPath": { "path""/home/shared/configs/nginx/" } 
  52.  
  53. },{ 
  54.  
  55. "name""logs"
  56.  
  57. "hostPath": { "path""/home/shared/logs/nginx/" } 
  58.  
  59. },{ 
  60.  
  61. "name""certs"
  62.  
  63. "hostPath": { "path""/home/shared/letsencrypt/" } 
  64.  
  65. },{ 
  66.  
  67. "name""static"
  68.  
  69. "hostPath": { "path""/home/shared/nginx/" } 
  70.  
  71.  
  72. ], 
  73.  
  74. "containers": [ 
  75.  
  76.  
  77. "name""nginx"
  78.  
  79. "image""nginx:latest"
  80.  
  81. "volumeMounts": [{"name""static""readOnly"true"mountPath""/var/www/"},{"name""certs""readOnly"true"mountPath""/etc/letsencrypt"}, {"name":"logs""mountPath":"/var/log/nginx/"},{"name":"config""readOnly"true"mountPath":"/etc/nginx/conf.d/"}], 
  82.  
  83. "resources": { 
  84.  
  85. "limits": { 
  86.  
  87. "cpu""100m"
  88.  
  89. "memory""50Mi" 
  90.  
  91. }, 
  92.  
  93. "requests": { 
  94.  
  95. "cpu""100m"
  96.  
  97. "memory""50Mi" 
  98.  
  99.  
  100. }, 
  101.  
  102. "ports": [ 
  103.  
  104.  
  105. "containerPort"80
  106.  
  107. "hostPort"80 
  108.  
  109. },{ 
  110.  
  111. "containerPort"443
  112.  
  113. "hostPort"443 
  114.  
  115.  
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  

進行加密

為了在全部vhost上啟用SSL,我們現(xiàn)在需要利用let’s encrypt以獲取為期三個月的免費SSL證書。排序可自動進行,因此全部nginx主機都將在其配置文件中包含以下內(nèi)容:

  1. location /.well-known/acme-challenge { 
  2.  
  3. add_header "Content-Type:" "application/jose+json" always; 
  4.  
  5. root /etc/nginx/conf.d; 
  6.  

現(xiàn)在大家已經(jīng)了解了Kubernetes的安裝方法——馬上著手嘗試吧!

原文標題:Installing Kubernetes: Moving From Physical Servers to Containers

 【51CTO.com獨家譯稿,合作站點轉(zhuǎn)載請注明來源】

責任編輯:xinxiaoliang 來源: 51CTO
相關(guān)推薦

2009-09-24 16:08:29

打印服務(wù)器

2009-07-28 19:18:44

物理服務(wù)器VMware ESXi服務(wù)器虛擬化

2022-03-14 15:10:20

云服務(wù)器物理服務(wù)器性能

2009-05-19 13:14:17

虛擬服務(wù)器 服務(wù)器 I

2023-06-09 08:15:11

服務(wù)器環(huán)境部署Python

2023-07-04 07:19:17

物理服務(wù)器網(wǎng)絡(luò)

2020-12-16 10:00:59

Serverless數(shù)字化云原生

2014-04-03 11:44:29

企業(yè)云服務(wù)器物理服務(wù)器

2011-11-10 13:05:40

刀片服務(wù)器機架服務(wù)器采購指南

2012-02-08 09:38:33

2009-07-29 15:54:52

家用服務(wù)器DIY

2013-12-27 09:49:51

云服務(wù)器物理服務(wù)器

2017-01-23 15:06:32

戴爾服務(wù)器

2022-09-26 23:13:52

服務(wù)器數(shù)據(jù)安全

2013-12-26 10:28:11

云服務(wù)器物理服務(wù)器

2018-10-10 19:39:37

云計算云服務(wù)Kubernetes

2023-04-12 11:28:36

Kubernetes服務(wù)器

2014-10-15 14:02:29

思科UCS

2010-06-02 16:48:49

postfix郵件服務(wù)

2009-02-27 14:31:00

點贊
收藏

51CTO技術(shù)棧公眾號