阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Kubernetes(k8s)环境搭建实战

136次阅读
没有评论

共计 6677 个字符,预计需要花费 17 分钟才能阅读完成。

k8s 官方版本更新太快, 网上很多的文章都已经过时了, 很多工具或者接口都发生了变化. 官网上的不是很好理解, 这里只记录搭建 k8s 环境的过程, 不会讲太多 k8s 的各种概念, 所以建议先去了解下各种概念, 然后来搭建环境, 然后再对比着理解各种概念是一种比较好的学习方式。

碎碎念

按网上有些文章的意思, 之前 k8s 是有提供安装的版本, 并且有 yum 源, 但是看目前是不需要安装的, 解压可用

官网地址:https://github.com/kubernetes/kubernetes

可以自己下载源码包进行编译, 不过需要 go 的支持, 而且在墙内的话会编译不过, 原因是需要的镜像被墙了, 所以直接下载 release 版本即可, 地址:https://github.com/kubernetes/kubernetes/releases

笔者使用的是 Release v1.2.0-alpha.6, 这个包已经有 496 MB 之大了, 而之前的 Release v1.1.4 版本才 182M, 可见更新之快, 之多, 笔者之前还使用过 1.0.1 版本, 有些接口和参数就已经发生变化了, 比如之前 kubectl expose 的参数是 public-ip, 而现在改为 externalIPs, 所以大家实践时要根据自己的版本
 
环境说明:

2 台机器,167 和 168, 系统都是 CentOS6.5

167 上面会跑 etcd,flannel,kube-apiserver,kube-controller-manager,kube-scheduler, 自己也充当 minion, 所以也会跑 kube-proxy 和 kubelet 

168 上只需要跑 etcd,flannel,kube-proxy 和 kubelet,etcd 和 flannel 是为了打通 2 台机器的网络

k8s 是建立在 docker 之上的, 所以 docker 是必须的
 
环境搭建
 
打通网络

k8s 还需要 etcd 和 Flannel 的支持, 先下载这 2 个包, 注意 2 台机器都需要下载和执行

wget https://github.com/coreos/etcd/releases/download/v2.2.4/etcd-v2.2.4-linux-amd64.tar.gz
wget https://github.com/coreos/flannel/releases/download/v0.5.5/flannel-0.5.5-linux-amd64.tar.gz
 
分别解压, 然后添加到环境变量

cd etcd-v2.2.4-linux-amd64/
cp etcd etcdctl /usr/bin/
cd flannel-0.5.5/
cp flanneld mk-docker-opts.sh /usr/bin

运行

# 167 上运行
etcd -name infra0 -initial-advertise-peer-urls http://172.16.48.167:2380 -listen-peer-urls http://172.16.48.167:2380 -listen-client-urls http://172.16.48.167:2379,http://127.0.0.1:2379 -advertise-client-urls http://172.16.48.167:2379  -discovery https://discovery.etcd.io/322a6b06081be6d4e89fd6db941c4add –data-dir /usr/local/kubernete_test/flanneldata  >> /usr/local/kubernete_test/logs/etcd.log 2>&1 &
 
# 168 上运行
etcd -name infra1 -initial-advertise-peer-urls http://203.130.48.168:2380 -listen-peer-urls http://203.130.48.168:2380 -listen-client-urls http://203.130.48.168:2379,http://127.0.0.1:2379 -advertise-client-urls http://203.130.48.168:2379  -discovery https://discovery.etcd.io/322a6b06081be6d4e89fd6db941c4add  –data-dir /usr/local/kubernete_test/flanneldata  >> /usr/local/kubernete_test/logs/etcd.log 2>&1 &
 
注意中间的 -discovery 参数, 这是个 url 地址, 我们可以通过访问 https://discovery.etcd.io/new?size= 2 来获得,size 表示 minion 的数目, 我们这里是 2,2 台机器要用同一个 url 地址, 如果访问这个地址, 会发现返回一坨 json 字符串, 这个服务器我们也是可以自己搭建的
这样就启动成功了, 然后我们可以在任意一台机器上执行

etcdctl ls
etcdctl cluster-health
 
来确认已经成功启动, 如果有错可以查看日志文件

tail -n 1000 -f /usr/local/kubernete_test/logs/etcd.log
 
然后在任一台机器上执行 

etcdctl set /coreos.com/network/config ‘{“Network”: “172.17.0.0/16”}’

执行

[root@w ~]# etcdctl ls /coreos.com/network/subnets
/coreos.com/network/subnets/172.17.4.0-24
/coreos.com/network/subnets/172.17.13.0-24
[root@w ~]# etcdctl get /coreos.com/network/subnets/172.17.4.0-24
{“PublicIP”:”203.130.48.168″}
[root@w ~]# etcdctl get /coreos.com/network/subnets/172.17.13.0-24
{“PublicIP”:”203.130.48.167″}
 
可以看到 167 上的网段为 172.17.4.13/24
168 上的为 172.17.14.0/24, 我们后面建立的 docker 容器的 IP 就分别在这 2 个网段中
然后 2 台机器上分别执行

flanneld >> /usr/local/kubernete_test/logs/flanneld.log 2>&1 &
 
在每个机器上执行:

mk-docker-opts.sh -i
source /run/flannel/subnet.env
rm /var/run/docker.pid
ifconfig docker0 ${FLANNEL_SUBNET}
 
然后重启 docker 

service docker restart
 
这样 2 台机器上的容器的网络就打通了, 后续可以看到效果 
安装和启动 k8s

wget https://github.com/kubernetes/kubernetes/releases/download/v1.2.0-alpha.6/kubernetes.tar.gz
 
然后各种解压

tar zxvf <span style=”line-height: 1.5; font-size: 9pt;”>kubernetes.tar.gz </span>cd kubernetes/server
tar zxvf kubernetes-server-linux-amd64.tar.gz  # 这个是我们需要执行命令的包
cd kubernetes/server/bin/

复制命令到环境变量中, 这里我只复制了 kubectl

cp kubectl /usr/bin/

在 167 上执行 

./kube-apiserver –address=0.0.0.0  –insecure-port=8080 –service-cluster-ip-range=’172.16.48.167/24′ –log_dir=/usr/local/kubernete_test/logs/kube –kubelet_port=10250 –v=0 –logtostderr=false –etcd_servers=http://172.16.48.167:2379 –allow_privileged=false  >> /usr/local/kubernete_test/logs/kube-apiserver.log 2>&1 &
 
./kube-controller-manager  –v=0 –logtostderr=false –log_dir=/usr/local/kubernete_test/logs/kube –master=172.16.48.167:8080 >> /usr/local/kubernete_test/logs/kube-controller-manager 2>&1 &
 
./kube-scheduler  –master=’172.16.48.167:8080′ –v=0  –log_dir=/usr/local/kubernete_test/logs/kube  >> /usr/local/kubernete_test/logs/kube-scheduler.log 2>&1 &
 
这样就把 master 跑起来了,

[root@w ~]# kubectl get componentstatuses
NAME                STATUS    MESSAGE              ERROR
scheduler            Healthy  ok                 
controller-manager  Healthy  ok                 
etcd-0              Healthy  {“health”: “true”} 
etcd-1              Healthy  {“health”: “true”}
 
我们可以看到都很健康的在运行
然后我们就阔以愉快的在 2 台机器上跑 minion 需要的程序了(注意 167 同时也是 minion)

# 167
./kube-proxy  –logtostderr=false –v=0 –master=http://172.16.48.167:8080  >> /usr/local/kubernete_test/logs/kube-proxy.log 2>&1 &
 
./kubelet  –logtostderr=false –v=0 –allow-privileged=false  –log_dir=/usr/local/kubernete_test/logs/kube  –address=0.0.0.0  –port=10250  –hostname_override=172.16.48.167  –api_servers=http://172.16.48.167:8080  >> /usr/local/kubernete_test/logs/kube-kubelet.log 2>&1 &
 
# 168
./kube-proxy  –logtostderr=false –v=0 –master=http://172.16.48.167:8080  >> /usr/local/kubernete_test/logs/kube-proxy.log 2>&1 &
 
./kubelet  –logtostderr=false –v=0 –allow-privileged=false  –log_dir=/usr/local/kubernete_test/logs/kube  –address=0.0.0.0  –port=10250  –hostname_override=172.16.48.97  –api_servers=http://172.16.48.167:8080  >> /usr/local/kubernete_test/logs/kube-kubelet.log 2>&1 &
 
来确认启动成功

[root@w ~]# kubectl get nodes
NAME            LABELS                                STATUS    AGE
172.16.48.167  kubernetes.io/hostname=172.16.48.167  Ready    1d
172.16.48.168  kubernetes.io/hostname=172.16.48.168  Ready    18h
 
2 个 minion 都是 Ready 
提交命令

k8s 支持 2 种方式, 一种是直接通过命令参数的方式, 另一种是通过配置文件的方式, 配置文件的话支持 json 和 yaml, 下面只讲通过命令参数的方式
 
建立 rc 和 pod

kubectl run nginx –image=nginx –port=80  –replicas=5
 
这样就建立了一个 rc 和 5 个 pod
通过以下命令可以查看

kubectl get rc,pods
 
如果我们手工把建立的 pod 删掉,k8s 会自动重新启动一个, 始终确保 pod 的数目为 5 
跨机器间的通信

我们分别在 167 和 168 上用 docker ps 来查看, 会发现 2 台机器上分别跑了一下 nginx 的容器, 我们在 2 台机器上随意找一个容器进入, 使用 ip a 来查看 IP 地址, 会发现 167 上为 172.17.13.0/24 中,168 为 172.17.4.0/24 中, 我们分别 ping 对方的 IP 会发现是可以 ping 通的, 说明网络已经通了, 如果宿主机可以连上外网的话, 在容器中也是可以访问外网的

如果我们不通过 k8 来启动容器, 而是直接通过 docker 来启动容器, 会发现启动的容器 IP 端也是在我们上述 2 个 IP 段之内的, 并且和 k8 启动的容器的网络是互通的

当然 IP 端随机分配并且是内网的 IP 会给我们造成一些困扰

比如我们一般会这样做: 通过 docker 启动容器, 然后通过 pipework 来给其分配固定 IP 地址, 既可以是内网 IP 也可以是外网 IP, 辣么, 这样的话 k8s 启动的容器会和他们想通么

答案是通了一半, 即通过 k8s 启动的容器是可以访问 pipework 设置的容器的内网 IP 和外网 IP, 但是反过来不行,pipework 设置的容器是不能访问 k8s 启动的容器的, 虽然是这样, 但是不影响我们一般的需求, 因为我们一般通过 k8s 启动的容器是 web 应用, 通过 pipework 设置固定 IP 的是数据库之类, 刚好可以满足从 web 应用访问数据库的需求
 
暴露 service

kubectl expose rc nginx –port=80 –container-port=9090 –external-ip=x.x.x.168
 
port 参数是容器的端口, 因为 nginx 使用的 80, 所以这里必须是 80
container-port 和 target-port 是一个意思, 指的是宿主机转发的端口, 可以随意指定一个, 也可以不指定
 
external-ip 指的是对外暴露的 ip 地址, 一般用公网 IP 地址, 执行那个命令过后, 我们就可以在公���上访问了, 但是这里有个问题就是这个 IP 地址必须是安装了 k8s 的机器的 IP, 如果你随便用一个 IP 是不能访问的, 这里也给应用上造成了不便

查看 service

kubectl get svc

可以看到 CLUSTER_IP 和 EXTERNAL_IP
 
后续的问题

如果用 k8s 做负载均衡的话, 效率会怎样? 怎么保持 session?

由于现在 k8s 还不是很稳定, 可能还不是很适合上生产环境

Kubernetes 集群部署  http://www.linuxidc.com/Linux/2015-12/125770.htm

OpenStack, Kubernetes, Mesos 谁主沉浮  http://www.linuxidc.com/Linux/2015-09/122696.htm

Kubernetes 集群搭建过程中遇到的问题及解决  http://www.linuxidc.com/Linux/2015-12/125735.htm

Kubernetes 的详细介绍:请点这里
Kubernetes 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-01/127784.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计6677字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中