kubernetes主要概念介绍及一键部署(转载请注明出处)

原创 2016年08月31日 12:35:48


author: zqh
date: 2016-8-26

什么是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虚拟机两台
  • 网络
可访问公网

目标

host private ip public ip role service
k8s-1 10.0.0.107 10.68.7.160
  • master
  • minon
  • etcd
  • docker
  • flannel
  • kube-apiserver
  • kube-controller-manager
  • kube-scheduler
  • kubelet
  • kube-proxy
k8s-2 10.0.0.108 NULL
  • minon
  • docker
  • flannel
  • kubelet
  • kube-proxy

准备工作

  1. 修改hosts文件
>>> vim /etc/hosts

内容如下::

10.0.0.107  k8s-1
10.0.0.108  k8s-2
  1. 打通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

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

  1. 安装docker

Tip

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

  1. 准备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
  1. 修改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命令来添加脚本, 由于启动的地方比较多,这里不在修改脚本内容,放到安装完成后 手工添加并启动服务。

  1. 修改服务模块启动选项
  1. 切到ubuntu目录
>>> cd ~/kubernetes/cluster/ubuntu
  1. 修改启动脚本中的启动选项
>>> 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

../_images/k8s_dashboard.png
版权声明:本文为博主原创文章,未经博主允许不得转载。

kubernetes一键部署脚本kube-up.sh 学习笔记

一 Kubernetes 一件部署,kube-up脚本解析   二 脚本内部,脚本source调用步骤 env.sh     ---->     kube-env.sh      --->   ...
  • rually
  • rually
  • 2015年12月30日 21:54
  • 2596

Kubernetes 1.6新特性:RBAC授权

概述 Kuberntes中API Server的访问控制过程图示如下: 在Kubernetes中,授权(authorization)是在认证(authentication)之后的一个步骤。授权...

kubernetes中的RBAC

kubernetes中的RBACkubernetes1.6版本中最引入注意的是RBAC授权机制进行了 Beta阶段,RBAC(基于角色的权限访问控制)是控制访问kubernetes资源的权限.RBAC...

K8S Using RBAC Authorization 译文

简介 K8S rbac 官网译文

学习docker遇到的问题

本文主要用于收集整理在学习docker中遇到的问题(如:安装完docker后本地电脑无法上网,docker怎么配置代理proxy,配置非https的仓库等),方便以后自己查阅,以及给遇到同样问题的网友...

CentOS7 下配置Keepalived为系统服务,开机自动启动。

keepalived的安装以及基本配置 1.我的keepalived 安装在 /home/wangpl/mine/soft/keepalived-1.2.2目录下。 cd /home/w...

kubernetes获取私有registry的images

通常在实际的项目中用kubernetes做开发的时候,会用到私有的registry(镜像仓库),比如:在创建应用的时候,镜像用的就是私有仓库的镜像。但是通常会有一个问题,如果你的私有的镜像仓库做了认证...

Kubernetes(k8s)学习笔记(二)—— 环境及集群搭建

Kubernetes(k8s)学习笔记(二)—— 环境及集群搭建kubernetes基础软件的安装,基本上可以跳过谷歌官网的教程。因为谷歌国内被墙了,毕竟生产环境不是虚拟机,在一台centos7的机器...

让Kubernetes集群使用本地image registry

在本地搭建docker registry在容器中运行registry服务docker1.13版本下,使用REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY环境变量,指定...
  • wzp1986
  • wzp1986
  • 2017年02月19日 23:24
  • 2247

centos7下安装jenkins

安装Jenkins使用以下命令安装jenkins sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redh...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kubernetes主要概念介绍及一键部署(转载请注明出处)
举报原因:
原因补充:

(最多只允许输入30个字)