首页 > 网络 > 云计算 >

kubernetes主要概念介绍及一键部署

2016-09-01

Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。kubernetes主要概念介绍及一键部署。

什么是kubernetes

Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。

主要功能

将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。

使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题。

自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。

kubernetes角色组成

POD:

Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;

同一个Pod只能运行在同一个主机上,共享相同的volumes、network、namespace。

ReplicationController(RC):

RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,

系统会根据定义好的副本数来创建Pod数量。

在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod,

反之则杀死多余的。当然,也可以动态伸缩运行的Pods规模或熟悉。

Service:

Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。

集合根据定义的Label和selector完成,当创建一个Service后,

会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。

Label:

Label是用于区分Pod、Service、RC的key/value键值对;

Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;

主要是将Service的请求通过lable转发给后端提供服务的Pod集合;

kubernetes组件

kubectl:

客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。

kube-apiserver:

作为整个系统的控制入口,以REST API服务提供接口。

kube-controller-manager:

用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。

kube-scheduler:

负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。

etcd:

负责节点间的服务发现和配置共享。

kube-proxy:

运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。

kubelet:

运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。

DNS:

一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。

Tip

kubernetes简称k8s,下面部署中我们用k8s这个名称。

k8s部署过程

环境

宿主机

以ubuntu16.04_raw镜像创建的openstack虚拟机两台

网络

可访问公网

目标

hostprivate ippublic iproleservice

k8s-110.0.0.10710.68.7.160master

minon

etcd

docker

flannel

kube-apiserver

kube-controller-manager

kube-scheduler

kubelet

kube-proxy

k8s-210.0.0.108NULLminon

docker

flannel

kubelet

kube-proxy

准备工作

修改hosts文件

>>> vim /etc/hosts

内容如下::

10.0.0.107 k8s-1

10.0.0.108 k8s-2

打通ssh

>>> ssh-keygen

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:NvOph1CVJmmQfbNFYT5rRPJQQaoEPtwTyp8Tyn/qvKs root@k8s-1

The key's randomart image is:

+---[RSA 2048]----+

| o+..o=Oo |

| +.+=.*O. |

| *.==.+= |

| . =.=.. o |

| o.S o |

| .o = o |

| ...+ |

| ..+. |

| EoB+ |

+----[SHA256]-----+

>>> ssh-copy-id root@10.0.0.107

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

The authenticity of host '10.0.0.107 (10.0.0.107)' can't be established.

ECDSA key fingerprint is SHA256:zYRv0YqekuRHesQbrHLF4JXKlEYqRoKUQ48jMH/QKw4.

Are you sure you want to continue connecting (yes/no)? yes

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install t he new keys

root @10.0.0.107's password:

Numb er of key(s) added: 1

Now try logging into the machine, with: "ssh 'root@10.0.0.107'"

and check to make sure that only the key(s) you wanted were added.

Note

每个主机都要把自己的密钥复制到其它节点上,包括本机。

安装docker

Tip

gitlab上有部署docker的脚本,这里略过

准备k8s

下载k8s完整二进制包

https://storage.googleapis.com/kubernetes-release/release/v1.3.4/kubernetes.tar.gz

https://github.com/kubernetes/kubernetes/releases/

目前最新版本是v1.3.4,大小为1.4G

解压k8s压缩包

>>> tar xzf kubernetes.tar.gz

Note

解压后会在解压目录生成kubernetes目录。

解压salt

>>> tar zxf kubernetes/server/kubernetes-salt.tar.gz

>>> cp -r kubernetes/saltbase kubernetes/cluster/saltbase

修改k8s安装脚本

Warning

在实际部署过程中遇到很多问题,通过修改脚本可以顺利安装。

修改common.sh

>>> vim kubernetes/cluster/common.sh

>>> %s/python/python3/g

Note

common脚本中调用了python,实际环境中是python3,需要全部替换一下。

修改download-release.sh

Note

download-release脚本功能是curl联网下载需要安装的组件并做一些安装准备工作, 过程非常缓慢还会超时,我们可以注释掉下载的动作,手工下载组件到指定位置。

注释掉清理动作

function cleanup {

# cleanup work

# rm -rf flannel* kubernetes* etcd* binaries

echo "cleanup not execute" # 函数不可空,随便添加一句,否则报错

}

# trap cleanup SIGHUP SIGINT SIGTERM

注释掉下载flannel

# curl -L https://github.com/coreos/flannel/releases/download/v${FLANNEL_VERSION}/flannel-${FLANNEL_VERSION}-linux-amd64.tar.gz -o flannel.tar.gz

注释掉下载etcd

# curl -L https://github.com/coreos/etcd/releases/download/v${ETCD_VERSION}/${ETCD}.tar.gz -o etcd.tar.gz

注释掉获取k8s version并指定版本号

# KUBE_VERSION=$(get_latest_version_number | sed 's/^v//')

KUBE_VERSION=1.3.4

注释掉下载k8s

# curl -L https://github.com/kubernetes/kubernetes/releases/download/v${KUBE_VERSION}/kubernetes.tar.gz -o kubernetes.tar.gz

注释掉删除动作

# rm -rf flannel* kubernetes* etcd*

修改utils.sh

修改kubelet选项

KUBELET_OPTS="\

--hostname-override=${1} \

--api-servers=http://${2}:8080 \

--logtostderr=true \

--cluster-dns=${3} \

--cluster-domain=${4} \

--pod-infra-container-image=vsc3.vsct.io/kubernetes/pause:latest \

--config=${5} \

$cni_opts"

Note

此处是修改默认镜像,k8s内部使用pause镜像启动容器, 这里会默认去gcr获取,gcr的域名被GFW封掉了,我们可先去 dockerhub上下载,然后push到私有registry上。

注释掉下载easy-rsa

# curl -L -O https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz > /dev/null 2>&1

>>> cp easy-rsa.tar.gz ~/kubernetes/cluster/

Note

easy-rsa包是用来生成访问https的证书的工具,我们同样下载下来,放到指定位置。

other

Note

脚本中对于服务的创建只把启动脚本放到/etc/init.d目录下, 并没有添加启动脚本,我们需要执行update-rc.d命令来添加脚本, 由于启动的地方比较多,这里不在修改脚本内容,放到安装完成后 手工添加并启动服务。

修改服务模块启动选项

切到ubuntu目录

>>> cd ~/kubernetes/cluster/ubuntu

修改启动脚本中的启动选项

>>> vim master/init_scripts/etcd

>>> vim master/init_scripts/kube-apiserver

>>> vim master/init_scripts/kube-controller-manager

>>> vim master/init_scripts/kube-scheduler

>>> vim minon/init_scripts/kubelet

>>> vim minon/init_scripts/kube-proxy

>>> vim master-flannel/init_scripts/flanneld

>>> vim minion-flannel/init_scripts/flanneld

例:

ETCD_START="start-stop-daemon \

--start \

--background \

--quiet \

--exec $ETCD \

--make-pidfile \

--pidfile $ETCD_PIDFILE \

-- $ETCD_OPTS" # \

# >> $ETCD_LOGFILE 2>&1"

Note

服务在启动时会把重定向>>符当做选项来解析报错,注释掉后面的输出log和错误重定向。

开始安装

切换到群集安装目录

>>> cd ~/kubernetes/cluster/ubuntu

执行安装脚本

>>> KUBERNETES_PROVIDER=ubuntu ./kube-up.sh

... Starting cluster using provider: ubuntu

... calling verify-prereqs

Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

... calling kube-up

~/kubernetes/cluster/ubuntu ~/kubernetes/cluster

Prepare flannel 0.5.5 release ...

Prepare etcd 2.3.1 release ...

Prepare kubernetes 1.3.4 release ...

Done! All your binaries locate in kubernetes/cluster/ubuntu/binaries directory

~/kubernetes/cluster

Deploying master and node on machine 10.0.0.107

make-ca-cert.sh 100% 4028 3.9KB/s 00:00

easy-rsa.tar.gz 100% 42KB 42.4KB/s 00:00

config-default.sh 100% 5315 5.2KB/s 00:00

util.sh 100% 29KB 28.7KB/s 00:00

kubelet.conf 100% 644 0.6KB/s 00:00

kube-proxy.conf 100% 684 0.7KB/s 00:00

kubelet 100% 2163 2.1KB/s 00:00

kube-proxy 100% 2238 2.2KB/s 00:00

kube-controller-manager.conf 100% 744 0.7KB/s 00:00

etcd.conf 100% 709 0.7KB/s 00:00

kube-apiserver.conf 100% 674 0.7KB/s 00:00

kube-scheduler.conf 100% 674 0.7KB/s 00:00

etcd 100% 2079 2.0KB/s 00:00

kube-apiserver 100% 2363 2.3KB/s 00:00

kube-scheduler 100% 2365 2.3KB/s 00:00

kube-controller-manager 100% 2677 2.6KB/s 00:00

reconfDocker.sh 100% 2074 2.0KB/s 00:00

etcd 100% 16MB 15.9MB/s 00:00

flanneld 100% 16MB 15.8MB/s 00:00

etcdctl 100% 14MB 13.7MB/s 00:01

kube-apiserver 100% 105MB 104.6MB/s 00:01

kube-scheduler 100% 56MB 56.2MB/s 00:01

kube-controller-manager 100% 95MB 94.9MB/s 00:01

kubelet 100% 103MB 51.3MB/s 00:02

flanneld 100% 16MB 15.8MB/s 00:00

kube-proxy 100% 48MB 48.3MB/s 00:01

flanneld.conf 100% 577 0.6KB/s 00:00

flanneld 100% 2126 2.1KB/s 00:00

flanneld.conf 100% 568 0.6KB/s 00:00

flanneld 100% 2136 2.1KB/s 00:00

Warning: etcd.service changed on disk. Run 'systemctl daemon-reload' to reload units.

{"Network":"172.16.0.0/16", "Backend": {"Type": "vxlan"}}

Connection to 10.0.0.107 closed.

Deploying node on machine 10.0.0.108

config-default.sh 100% 5315 5.2KB/s 00:00

util.sh 100% 29KB 28.7KB/s 00:00

reconfDocker.sh 100% 2074 2.0KB/s 00:00

kubelet.conf 100% 644 0.6KB/s 00:00

kube-proxy.conf 100% 684 0.7KB/s 00:00

kubelet 100% 2163 2.1KB/s 00:00

kube-proxy 100% 2238 2.2KB/s 00:00

kubelet 100% 103MB 102.6MB/s 00:01

flanneld 100% 16MB 15.8MB/s 00:00

kube-proxy 100% 48MB 48.3MB/s 00:00

flanneld.conf 100% 577 0.6KB/s 00:00

flanneld 100% 2126 2.1KB/s 00:00

Warning: flanneld.service changed on disk. Run 'systemctl daemon-reload' to reload units.

Connection to 10.0.0.108 closed.

Validating master

Validating root@10.0.0.107

Validating root@10.0.0.108

Using master 10.0.0.105

cluster "ubuntu" set.

user "ubuntu" set.

context "ubuntu" set.

switched to context "ubuntu".

Wrote config for ubuntu to /root/.kube/config

... calling validate-cluster

Found 2 node(s).

NAME STATUS AGE

10.0.0.107 Ready 1h

10.0.0.108 Ready 1h

Validate output:

NAME STATUS MESSAGE ERROR

scheduler Healthy ok

controller-manager Healthy ok

etcd-0 Healthy {"health": "true"}

Cluster validation succeeded

Done, listing cluster services:

Kubernetes master is running at http://10.0.0.107:8080

kubernetes-dashboard is running at http://10.0.0.107:8080/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Note

刚才提到,安装脚本中把启动脚本放到init.d路径下,没有更新脚本,如果在执行过程中卡住不动, 则是脚本在检查服务启动,而服务实际上没有启动成功,我们可以执行update-rc.d [服务名] defaults 来更新启动服务,此命令还可以控制启动顺序,比如docker必须在flannel后面启动。

测试master服务

刚才安装打印显示http服务在http://10.0.0.107:8080上,对应public ip是10.68.7.160,打开效果如下:

{

"paths": [

"/api",

"/api/v1",

"/apis",

"/apis/apps",

"/apis/apps/v1alpha1",

"/apis/autoscaling",

"/apis/autoscaling/v1",

"/apis/batch",

"/apis/batch/v1",

"/apis/batch/v2alpha1",

"/apis/extensions",

"/apis/extensions/v1beta1",

"/apis/policy",

"/apis/policy/v1alpha1",

"/apis/rbac.authorization.k8s.io",

"/apis/rbac.authorization.k8s.io/v1alpha1",

"/healthz",

"/healthz/ping",

"/logs/",

"/metrics",

"/swaggerapi/",

"/ui/",

"/version"

]

}

部署dashboard

需要的yaml文件

>>> ls kubernetes/cluster/addons/dashboard

dashboard-controller.yaml dashboard-service.yaml MAINTAINERS.md README.md

修改dashboard-controller.yaml

image: vsc3.vsct.io/larry0208/kubernetes-dashboard-amd64-google:v1.1.1

Note

默认镜像指向gcr,我们同样在docker hub上pull下此镜像放到私有registry上。 另外此yaml文件中一些名称的版本也修改成v1.1.1

创建命名空间

Note

安装k8s的时候已经默认创建了个kube-system命名空间, dashboard属于系统服务,所以这里不需要再创建命名空间。

创建pod

>>> kubectl -s 10.68.7.160:8080 create -f dashboard-controller.yaml

查看pod状态

>>> kubectl get pods -o wide --namespace=kube-system

NAME READY STATUS RESTARTS AGE IP NODE

kubernetes-dashboard-v1.1.1-a8dgy 1/1 Running 0 20h 172.16.17.2 10.0.0.108

创建service

>>> kubectl -s 10.68.7.160:8080 create -f dashboard-service.yaml

查看service状态

>>> kubectl --namespace=kube-system get ep kubernetes-dashboard

NAME ENDPOINTS AGE

kubernetes-dashboard 172.16.17.2:9090 20h

查看效果

浏览器输入:http://10.68.7.160:8080/ui

相关文章
最新文章
热点推荐