当前位置:云计算行业动态 → 正文

Kubernetes安装指南:从物理服务器迈向容器环境

责任编辑:editor005 作者:核子可乐编译 |来源:企业网D1Net  2016-03-09 14:18:26 本文摘自:51CTO

目前可供选择的容器管理系统已经相当丰富,其中包括Amazon EC2 Container Service、Rancher以及Kubernetes等等。这里之所以选择Kubernetes,是因为它能够被安装至多种环境当中,而且不会导致大家被单一供应商所锁定。

多年以来,我一直利用物理服务器处理基础服务,例如Apache、Bind、MySQL以及PHP等。当然,有时候我也会出于成本考量而进行服务器迁移。不过在服务器上托管多个网站时往往导致更新工作更加困难,因为它们分别依赖于不同PHP版本。考虑到这些问题,我通常会继续使用某些服务器以避免由迁移带来的麻烦。相信大家在实际工作中也经常面临这样的场景。

我一直在关注Docker生态系统的发展状况,并且意识到一旦向容器进行迁移,我面临的问题都将得到解决。有鉴于此,我开始将托管于法国的3套Gentoo与迁移至托管于美国的1套Debian以及托管于法国的一套Gentoo。

今天,我将向大家介绍如何利用Kubernetes安装Docker并实现容器管理。

目前可供选择的容器管理系统已经相当丰富,其中包括Amazon EC2 Container Service、Rancher以及Kubernetes等等。这里之所以选择Kubernetes,是因为它能够被安装至多种环境当中,而且不会导致大家被单一供应商所锁定。

安装Docker

第一步非常简单。

在Debian之上安装Docker:

apt-get install docker.io

在Gentoo之上安装Docker:

emerge -v docker

下一步是安装Kubernetes。

安装Kubernetes

如果选择使用Docker简单安装方式,那么无需使用集群,但这也会令大家错失Kubernetes的优势所在。

多Docker环境显然属于最佳选项。该环境会首先使用Docker服务启动etcd与flannel,从而启用共享网络并允许Kubernetes管理并共享其配置。

root@c1:/home/shared# etcdctl member list

eacd7f155934262: name=b5.loopingz.com

peerURLs=http://91.121.82.118:2380

clientURLs=http://91.121.82.118:2379,http://91.121.82.118:4001

2f0f8b2f17fffe3c: name=c2.loopingz.com

peerURLs=http://198.245.51.134:2380

clientURLs=http://198.245.51.134:2379,http://198.245.51.134:4001

88314cdfe9bc1797: name=default

peerURLs=http://142.4.214.129:2380

clientURLs=http://142.4.214.129:2379,http://142.4.214.129:4001

现在大家已经拥有多套不同网络:

0.0.0/16代表Kubernetes服务/负载均衡器

1.0.0/16为集群各节点上的pod创建位置,各pod地址将为10.1.xx.0/24。

flannel.1 Link encap:Ethernet HWaddr c2:67:be:06:2c:11

inet addr:10.1.72.0 Bcast:0.0.0.0 Mask:255.255.0.0

inet6 addr: fe80::c067:beff:fe06:2c11/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1

RX packets:5412360 errors:0 dropped:0 overruns:0 frame:0

TX packets:4174530 errors:0 dropped:21 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:1651767659 (1.5 GiB) TX bytes:3453452284 (3.2 GiB)

安装GlusterFS

根据具体pod配置与节点选择,各容器可被创建至任意集群节点当中。这意味着大家需要在不同节点间进行存储资源共享。在这方面可供选择的方案也很多,包括Amazon EFS(仍处于beta测试)、谷歌Cloud Storage、GlusterFS等等。

GlusterFS是一款开放式共享存储解决方案。它能够以后台程序方式运行并使用UDP端口24007。

安装防火墙规则

为了一次性对全部服务器上的防火墙加以更新,我创建了一套小型shell脚本,旨在监听etcd节点上的变更,并根据规则与集群节点情况更新防火墙。

更新防火墙配置

防火墙通过一个fw.conf文件进行配置,并共享于GlusterFS分卷之上:

#!/bin/sh

MD5_TARGET=`md5sum /home/shared/configs/firewall/fw.conf | awk '{print $1}'`

MD5_NEW=`md5sum fw.conf | awk '{print $1}'`

if [ "$MD5_TARGET" == "$MD5_NEW" ]; then

echo "Not config change"

exit 0

fi

cp fw.conf /home/shared/configs/firewall/

etcdctl set /cluster/firewall/update $MD5_NEW

其中curl命令配合?wait=true将在该值被上述脚本所变更时发生超时。在此之后,其会对该主机上的防火墙进行更新:

while :

do

curl -L http://127.0.0.1:4001/v2/keys/cluster/firewall/update?wait=true

NEW_HASH=`etcdctl get /cluster/firewall/update`

if [ "$NEW_HASH" != "$FW_HASH" ]; then

echo "Update the firewall"

source /usr/local/bin/firewall_builder

FW_HASH=$NEW_HASH

fi

done

安装Docker库

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

因此,让我们利用Kubernetes部署自己的第一个pod:

其默认格式为YAML,但我个人更倾向于使用JSON。

以下为docker-rc.json文件内容:

{

"apiVersion": "v1",

"kind": "ReplicationController",

"metadata": {

"name": "docker-repository",

"labels": {

"app": "docker-repository",

"version": "v1"

}

},

"spec": {

"replicas": 1,

"selector": {

"app": "docker-repository",

"version": "v1"

},

"template": {

"metadata": {

"labels": {

"app": "docker-repository",

"version": "v1"

}

},

"spec": {

"volumes": [

{

"name": "config",

"hostPath": { "path": "/home/shared/configs/docker" }

},{

"name": "data",

"hostPath": { "path": "/home/shared/docker" }

}

],

"containers": [

{

"name": "registry",

"image": "registry:2.2.1",

"volumeMounts": [{"name":"config", "mountPath":"/etc/docker/"},{"name":"data", "mountPath": "/var/lib/registry

"}],

"resources": {

"limits": {

"cpu": "100m",

"memory": "50Mi"

},

"requests": {

"cpu": "100m",

"memory": "50Mi"

}

},

"ports": [

{

"containerPort": 5000

}

]

}

]

}

}

}

}

接下来是docker-svc.json文件内容:

{

"apiVersion": "v1",

"kind": "Service",

"metadata": {

"name": "docker-repository",

"labels": {

"app": "docker-repository"

}

},

"spec": {

"type": "LoadBalancer",

"selector": {

"app": "docker-repository"

},

"clusterIP": "10.0.0.204",

"ports": [

{

"protocol": "TCP",

"port": 5000,

"targetPort": 5000

}

]

}

}

安装nginx代理

为了对服务器上的各个域进行托管,反向代理自然必不可少。安装nginx非常简单,不过需要注意向其中添加几条header:

在我的示例中,第一台主机将为docker.loopingz.com:

server {

listen 443;

server_name docker.loopingz.com;

access_log /var/log/nginx/docker.loopingz.com_access_log main;

error_log /var/log/nginx/docker.loopingz.com_error_log info;

client_max_body_size 0;

chunked_transfer_encoding on;

location / {

include /etc/nginx/conf.d/dev-auth;

proxy_pass http://10.0.0.204:5000;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-Host $host;

proxy_set_header X-Forwarded-Server $host;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;

}

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;

ssl_prefer_server_ciphers on;

ssl_certificate /etc/letsencrypt/live/docker.loopingz.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/docker.loopingz.com/privkey.pem;

}

大家可以从文件中看到,我们使用IP 10.0.0.204作为定义于docker-svc.json文件内的集群IP地址。Kubernetes会将该IP映射至我们的Docker注册表容器处。

我希望能够将nginx部署至全部集群节点当中,从而保证全部节点皆可通过http/https入口指向该集群。因此,我们需要为nginx定义replicationController。

{

"apiVersion": "v1",

"kind": "ReplicationController",

"metadata": {

"name": "nginx",

"labels": {

"app": "nginx",

"version": "v1"

}

},

"spec": {

"replicas": 3,

"selector": {

"app": "nginx",

"version": "v1"

},

"template": {

"metadata": {

"labels": {

"app": "nginx",

"version": "v1"

}

},

"spec": {

"volumes": [

{

"name": "config",

"hostPath": { "path": "/home/shared/configs/nginx/" }

},{

"name": "logs",

"hostPath": { "path": "/home/shared/logs/nginx/" }

},{

"name": "certs",

"hostPath": { "path": "/home/shared/letsencrypt/" }

},{

"name": "static",

"hostPath": { "path": "/home/shared/nginx/" }

}

],

"containers": [

{

"name": "nginx",

"image": "nginx:latest",

"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/"}],

"resources": {

"limits": {

"cpu": "100m",

"memory": "50Mi"

},

"requests": {

"cpu": "100m",

"memory": "50Mi"

}

},

"ports": [

{

"containerPort": 80,

"hostPort": 80

},{

"containerPort": 443,

"hostPort": 443

}

]

}

]

}

}

}

}

进行加密

为了在全部vhost上启用SSL,我们现在需要利用let’s encrypt以获取为期三个月的免费SSL证书。排序可自动进行,因此全部nginx主机都将在其配置文件中包含以下内容:

location /.well-known/acme-challenge {

add_header "Content-Type:" "application/jose+json" always;

root /etc/nginx/conf.d;

}

现在大家已经了解了Kubernetes的安装方法——马上着手尝试吧!

关键字:Kubernetes

本文摘自:51CTO

x Kubernetes安装指南:从物理服务器迈向容器环境 扫一扫
分享本文到朋友圈
当前位置:云计算行业动态 → 正文

Kubernetes安装指南:从物理服务器迈向容器环境

责任编辑:editor005 作者:核子可乐编译 |来源:企业网D1Net  2016-03-09 14:18:26 本文摘自:51CTO

目前可供选择的容器管理系统已经相当丰富,其中包括Amazon EC2 Container Service、Rancher以及Kubernetes等等。这里之所以选择Kubernetes,是因为它能够被安装至多种环境当中,而且不会导致大家被单一供应商所锁定。

多年以来,我一直利用物理服务器处理基础服务,例如Apache、Bind、MySQL以及PHP等。当然,有时候我也会出于成本考量而进行服务器迁移。不过在服务器上托管多个网站时往往导致更新工作更加困难,因为它们分别依赖于不同PHP版本。考虑到这些问题,我通常会继续使用某些服务器以避免由迁移带来的麻烦。相信大家在实际工作中也经常面临这样的场景。

我一直在关注Docker生态系统的发展状况,并且意识到一旦向容器进行迁移,我面临的问题都将得到解决。有鉴于此,我开始将托管于法国的3套Gentoo与迁移至托管于美国的1套Debian以及托管于法国的一套Gentoo。

今天,我将向大家介绍如何利用Kubernetes安装Docker并实现容器管理。

目前可供选择的容器管理系统已经相当丰富,其中包括Amazon EC2 Container Service、Rancher以及Kubernetes等等。这里之所以选择Kubernetes,是因为它能够被安装至多种环境当中,而且不会导致大家被单一供应商所锁定。

安装Docker

第一步非常简单。

在Debian之上安装Docker:

apt-get install docker.io

在Gentoo之上安装Docker:

emerge -v docker

下一步是安装Kubernetes。

安装Kubernetes

如果选择使用Docker简单安装方式,那么无需使用集群,但这也会令大家错失Kubernetes的优势所在。

多Docker环境显然属于最佳选项。该环境会首先使用Docker服务启动etcd与flannel,从而启用共享网络并允许Kubernetes管理并共享其配置。

root@c1:/home/shared# etcdctl member list

eacd7f155934262: name=b5.loopingz.com

peerURLs=http://91.121.82.118:2380

clientURLs=http://91.121.82.118:2379,http://91.121.82.118:4001

2f0f8b2f17fffe3c: name=c2.loopingz.com

peerURLs=http://198.245.51.134:2380

clientURLs=http://198.245.51.134:2379,http://198.245.51.134:4001

88314cdfe9bc1797: name=default

peerURLs=http://142.4.214.129:2380

clientURLs=http://142.4.214.129:2379,http://142.4.214.129:4001

现在大家已经拥有多套不同网络:

0.0.0/16代表Kubernetes服务/负载均衡器

1.0.0/16为集群各节点上的pod创建位置,各pod地址将为10.1.xx.0/24。

flannel.1 Link encap:Ethernet HWaddr c2:67:be:06:2c:11

inet addr:10.1.72.0 Bcast:0.0.0.0 Mask:255.255.0.0

inet6 addr: fe80::c067:beff:fe06:2c11/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1

RX packets:5412360 errors:0 dropped:0 overruns:0 frame:0

TX packets:4174530 errors:0 dropped:21 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:1651767659 (1.5 GiB) TX bytes:3453452284 (3.2 GiB)

安装GlusterFS

根据具体pod配置与节点选择,各容器可被创建至任意集群节点当中。这意味着大家需要在不同节点间进行存储资源共享。在这方面可供选择的方案也很多,包括Amazon EFS(仍处于beta测试)、谷歌Cloud Storage、GlusterFS等等。

GlusterFS是一款开放式共享存储解决方案。它能够以后台程序方式运行并使用UDP端口24007。

安装防火墙规则

为了一次性对全部服务器上的防火墙加以更新,我创建了一套小型shell脚本,旨在监听etcd节点上的变更,并根据规则与集群节点情况更新防火墙。

更新防火墙配置

防火墙通过一个fw.conf文件进行配置,并共享于GlusterFS分卷之上:

#!/bin/sh

MD5_TARGET=`md5sum /home/shared/configs/firewall/fw.conf | awk '{print $1}'`

MD5_NEW=`md5sum fw.conf | awk '{print $1}'`

if [ "$MD5_TARGET" == "$MD5_NEW" ]; then

echo "Not config change"

exit 0

fi

cp fw.conf /home/shared/configs/firewall/

etcdctl set /cluster/firewall/update $MD5_NEW

其中curl命令配合?wait=true将在该值被上述脚本所变更时发生超时。在此之后,其会对该主机上的防火墙进行更新:

while :

do

curl -L http://127.0.0.1:4001/v2/keys/cluster/firewall/update?wait=true

NEW_HASH=`etcdctl get /cluster/firewall/update`

if [ "$NEW_HASH" != "$FW_HASH" ]; then

echo "Update the firewall"

source /usr/local/bin/firewall_builder

FW_HASH=$NEW_HASH

fi

done

安装Docker库

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

因此,让我们利用Kubernetes部署自己的第一个pod:

其默认格式为YAML,但我个人更倾向于使用JSON。

以下为docker-rc.json文件内容:

{

"apiVersion": "v1",

"kind": "ReplicationController",

"metadata": {

"name": "docker-repository",

"labels": {

"app": "docker-repository",

"version": "v1"

}

},

"spec": {

"replicas": 1,

"selector": {

"app": "docker-repository",

"version": "v1"

},

"template": {

"metadata": {

"labels": {

"app": "docker-repository",

"version": "v1"

}

},

"spec": {

"volumes": [

{

"name": "config",

"hostPath": { "path": "/home/shared/configs/docker" }

},{

"name": "data",

"hostPath": { "path": "/home/shared/docker" }

}

],

"containers": [

{

"name": "registry",

"image": "registry:2.2.1",

"volumeMounts": [{"name":"config", "mountPath":"/etc/docker/"},{"name":"data", "mountPath": "/var/lib/registry

"}],

"resources": {

"limits": {

"cpu": "100m",

"memory": "50Mi"

},

"requests": {

"cpu": "100m",

"memory": "50Mi"

}

},

"ports": [

{

"containerPort": 5000

}

]

}

]

}

}

}

}

接下来是docker-svc.json文件内容:

{

"apiVersion": "v1",

"kind": "Service",

"metadata": {

"name": "docker-repository",

"labels": {

"app": "docker-repository"

}

},

"spec": {

"type": "LoadBalancer",

"selector": {

"app": "docker-repository"

},

"clusterIP": "10.0.0.204",

"ports": [

{

"protocol": "TCP",

"port": 5000,

"targetPort": 5000

}

]

}

}

安装nginx代理

为了对服务器上的各个域进行托管,反向代理自然必不可少。安装nginx非常简单,不过需要注意向其中添加几条header:

在我的示例中,第一台主机将为docker.loopingz.com:

server {

listen 443;

server_name docker.loopingz.com;

access_log /var/log/nginx/docker.loopingz.com_access_log main;

error_log /var/log/nginx/docker.loopingz.com_error_log info;

client_max_body_size 0;

chunked_transfer_encoding on;

location / {

include /etc/nginx/conf.d/dev-auth;

proxy_pass http://10.0.0.204:5000;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-Host $host;

proxy_set_header X-Forwarded-Server $host;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;

}

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;

ssl_prefer_server_ciphers on;

ssl_certificate /etc/letsencrypt/live/docker.loopingz.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/docker.loopingz.com/privkey.pem;

}

大家可以从文件中看到,我们使用IP 10.0.0.204作为定义于docker-svc.json文件内的集群IP地址。Kubernetes会将该IP映射至我们的Docker注册表容器处。

我希望能够将nginx部署至全部集群节点当中,从而保证全部节点皆可通过http/https入口指向该集群。因此,我们需要为nginx定义replicationController。

{

"apiVersion": "v1",

"kind": "ReplicationController",

"metadata": {

"name": "nginx",

"labels": {

"app": "nginx",

"version": "v1"

}

},

"spec": {

"replicas": 3,

"selector": {

"app": "nginx",

"version": "v1"

},

"template": {

"metadata": {

"labels": {

"app": "nginx",

"version": "v1"

}

},

"spec": {

"volumes": [

{

"name": "config",

"hostPath": { "path": "/home/shared/configs/nginx/" }

},{

"name": "logs",

"hostPath": { "path": "/home/shared/logs/nginx/" }

},{

"name": "certs",

"hostPath": { "path": "/home/shared/letsencrypt/" }

},{

"name": "static",

"hostPath": { "path": "/home/shared/nginx/" }

}

],

"containers": [

{

"name": "nginx",

"image": "nginx:latest",

"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/"}],

"resources": {

"limits": {

"cpu": "100m",

"memory": "50Mi"

},

"requests": {

"cpu": "100m",

"memory": "50Mi"

}

},

"ports": [

{

"containerPort": 80,

"hostPort": 80

},{

"containerPort": 443,

"hostPort": 443

}

]

}

]

}

}

}

}

进行加密

为了在全部vhost上启用SSL,我们现在需要利用let’s encrypt以获取为期三个月的免费SSL证书。排序可自动进行,因此全部nginx主机都将在其配置文件中包含以下内容:

location /.well-known/acme-challenge {

add_header "Content-Type:" "application/jose+json" always;

root /etc/nginx/conf.d;

}

现在大家已经了解了Kubernetes的安装方法——马上着手尝试吧!

关键字:Kubernetes

本文摘自:51CTO

电子周刊
回到顶部

关于我们联系我们版权声明隐私条款广告服务友情链接投稿中心招贤纳士

企业网版权所有 ©2010-2024 京ICP备09108050号-6 京公网安备 11010502049343号

^