Kubernetes Cookbook 编程指南 中文版教程
创建时间:2018-12-07  访问量:3665  7  0

Kubernetes Cookbook 编程指南 中文版教程

配置Master主节点 

Kubernetes的master主节点充当容器的控制中心。主节点所承担的职责包括终端用户的服务入口,分配任务给从节点并且收集信息。在本节,我们将会看到如何设置Kubernetes的主节点。主节点中运行了下面三个服务进程:

  • API 服务器(apiserver)

  • 调度器(scheduler)

  • 控制器管理器(controller manager)

我们可以使用一个打包命令hyperkube来启动它们,也可以单独作为守护进程来启动它们。本节涵盖了这两种解决方案。

开始

在部署master节点之前,确保你已经准备好了etcd服务端点(endpoint),它主要目的是作为Kubernetes的数据存储。你必须验证它是否可以访问并且配置了层叠网络的无类域间路由(Classless Inter-Domin Routing,CIDR https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing )。可以使用下面的命令来检测:

// 验证etcd连与CIDR设置
$ curl -L <etcd endpoint URL>/v2/keys/coreos.com/network/config

如果连接成功,但是etcd配置没有期望的CIDR值,你可以使用curl命令为它设置值:

$ curl -L <etcd endpoint URL>/v2/keys/coreos.com/network/config -XPUT -d
value="{ \"Network\": \"<CIDR of overlay network>\" }"

除此之外,请记录以下项:etcd endpoint的URL,etcd endpoint暴露的端口以及层叠网络的CIDR。你需要它们来配置主节点的服务。

如何去做...

为了构建master主节点,我们使用这几个步骤:安装源码、启动服务并验证。跟着这个过程操作,你最终将成为kubernetes实践大师。

安装

这里,我们提供两种安装过程:

  • 第一种方式是基于RHEL Linux系统的软件包管理器;master服务进程由systemd命令进行控制

  • 第二种方式是基于其它Linux发行版安装;我们通过二进制文件与服务启动脚本来构建master。

CentOS7 或 Red Hat Enterprise Linux 7

1. RHEL 7,CentOS 7或更新版本的Linux系统都有Kubernetes官方安装包。你可以通过yum命令进行安装:

// install Kubernetes master package
# yum install kubernetes-master kubernetes-client

kubernetes-master软件包包含master守护进程,kubernetes-client软件包会安装一个叫kubectl的工具,它是与Kubernetes系统通信的命令行接口。因为master节点是请求的服务端点,当安装了kubectl工具后,用户就可以很容易的通过此命令控制容器的应用和环境。

CentOS 7的Kubernetes RPM安装包 有五个不同功能的Kubernetes RPM安装包(即.rpm接尾的文件,https://en.wikipedia.org/wiki/RPM_Package_Manager):kubernetes,kubernetes-master,kubernetes-client,kubernetes-node和kubernetes-unit-test。 第一个安装包,kubernetes,就像下面三项的超链接。你将同时安装kubertes-master,kubernetes-client和kubernetes-node。其中名为kubernetes-node是node节点安装包。最后一个,kubernetes-unit-test包不仅包含测试脚本,还包含了Kubernetes模板示例。

2. 这里是执行完yum install命令之后的文件:

// 配置文件作为服务的环境变量
# ls /etc/kubernetes/
apiserver config controller-manager scheduler
// systemd 文件
# ls /usr/lib/systemd/system/kube-*
/usr/lib/systemd/system/kube-apiserver.service /usr/lib/systemd/system/kube-scheduler.service /usr/lib/systemd/system/kube-controller-manager.service

3. 接下来,我们将systemd文件保留为原始文件并修改目录/etc/kubernetes下的配置文件中的值以与etcd建立连接。名为config的文件是几个Kubernetes守护进程的共享环境文件。 对于基本设置,只需更改apiserver中的条目即可:

# cat /etc/kubernetes/apiserver

###
# kubernetes system config
#
# The following values are used to configure the kube-apiserver
#

# The address on the local server to listen to.
KUBE_API_ADDRESS="--address=0.0.0.0"

# The port on the local server to listen on.
KUBE_API_PORT="--insecure-port=8080"

# Port nodes listen on
# KUBELET_PORT="--kubelet_port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd_servers=<etcd endpoint URL>:<etcdexposed port>"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=<CIDR ofoverlay network>"

# default admission control policies
KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

# Add your own!
KUBE_API_ARGS="--cluster_name=<your cluster name>"

4. 然后,逐个启动kube-apiserver,kube-scheduler和kubecontroller-manager守护进程; 命令systemctl可以帮助你管理这些进程。请注意,kube-apiserver应该始终首先启动,因为kube-scheduler和kube-controller-manager在开始运行时要连接到Kubernetes API服务器:

// 启动服务
# systemctl start kube-apiserver
# systemctl start kube-scheduler
# systemctl start kube-controller-manager

// 将服务设置为开机启动
# systemctl enable kube-apiserver
# systemctl enable kube-scheduler
# systemctl enable kube-controller-manager

添加守护进程间依赖

1. 虽然systemd在没有运行API服务器的情况下不会返回错误消息,但kube-scheduler和kube-controller-manager都会出现连接错误,并且不提供正常的服务:

$ sudo systemctl status kube-scheduler -l—output=cat kubescheduler.service - Kubernetes Scheduler Plugin

	Loaded: loaded (/usr/lib/systemd/system/kube-scheduler.service;
enabled)
	Active: active (running) since Thu 2015-11-19 07:21:57 UTC;
5min ago
	Docs: https://github.com/GoogleCloudPlatform/kubernetes
Main PID: 2984 (kube-scheduler)
	CGroup: /system.slice/kube-scheduler.service
			└─2984 /usr/bin/kube-scheduler—logtostderr=true—v=0
--master=127.0.0.1:8080
E1119 07:27:05.471102 2984 reflector.go:136] Failed
to list *api.Node: Get http://127.0.0.1:8080/api/v1/
nodes?fieldSelector=spec.unschedulable%3Dfalse: dial tcp
127.0.0.1:8080: connection refused

2. 因此,为了防止启动顺序影响其功能,可以在/usr/lib/systemd/system/kube-scheduler和/usr/lib/systemd/system/kube-controller-manager中systemd.unit部分添加下面两个设置:

[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=kube-apiserver.service
Wants=kube-apiserver.service

使用前面的设置,我们就可以保证kube-apiserver是第一个启动的守护进程。

3. 此外,如果您希望调度程序和控制器管理器始终与健康的API服务器一起运行,这意味着如果停止kube-apiserver,那么kube-scheduler和kube-controller-manager也将被停止; 你可以改变systemd.unit部分的Wants和Requires,如下所示:

Requires=kube-apiserver.service

Requires有更多严格的限制条件。假如kube-apiserver守护进程已经崩溃了,那么kube-scheduler和kube-controller-manager这两种守护进程也会停止。另一方面,使用Requires配置是很难调试master的安装的。建议当所有配置确保都设置正确之后再开启这个配置。

其它Linux选项

我们也可以下载二进制文件进行安装。这里是最新版本的官方网站:https://github.com/kubernetes/kubernetes/releases:

1. 我们将安装标记为Latest release的版本并使用打包命令hyperhube启动所有的守护进程:

// 下载 Kubernetes 压缩包
# curl -L -O https://github.com/GoogleCloudPlatform/kubernetes/
releases/download/v1.1.2/kubernetes.tar.gz

// 将tar包解压到指定目录, 我们这里放在/opt目录下,KUBE_HOME为/opt/kubernetes
# tar zxvf kubernetes.tar.gz -C /opt/

// 复制所有二进制文件到系统目录
# cp /opt/kubernetes/server/bin/* /usr/local/bin/

2. 下一步创建启动脚本(init),里面包含了分别启动三个master守护进程的命令:

# cat /etc/init.d/kubernetes-master
#!/bin/bash
#
# This shell script takes care of starting and stopping kubernetes
master

# Source function library.
. /etc/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

prog=/usr/local/bin/hyperkube
lockfile=/var/lock/subsys/`basename $prog`
hostname=`hostname`
logfile=/var/log/kubernetes.log

CLUSTER_NAME="<your cluster name>"

ETCD_SERVERS="<etcd endpoint URL>:<etcd exposed port>"
CLUSTER_IP_RANGE="<CIDR of overlay network>"
MASTER="127.0.0.1:8080"

3. 为了更轻松,更清楚地管理您的Kubernetes设置,我们将可变变量的声明放在此init脚本的开头。 请仔细检查etcd URL与层叠网络的CIDR以确保它们与先前的安装相同:

start() {
    # Start daemon.
    echo $"Starting apiserver: "
    daemon $prog apiserver \
    --service-cluster-ip-range=${CLUSTER_IP_RANGE} \
    --port=8080 \
    --address=0.0.0.0 \
    --etcd_servers=${ETCD_SERVERS} \
    --cluster_name=${CLUSTER_NAME} \
    > ${logfile}_apiserver 2>&1 &
    
    echo $"Starting controller-manager: "
    daemon $prog controller-manager \
    --master=${MASTER} \
    > ${logfile}_controller-manager 2>&1 &

    echo $"Starting scheduler: "
    daemon $prog scheduler \
    --master=${MASTER} \
    > ${logfile}_scheduler 2>&1 &

    RETVAL=$?
    [ $RETVAL -eq 0 ] && touch $lockfile
    return $RETVAL
}

stop() {
    [ "$EUID" != "0" ] && exit 4
    	echo -n $"Shutting down $prog: "
    killproc $prog
    RETVAL=$?
    	echo
    [ $RETVAL -eq 0 ] && rm -f $lockfile
    return $RETVAL
}

4. 接下来,随意将以下行作为一般服务用法的脚本中的最后一部分:

# See how we were called.
case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    status)
    status $prog
    ;;
    restart|force-reload)
    stop
    start
    ;;
    try-restart|condrestart)
    if status $prog > /dev/null; then
        stop
        start
    fi
	;;
	reload)
    exit 3
    ;;
    *)
    echo $"Usage: $0 {start|stop|status|restart|try-restart|forcere-load}"
    exit 2
esac

5. 现在,是时候启动名为kubernetes-master的服务了:

$sudo service kubernetes-master start

在撰写本书时,最新的Kubernetes版本为1.1.2。 因此,我们将在大多数章节的示例中使用1.1.2版本。

验证

1. 启动master节点的所有三个守护进程后,您可以通过检查服务状态来验证它们是否正常运行。命令systemd和service都可以获取相关的日志:

# systemd status <service name>

2. 有关更详细的历史日志,可以使用命令journalctl查看:

journalctl -u <service name> --no-pager --full

在输出中找到显示Started ...的行后,您可以确认服务设置已经通过验证。

3. 此外,Kubernetes中的主导命令kubectl可以开始操作了:

// 验证Kubernetes版本
# kubectl version
Client Version: version.Info{Major:"1", Minor:"0.3", GitVersion:"v
1.0.3.34+b9a88a7d0e357b", GitCommit:"b9a88a7d0e357be2174011dd2b127
038c6ea8929", GitTreeState:"clean"}
Server Version: version.Info{Major:"1", Minor:"0.3", GitVersion:"v
1.0.3.34+b9a88a7d0e357b", GitCommit:"b9a88a7d0e357be2174011dd2b127
038c6ea8929", GitTreeState:"clean"}

还可以参见

从指南中,您知道如何创建自己的Kubernetes master。 您还可以查看以下指南:

  • 浏览架构

  • 配置node从节点

  • 第4章构建高可用性群集中的构建多master的指南,构建高可用集群

  • 第6章在AWS中构建Kubernetes基础设施,在AWS上构建Kubernetes

  • 第7章认证与授权指南,高级集群管理