Kubernetes介绍之ETCD集群搭建

Kubernetes介绍之ETCD集群搭建

这篇开始介绍Kubernetes的相关内容,从搭建etcd集群入手。etcd 是 Kubernetes 集群的数据核心,因此围绕 etcd 相关的运维知识就比较重要。etcd 可以容器化部署,也可以在宿主机自行搭建。

注意:集群所用机器最好在同一个内网。本人最初使用不在一个区域的阿里云ECS,只能用外网ip进行配置,会导致节点无法通信。改为使用三台在同一交换机下的机器,则顺利完成部署。

一、ETCD单节点安装

1.1 CentOS下的安装

CentOS安装过程比较简单,直接使用yum命令安装即可:
$ yum install etcd -y
在这里插入图片描述

1.2 Ubuntu下的安装

安装过程参考的是etcd官网,链接:https://github.com/etcd-io/etcd/releases
安装路径可以在命令中设置,建议集群内的节点统一路径,方便后期进行各种配置,提高部署效率,执行的命令如下:

$ ETCD_VER=v3.3.11
$ GOOGLE_URL=https://storage.googleapis.com/etcd
$ GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
$ DOWNLOAD_URL=${GOOGLE_URL}
$ rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
$ rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
$ curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
$ tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
$ rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
$ /tmp/etcd-download-test/etcd --version
$ ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version

如果可以正确显示etcd的版本信息,说明安装成功。

1.3 单节点运行

使用下面的命令行即可。运行后,可以通过"cat /var/log/etcd.log"查看运行日志。
$ etcd --name etcd --data-dir /var/lib/etcd/default.etcd --listen-client-urls http://0.0.0.0:2389 --advertise-client-urls http://0.0.0.0:2389 >> /var/log/etcd.log 2>&1 &

二、http连接方式的集群部署

为了避免不必要的问题,建议部署etcd时宿主机采用统一的系统,下文中的所有集群节点均基于CentOS系统。
节点信息如下:

主机名节点名主机ip
k8s-masteretcd-1172.24.211.217
k8s-node-1etcd-2172.24.211.218
k8s-node-2etcd-3172.24.211.219

2.1 各节点添加hosts

首先,分别设置固定主机名称,然后重新登录:
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node-1
hostnamectl set-hostname k8s-node-2
然后,如果 DNS 不支持解析主机名称,则需要修改每台机器的 /etc/hosts 文件,添加主机名和 IP 的对应关系:

cat >> /etc/hosts <<EOF
172.24.211.217     k8s-master
172.24.211.218     k8s-node-1
172.24.211.219     k8s-node-2
EOF

2.2 添加信任关系

无特殊说明,本文的所有操作均在 k8s-master 节点上执行,然后远程分发文件和执行命令,所以需要添加该节点到其它节点的 ssh 信任关系。
设置 k8s-master 的 root 账户可以无密码登录所有节点(此过程需要进行输入密码等操作):

 $ ssh-keygen -t rsa
 $ ssh-copy-id root@k8s-master
 $ ssh-copy-id root@k8s-node-1
 $ ssh-copy-id root@k8s-node-1

2.4 单机安装ETCD

完成上述准备工作后,参照本文第一部分,在三台机器上分别安装好单机版的ETCD即可。

2.5 集群配置及启动

1)修改etcd.conf: vim /etc/etcd/etcd.conf
完成2.4的工作后,每台机器上都会有/etc/etcd文件夹,下面有一个etcd.conf文件,此文件里面有默认的配置(很多配置未开放,被默认注释了),需要对该文件进行一定的修改,具体配置项如下:

    #[Member]
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    ETCD_LISTEN_PEER_URLS="http://172.24.211.217:2380"
    ETCD_LISTEN_CLIENT_URLS="http://172.24.211.217:2379,http://127.0.0.1:2379"
    ETCD_NAME="etcd-1"
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.24.211.217:2380"
    ETCD_ADVERTISE_CLIENT_URLS="http://172.24.211.217:2379"
    ETCD_INITIAL_CLUSTER="etcd-1=http://172.24.211.217:2380,etcd-2=http://172.24.211.218:2380,etcd-3=http://172.24.211.219:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    #注意:最先启动的那台机器STATE设置为new,其他设置为existing
    ETCD_INITIAL_CLUSTER_STATE="new"

2)修改etcd.service:vim /usr/lib/systemd/system/etcd.service
为了可以使用systemd命令启动etcd,需要进一步配置etcd.service文件,具体配置如下:

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
#set GOMAXPROCS to number of processors
ExecStart=/usr/bin/etcd
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

3)启动集群

$systemctl daemon-reload
$systemctl start etcd
$etcdctl member list

如果集群启动成功,可以看到如下的集群信息:
在这里插入图片描述

三、https连接方式的集群部署(根据需求选择性执行,非生产环境可忽略)

如果已经成功完成http连接方式的部署,进一步进行https连接方式的集群部署时并不复杂,主要工作是制作各种证书以及修改配置加载证书。
这部分的内容主要参考自:https://github.com/opsnull/follow-me-install-kubernetes-cluster

3.1 准备工作

  • 创建几个将会用到的文件夹:
    mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert
  • 安装依赖包(包含用于软件包签名的 gpg 密钥和软件源的信息):yum install -y epel-release
  • 安装其他依赖包,有些包不是必须安装[其中,ntp保证集群时间同步,ipvs 依赖 ipset]:
    yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
  • 关闭防火墙:systemctl stop firewalld && systemctl disable firewalld
  • 加载内核模块:modprobe ip_vs_rr && modprobe br_netfilter
  • 设置系统时区:timedatectl set-timezone Asia/Shanghai && timedatectl set-local-rtc 0 && systemctl restart rsyslog && systemctl restart crond

3.2 创建证书、编辑配置文件

生成证书等操作可以在主节点进行,然后将相关文件拷贝到其他服务器,使用scp命令即可。本人进行ETCD安装是为了kubernetes安装做准备,所以文件夹以及某些参数都有明显的K8S痕迹,可根据个人喜好修改。

1)安装cfssl 工具集(用来创建ca证书):

sudo mkdir -p /opt/k8s/cert && cd /opt/k8s
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
mv cfssl_linux-amd64 /opt/k8s/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
mv cfssljson_linux-amd64 /opt/k8s/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /opt/k8s/bin/cfssl-certinfo
chmod +x /opt/k8s/bin/*
export PATH=/opt/k8s/bin:$PATH

2)创建ca配置文件和ca证书签名请求文件:

    cd /opt/k8s/work
    #创建ca-config.json文件
    cat > ca-config.json <<EOF
    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "kubernetes": {
            "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ],
            "expiry": "87600h"
          }
        }
      }
    }
    EOF
    
    #创建ca-csr.json文件
    cat > ca-csr.json <<EOF
    {"CN": "kubernetes",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ],
  "ca": {
    "expiry": "876000h"
 }
}
EOF
  • CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User
    Name),浏览器使用该字段验证网站是否合法;
  • O:Organization,kube-apiserver从证书中提取该字段作为请求用户所属的组 (Group);
  • kube-apiserver 将提取的 User、Group 作为 RBAC授权的用户标识。

3)生成 CA 证书和私钥,并统一拷贝到对应目录下

cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cp ca*.pem ca-config.json /etc/kubernetes/cert
scp ca*.pem ca-config.json root@k8s-node-1:/etc/kubernetes/cert
scp ca*.pem ca-config.json root@k8s-node-2:/etc/kubernetes/cert

4)创建 etcd 证书和私钥的配置文件

cd /opt/k8s/work
cat > etcd-csr.json <<EOF
{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "172.24.211.217",
    "172.24.211.218",
    "172.24.211.219"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "etcd",
      "OU": "System"
    }
  ]
}
EOF

hosts 字段:配置的是授权使用该证书的 etcd 节点 IP 或域名列表,需要将 etcd 集群的三个节点 IP 都列在其中。
5)利用ca证书和私钥,生成ETCD的证书和私钥,并分发到各机器:

#注意:profile参数需要与上面ca-config.json的配置一致
cfssl gencert -ca=/opt/k8s/work/ca.pem \
    -ca-key=/opt/k8s/work/ca-key.pem \
    -config=/opt/k8s/work/ca-config.json \
    -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
#分发
cp etcd*.pem /etc/etcd/cert
scp etcd*.pem root@k8s-node-1:/etc/etcd/cert
scp etcd*.pem root@k8s-node-2:/etc/etcd/cert

6)修改etcd.conf配置文件,开放与证书相关的配置,具体如下:

#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://172.24.211.217:2380"
ETCD_LISTEN_CLIENT_URLS="https://172.24.211.217:2379,http://127.0.0.1:2379"
ETCD_NAME="etcd-1"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://172.24.211.217:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://172.24.211.217:2379"
ETCD_INITIAL_CLUSTER="etcd-1=https://172.24.211.217:2380,etcd-2=https://172.24.211.218:2380,etcd-3=https://172.24.211.219:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#注意:最先启动的那台机器STATE设置为new,其他设置为existing
ETCD_INITIAL_CLUSTER_STATE="new"
#[Security]
ETCD_CERT_FILE="/etc/etcd/cert/etcd.pem"
ETCD_KEY_FILE="/etc/etcd/cert/etcd-key.pem"
ETCD_TRUSTED_CA_FILE="/etc/kubernetes/cert/ca.pem"
ETCD_PEER_CERT_FILE="/etc/etcd/cert/etcd.pem"
ETCD_PEER_KEY_FILE="/etc/etcd/cert/etcd-key.pem"
ETCD_PEER_TRUSTED_CA_FILE="/etc/kubernetes/cert/ca.pem"

3.3 启动集群及验证

启动命令:

systemctl daemon-reload && systemctl enable etcd && systemctl restart etcd

检测命令:

systemctl status etcd|grep Active

如果集群正常启动,会显示如下信息:
在这里插入图片描述

3.4 小扩展

添加证书后,节点间的请求都以https形式进行,故每次请求需要带上证书信息,比较麻烦,可以为每台机器的etcdctl配置好环境变量,简化请求参数。

vim /etc/profile.d/etcd.sh
 
export ETCDCTL_CA_FILE=/etc/kubernetes/cert/ca.pem
export ETCDCTL_KEY_FILE=/etc/etcd/cert/etcd-key.pem
export ETCDCTL_CERT_FILE=/etc/etcd/cert/etcd.pem
 
source /etc/profile.d/etcd.sh

完成上面的操作,就可以直接使用下面的命令查看健康状态:

etcdctl cluster-health

参考资料:

[1]. https://github.com/opsnull/follow-me-install-kubernetes-cluster, 和我一步步部署kubernetes集群.
[2]. https://www.jianshu.com/p/33b5f47ababc, etcd多台部署,启用https以及ca自签名.
[3]. https://www.jianshu.com/p/7d1fb03b8925, 利用K8S技术栈打造个人私有云.
[4]. Docker容器与容器云-Docker and kubernetes under the Hood(第二版),浙江大学SEL实验室著.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值