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

Kubernetes Cookbook 编程指南 中文版教程

构建数据存储库 

为了持久化Kubernetes集群信息,我们需要设置一个数据存储。Kubernetes使用etcd作为标准的数据库。这一部分将指导你构建一个etcd服务。

如何来做..

etcd数据库需要Linux操作系统;一些Linux发行版提供了etcd安装包,而有些则没有提供。这一部分描述了如何安装etcd。

Red Hat Enterprise Linux 7 or CentOS 7

Red Hat Enterprise Linux(RHEL)7, CentOS 7 或更新版本的LInux都有一个etcd官方安装包,你可以通过yum命令来进行安装,如下所示:

//它将执行在RHEL/CenOS Linux系统上安装etcd软件包

$ sudo yum update -y sudo yum install etcd

Ubuntu Linux 15.10 Wily Werewolf

Ubuntu 15.10或更新的系统也有一个etcd官方安装包。你可以通过apt-get命令来安装,如下所示:

//它将在Ubuntu Linux上执行安装etcd软件包

$ sudo apt-get update -y sudo apt-get install etcd

其它Linux系统

如果你使用是不同于上面的Linux版本,如Amazon Linux,你可以通过在官网上下载二进制安装包进行安装,如下所示:

下载二进制安装包

通过访问https://github.com/coreos/etcd/releases来获取etcd。OS X(darwin-amd64),Linux、Windows 二进制安装包和源代码都可以从其上面下载。

注意,因为Go运行时的问题,官方不提供32位的安装包。因此,你必须准备64位的Linux操作系统。

在你的Linux机器上,使用curl命令下载etcd-v2.2.1-linux-amd64.tar.gz二进制包。

//命令后跟重定向选项(-L)和使用远程的文件名称(-O)

curl -L -O https://github.com/coreos/etcd/releases/download/v2.2.1/etcdv2.2.1-linux-amd64.tar.gz

创建一个用户

由于安全的原因,创建一个拥有etcd包的本地用户和组。

1. 运行下面的useradd命令:

//options
// create group (-U), home directory(-d), and create it(-m) 
// name in GCOS fild (-c),login shell (-s) 
$ sudo useradd -U -d /var/lib/etcd -m -c "etcd user" -s /sbin/nologin etcd

2. 你可以验证/etc/passwd看下etcd用户有没有创建:

//在/etc/passwd中搜索etcd user,uid与gid是不一样的 
$ grep etcd /etc/passwd etcd : x:997:995 : etcd user:/var/lib/etcd:/sbin/nologin

在任何时候你都可以删除用户;输入sudo userdel -r etcd就可以删除etcd用户。

安装etcd

1. 下载完etcd二进制包后,使用tar命令解压文件:

$ tar xf etcd-v2.2.1-linux-amd64.tar.gz 
$ cd etcd-v2.2.1-linux-ad64
//使用ls命名查看目录下有哪些文件和二进制执行文件 
$ ls Documentation README-etcdctl.md README.md etcd etcdctl

2. etcd程序和etcdctl命令需要复制到/usr/local/bin目录下。还要创建一个配置文件/etc/etcd/etcd.conf

$ sudo cp etcd etcdctl /usr/local/bin/
//创建 etcd.conf 
$ sudo mdir -p /etc/etcd 
$ sudo touch /etc/etcd/etcd.conf 
$sudo chown -R etcd:etcd /etc/etcd

它是如何工作的...

让我们测试运行etcd进程来浏览etcd的功能。输入etcd命令并带上namedata-dir参数,如下所示:

//针对测试目的,在/tmp临时目录下创建一个数据文件 
$ etcd --name happy-etcd --data-dir /tmp/happy.etcd &

然后,你可以查看如下所示的输出日志:

现在,你可以尝试使用etcdctl命令来访问etcd并加载和存储数据,如下所示:

//将键为/my/happy/data的值设置为hello world 
$ etcdctl set /my/happy/data "hello world"

//获取键为/my/happy/data的值 
$ etcdctl get /my/happy/data hello world

另外,黙认情况下,etcd在2379端口打开TCP连接来访问RESTful API,因此你也可以尝试使用一个HTTP客户端,如curl命令来访问数据,如下所示:

//使用以cURL获取键为/my/happy/data的值 
$ curl -L http://localhost:2379/v2/keys/my/happy/data {"action":"get","node":{"key":"/my/happy/data","value":"hello world", "modifiedIndex":4, "createdIndex":4}}

//使用cURL将键/my/happy/data的值设置为My Happy world 
$ curl http://127.0.0.1:2379/v2/keys/my/happy/data -XPUT -d value="My Happy world"

//使用etcdctl命令获取键/my/happy/data的值 
$ etcdctl get /my/happy/data My Happy world

好了!现在,你可以使用curl命令删除键了,如下所示:

$ curl http://127.0.0.1:2379/v2/keys/my?recursive=true -XDELETE

//删除后没有数据返回了 $ curl http://127.0.0.1:2379/v2/keys/my/happy/data {"errorCode":100,"message":"Key not found","cause":"/my","index":10}

$ curl http://127.0.0.1:2379/v2/keys/my/happy {"errorCode":100,"message":"Key not found","cause":"/my","index":10}

$ curl http://127.0.0.1:2379/v2/keys/my {"errorCode":100,"message":"Key not found","cause":"/my","index":10}

开机自启动脚本

基于你的Linux,选择使用systemd方式或者是init方式,有几中不同的方式可以编写一个自动启动脚本。

如果你不确定,验证你系统中ID为1的进程,输入ps -P 1查看进程名称,如下所示:

//此Linux系统是基于systemd方式的 
$ ps -P -l PID PSR TTY STAT TIME COMMAND 1 0 ? Ss 0:03 /usr/lib/systemd/systemd --switched-root –system

//此Linux系统 基于init方式的 
# ps -P 1 PID PSR TTY STAT TIME COMMAND 1 0 ? Ss 0:01 /sbin/init

启动脚本(基于systemd)

如果你使用的是基于systemd的Linux系统,如RHEL7,CentOS7,Ubuntu 15.4或更新,你需要准备/usr/lib/systemd/etcd.service文件,如下所示:

[Unit]

Description=Etcd Server

After=network.target

[Service]

Type=simple

WorkingDirectory=/var/lib/etcd/

EnvironmentFile=/etc/etcd/etcd.conf

User=etcd

ExecStart=/usr/local/bin/etcd

[Install]

WantedBy=multi-user.target

文件编写好后,使用systemctl命令向systemd注册,如下所示:

# sudo systemctl enable etcd

然后,重启你的系统或输入sudo systemctl start etcd来启动etcd进程。你可以使用sudo systemctl status -l etcd验证etcd服务状态。

启动脚本(基于init)

如果你使用的是基于init方式的Linux系统,如Amazon Linux,使用传统方式准备一个/etc/init.d/etcd脚本,如下所示:

#!/bin/bash`
#
# etcd This shell script takes care of starting and stopping etcd
#
# chkconfig: - 60 74
# description: etcd
​
### BEGIN INIT INFO
# Provides: etcd
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Should-Start: $syslog $named ntpdate
# Should-Stop: $syslog $named
# Short-Description: start and stop etcd
# Description: etcd
### END INIT INFO
​
# Source function library.
. /etc/init.d/functions
​
# Source networking configuration.
. /etc/sysconfig/network
prog=/usr/local/bin/etcd
etcd_conf=/etc/etcd/etcd.conf
lockfile=/var/lock/subsys/`basename $prog`
hostname=`hostname`
​
start() {
    # Start daemon.
    . $etcd_conf
    echo -n $"Starting $prog: "
    daemon --user=etcd $prog > /var/log/etcd.log 2>&1 &
    RETVAL=$?
    echo
    [ $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
}
​
# See how we were called.
case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    status)
    status $prog
    ;;
    restart)
    stop
    start
    ;;
    reload)
    exit 3
    ;;
    *)
    echo $"Usage: $0 {start|stop|status|restart|reload}"
    exit 2
esac

写完之后,使用chkconfig命令向init注册,如下所示:

//set file permission correctly
$ sudo chmod 755 /etc/init.d/etcd
$ sudo chown root:root /etc/init.d/etcd

然后,重启系统或输入/etc/init.d/etcd start来启动etcd进程。

配置

etcd有一个配置文件/etc/etcd/etcd.conf可以改变它的配置,如数据文件目录和TCP端口号。

最小配置如下所示:

名称 解释 示例 备注
ETCD_NAME 实体名称 myhappy-etcd  
ETCD_DATA_DIR 数据文件目录 /var/lib/etcd/myhappy.etcd 文件目录必须归etcd用户所有
ETCD_LISTEN_CLIENT_URLS TCP端口号 http://0.0.0.0:8080 指定0.0.0.0绑定所有IP地址,否则使用localhost仅接受相同机器的请求
ETCD_ADVERTISE_CLIENT_URLS 向这个etcd URL通知其它集群的实例 http://localhost:8080 用在集群配置中
$ cat /etc/etcd/etcd.conf
export ETCD_NAME=myhappy-etcd
export ETCD_DATA_DIR="/var/lib/etcd/myhappy.etcd"
export ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:8080"
export ETCD_ADVERTISE_CLIENT_URLS="http://localhost:8080"

在另一方面, 基于systemd的Linux系统不需要导出指定export,如下所示:

$ cat /etc/etcd/etcd.conf
ETCD_NAME=myhappy-etcd
ETCD_DATA_DIR="/var/lib/etcd/myhappy.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:8080"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:8080"

也可以参考

这部分描述了如何配置etcd。使用RESTful API进行操作是非常容易且简单的,但并不是最强大的。然而,需要考虑到它的安全性与可用性。下面的方法描述了如何保证etcd是安全可靠的:

  • 探索架构

  • 第4章集群etcd指南,构建一个高可用的集群

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

  • 第8章使用etcd日志指南,日志与监控