文章目录
  1. 1. 硬件环境
  2. 2. 系统环境
  3. 3. 安装
    1. 3.1. 安装docker
    2. 3.2. 安装Etcd
      1. 3.2.1. 下载二进制文件
      2. 3.2.2. 部署文件并启动Etcd
    3. 3.3. 安装Flannel
      1. 3.3.1. 下载二进制文件
      2. 3.3.2. 部署文件并启动Flannel
    4. 3.4. 安装Kubernetes
      1. 3.4.1. 配置并启动kube-apiserver
      2. 3.4.2. 配置并启动kube-controller-manager
      3. 3.4.3. 配置并启动kube-scheduler
      4. 3.4.4. 配置并启动kubectl
      5. 3.4.5. 配置并启动kube-proxy
      6. 3.4.6. Node节点配置
    5. 3.5. 验证启动
  4. 4. 一些问题总结

名字起得有点长,这是本文的一大槽点,我也很无奈啊,想要短小精悍的体现出文章重点,又想让人一看“哎哟不得了,感觉好厉害的样子”,也只能取这么个名字了……好了说重点,什么是Kubernetes?Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用。说白了,Kubernetes的目标是让你可以像管理牲畜一样管理你的服务,而不是像宠物一样,同时提高资源的利用率,让码农关注在应用开发本身,高可用的事情就交给Kubernetes吧。
Kubernetes

硬件环境

准备三台主机作为我们安装Kubernetes的硬件环境。
以下分别是每台主机的IP地址信息、功能以及所要安装的组件。

其中第一台主机即作为Master也作为Node。

10.2.0.143 master/node kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy etcd flannel
10.2.0.142 node kubectl kube-proxy flannel
10.2.0.144 node kubectl kube-proxy flannel

系统环境

  • Gentoo
  • Docker 1.12.1
  • Etcd 3.1.5
  • Kubernetes 1.6.7
  • Flannel v0.8.0

安装

在这里我使用的是最原始的安装方式,使用二进制文件安装,好处是可以安装任意版本的Kubernetes和其他组件,坏处是每个组件都需要一个个安装,然后一个个进行配置,而且配置比较复杂(好吧,我承认是因为用的Gentoo系统没法一步到位,不过这样有个好处就是对每个组件的了解会更加深入,更能锻炼人,在不断的错误中慢慢学习~)

三台主机均要安装Etcd和Flannel,因为现在是简单配置,配置如下就可以。

安装docker

鉴于主机上本来就有Docker,且Docker安装配置较为简单明了,在此就不再废话,下次再另外写一篇有关Docker的~

安装Etcd

etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。

下载二进制文件

1
2
3
4
DOWNLOAD_URL=https://storage.googleapis.com/etcd #etcd存储地址
ETCD_VER=v3.1.5 #设置etcd版本号
wget ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xvf etcd-${ETCD_VER}-linux-amd64.tar.gz

部署文件并启动Etcd

将解压出来的etcd, etcdctl放入 /usr/bin/下。

由于是在Gentoo系统下进行安装,所以我们在这里不用systemd启动,而是用手动启动,输入以下命令在后台挂起运行。
启动Etcd

1
nohup etcd --initial-cluster 'default=http://localhost:2380' --initial-cluster-state 'new' --advertise-client-urls 'http://localhost:2379' --listen-peer-urls 'http://localhost:2380' --listen-client-urls 'http://localhost:2379' > /var/log/etcd.log 2>&1 &

安装Flannel

Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

下载二进制文件

1
2
wget https://github.com/coreos/flannel/releases/download/v0.8.0/flannel-v0.8.0-linux-amd64.tar.gz && chmod +x flannel-v0.8.0-linux-amd64.tar.gz
tar xvf flannel-v0.8.0-linux-amd64.tar.gz

部署文件并启动Flannel

解压后主要有flanneld、mk-docker-opts.sh这两个文件,其中flanneld为主要的执行文件,sh脚本用于生成Docker启动参数。将二进制文件flanneld和脚本文件mk-docker-opts.sh放入/usr/bin/下。

由于flannel需要依赖etcd来保证集群IP分配不冲突的问题,所以首先要在etcd中设置 flannel节点所使用的IP段。所以我们首先要用etcdctl写入配置。

etcdctl写入配置

1
etcdctl set /ksptest/network/config '{"Network": "11.0.0.0/8"}'

启动flanneld

1
nohup flanneld --etcd-endpoints=http://localhost:2379 --etcd-prefix=/ksptest/network --iface=eth0 > /var/log/flannel.log 2>&1 &

修改docker启动选项,使之从flannel的overlay网络中分配ip地址:

1
2
source /run/flannel/subnet.env
DOCKER_OPTS="$DOCKER_OPTS --bip=$FLANNEL_SUBNET --mtu=$FLANNEL_MTU"

安装Kubernetes

直接使用GitHub上的release里的二进制文件安装。在这里安装的是v.1.6.7,具体需要安装什么版本可以自行更改。以下配置均为在Master主机(10.2.0.143)配置的,Node主机配置的IP地址稍有不同,需要注意。执行以下命令进行安装。

1
2
3
4
5
6
7
8
9
wget https://github.com/kubernetes/kubernetes/releases/download/v1.6.0/kubernetes.tar.gz
tar xvf kubernetes.tar.gz
cd kubernetes
./cluster/get-kube-binaries.sh
cd server
tar xvf kubernetes-server-linux-amd64.tar.gz
rm -f *_tag *.tar
chmod 755 *
mv * /usr/bin

配置并启动kube-apiserver

1
nohup kube-apiserver --etcd-servers=http://localhost:2379 --service-cluster-ip-range=11.0.0.0/16 --anonymous-auth=false > /var/log/apiserver.log 2>&1 &

配置并启动kube-controller-manager

1
nohup kube-controller-manager --logtostderr=true --v=0 --master=http://localhost:8080 > /var/log/controller-manager.log 2>&1 &

配置并启动kube-scheduler

1
nohup kube-scheduler --logtostderr=true --v=0 --master=http://localhost:8080 > /var/log/scheduler.log 2>&1 &

配置并启动kubectl

这里说明一下,最好先启动kubectl,否则后面kube-proxy会报错。

1
nohup kubelet --address=0.0.0.0 --port=10250 --api-servers=http://localhost:8080 --cgroups-per-qos=false --enforce-node-allocatable="" > /var/log/kubelet.log 2>&1 &

配置并启动kube-proxy

1
nohup kube-proxy --logtostderr=true --v=0 --master=http://localhost:8080 > /var/log/proxy.log 2>&1 &

Node节点配置

在Node节点上只需要配置:

  • kubelet
  • kube-proxy

这里要注意的就是kubelet和kube-proxy中的api-servers和master中的IP地址要改为master主机的IP地址10.2.0.143。具体如下:

配置并启动kubectl

1
nohup kubelet --address=0.0.0.0 --port=10250 --api-servers=http://10.2.0.143:8080 --cgroups-per-qos=false --enforce-node-allocatable="" > /var/log/kubelet.log 2>&1 &

配置并启动kube-proxy

1
nohup kubelet --address=0.0.0.0 --port=10250 --api-servers=http://localhost:8080 --cgroups-per-qos=false --enforce-node-allocatable="" > /var/log/kubelet.log 2>&1 &

验证启动

在Master节点运行以下命令:

1
2
3
4
5
6
7
8
9
kubectl get all
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/kubernetes 11.0.0.1 <none> 443/TCP 19h
kubectl get nodes
NAME STATUS AGE VERSION
ksp-lab Ready 17h v1.6.7
ksp-platform Ready 17h v1.6.7
ptc-dashboard Ready 17h v1.6.7

出现如上的情况,就说明Kubernetes可以正常工作了。

一些问题总结

  1. 安装完成后,发现master的8080端口只能通过127.0.0.1或localhost访问,通过节点IP是无法访问的,从而造成如下问题:
1
2
ksp-platform ~ # kubectl -s http://10.2.0.143:8080 get node
The connection to the server 10.2.0.143:8080 was refused - did you specify the right host or port?

原因分析:/etc/kubernetes/manifests/kube-apiserver.json 文件中的-insecure-bind-address参数默认为127.0.0.1,即API-server绑定的安全IP只有127.0.0.1,相当于一个白名单,修改成0.0.0.0后,表示运行所有节点进行访问。

在启动kube-apiserver的时候加上参数 –insecure-bind-address=0.0.0.0” 这样运行所有节点都可以进行访问。

  1. 安装完成后,master和一台node主机可以get到all、nodes和pod、service等资源,而另一台node只能get到all和nodes,get不到pod等其他资源,问题如下:
1
2
ksp-lab ~ # kubectl get pod
No resources found.

原因分析:~.kube/config中的cluster设置有误,可能是之前装过Kubernetes的原因,配置文件残留带来的影响。

重新配置config文件,将cluster设置为当前的cluster。

  1. Kubernetes无法删除pod实例,在执行了delete之后,显示删除成功,但实际上还是可以get到相关的pod资源,具体问题如下:
1
2
3
4
5
6
7
8
9
ptc-dashboard ~ # kubectl delete pods --all
pod "nginx-controller-tkl5l" deleted
pod "nginx-controller-st3ax" deleted
pod "nginx-controller-qbnz7" deleted
ptc-dashboard ~ # kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-controller-tkl5l 1/1 Unknown 0 4h
nginx-controller-st3ax 1/1 Unknown 0 4h
nginx-controller-qbnz7 1/1 Unknown 0 4h

原因分析:因为这三个容器的rc,services都已经删除了,但是还保持了这个Unknown状态是由于目标主机无法响应并返回信息导致的,所以我们判断是这三个容器所在的目标主机宕机所导致的无法删除。

删除对应的Node节点,再在对应的Node节点上重新启动kubelet,节点一上线会自动加入我们当前的集群中来。

文章出自:Krzer http://www.krzer.com/版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。

文章目录
  1. 1. 硬件环境
  2. 2. 系统环境
  3. 3. 安装
    1. 3.1. 安装docker
    2. 3.2. 安装Etcd
      1. 3.2.1. 下载二进制文件
      2. 3.2.2. 部署文件并启动Etcd
    3. 3.3. 安装Flannel
      1. 3.3.1. 下载二进制文件
      2. 3.3.2. 部署文件并启动Flannel
    4. 3.4. 安装Kubernetes
      1. 3.4.1. 配置并启动kube-apiserver
      2. 3.4.2. 配置并启动kube-controller-manager
      3. 3.4.3. 配置并启动kube-scheduler
      4. 3.4.4. 配置并启动kubectl
      5. 3.4.5. 配置并启动kube-proxy
      6. 3.4.6. Node节点配置
    5. 3.5. 验证启动
  4. 4. 一些问题总结