前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes 1.8.6 集群部署–Etcd集群(三)

Kubernetes 1.8.6 集群部署–Etcd集群(三)

作者头像
老七Linux
发布2018-05-31 12:54:58
9700
发布2018-05-31 12:54:58
举报

部署etcd

因为虚拟机有限,我的DELL工作站年龄也不小了,暂时就开三个节点(三个虚机均为2H , 2G),集群也都部署在这三台机器,当然线上的资源充足的话肯定是要和master以及node分开部署的。

在三个节点都安装etcd,下面的操作需要在三个节点都执行一遍

下载etcd安装包
代码语言:javascript
复制
# wget https://github.com/coreos/etcd/releases/download/v3.2.12/etcd-v3.2.12-linux-amd64.tar.gz

# tar -xvf etcd-v3.2.12-linux-amd64.tar.gz

# sudo mv etcd-v3.2.12-linux-amd64/etcd* /usr/local/bin
创建工作目录
代码语言:javascript
复制
sudo mkdir -p /var/lib/etcd
创建systemd unit 文件

当然 在其它两台机器上面的地址需要更改为另外两台机器的IP。

代码语言:javascript
复制
cat > etcd.service << EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
Documentation=https://github.com/coreos

[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
ExecStart=/usr/local/bin/etcd \\
  --name master1 \\         //修改此处
  --cert-file=/etc/kubernetes/ssl/kubernetes.pem \\
  --key-file=/etc/kubernetes/ssl/kubernetes-key.pem \\
  --peer-cert-file=/etc/kubernetes/ssl/kubernetes.pem \\
  --peer-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \\
  --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \\
  --initial-advertise-peer-urls https://192.168.161.161:2380 \\     //此处
  --listen-peer-urls https://192.168.161.161:2380 \\        //此处
  --listen-client-urls https://192.168.161.161:2379,http://127.0.0.1:2379 \\        //此处
  --advertise-client-urls https://192.168.161.161:2379 \\   //此处
  --initial-cluster-token etcd-cluster-0 \\
  --initial-cluster master1=https://192.168.161.161:2380,node02=https://192.168.161.162:2380,node03=https://192.168.161.163:2380 \\        //此处 不要忽略name
  --initial-cluster-state new \\
  --data-dir=/var/lib/etcd
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

如上的IP地址192.168.161.XXX 请逐一替换成你自己服务器的IP。 不要忽略name

下面给出常用配置的参数和它们的解释,方便理解:

代码语言:javascript
复制
--name:方便理解的节点名称,默认为 default,在集群中应该保持唯一,可以使用 hostname
--data-dir:服务运行数据保存的路径,默认为 ${name}.etcd
--snapshot-count:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
--heartbeat-interval:leader 多久发送一次心跳到 followers。默认值是 100ms
--eletion-timeout:重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
--listen-peer-urls:和同伴通信的地址,比如 http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost!
--listen-client-urls:对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和 etcd 交互
--advertise-client-urls:对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
--initial-advertise-peer-urls:该节点同伴监听地址,这个值会告诉集群中其他节点
--initial-cluster:集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
--initial-cluster-state:新建集群的时候,这个值为 new;假如已经存在的集群,这个值为 existing
--initial-cluster-token:创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误

所有以 –init 开头的配置都是在 bootstrap 集群的时候才会用到,后续节点的重启会被忽略。

NOTE:所有的参数也可以通过环境变量进行设置,–my-flag 对应环境变量的 ETCD_MY_FLAG;但是命令行指定的参数会覆盖环境变量对应的值。

代码语言:javascript
复制
# mkdir /var/lib/etcd

指定 etcd 的工作目录为 /var/lib/etcd,数据目录为 /var/lib/etcd,需在启动服务前创建这个目录,否则启动服务的时候会报错“Failed at step CHDIR spawning /usr/bin/etcd: No such file or directory”;

为了保证通信安全,需要指定 etcd 的公私钥(cert-file和key-file)、Peers 通信的公私钥和 CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端的CA证书(trusted-ca-file);

创建 kubernetes.pem 证书时使用的 kubernetes-csr.json 文件的 hosts 字段包含所有 etcd 节点的IP,否则证书校验会出错;

–initial-cluster-state 值为 new 时,–name 的参数值必须位于 –initial-cluster 列表中;

启动 etcd 服务
代码语言:javascript
复制
cp etcd.service /etc/systemd/system/

systemctl daemon-reload

systemctl enable etcd

systemctl start etcd

systemctl status etcd

最先启动的 etcd 进程会卡住一段时间,等待其它节点上的 etcd 进程加入集群,为正常现象。

如上操作请确认一定要在三台机器上面都要执行;(单节点ETCD除外)

验证etcd服务,在任何一个etcd节点执行:

如果不添加密钥参数是会报错的:

代码语言:javascript
复制
[[email protected] ssl]# etcdctl cluster-health
failed to check the health of member 1d6f3edf4016ed5d on https://192.168.161.163:2379: Get https://192.168.161.163:2379/health: x509: certificate signed by unknown authority
member 1d6f3edf4016ed5d is unreachable: [https://192.168.161.163:2379] are all unreachable
failed to check the health of member 3d9715816751f109 on https://192.168.161.162:2379: Get https://192.168.161.162:2379/health: x509: certificate signed by unknown authority
member 3d9715816751f109 is unreachable: [https://192.168.161.162:2379] are all unreachable
failed to check the health of member d5fabdfaee58386c on https://192.168.161.161:2379: Get https://192.168.161.161:2379/health: x509: certificate signed by unknown authority
member d5fabdfaee58386c is unreachable: [https://192.168.161.161:2379] are all unreachable
cluster is unhealthy

1使用密钥方式检查集群状态

代码语言:javascript
复制
[[email protected] ssl]# etcdctl \
    --ca-file=/etc/kubernetes/ssl/ca.pem \
    --cert-file=/etc/kubernetes/ssl/kubernetes.pem \
    --key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
    cluster-health

member 1d6f3edf4016ed5d is healthy: got healthy result from https://192.168.161.163:2379
member 3d9715816751f109 is healthy: got healthy result from https://192.168.161.162:2379
member d5fabdfaee58386c is healthy: got healthy result from https://192.168.161.161:2379
cluster is healthy

部署 Flannel

在三个节点都安装Flannel,下面的操作需要在三个节点都执行一遍

下载安装Flannel

代码语言:javascript
复制
# wget https://github.com/coreos/flannel/releases/download/v0.9.1/flannel-v0.9.1-linux-amd64.tar.gz

# mkdir flannel

# tar -xzvf flannel-v0.9.1-linux-amd64.tar.gz -C flannel

# sudo cp flannel/{flanneld,mk-docker-opts.sh} /usr/local/bin

向 etcd 写入网段信息,这两个命令只需要任意一个节点上执行一次就可以

代码语言:javascript
复制
mkdir -p /kubernetes/network/config

etcdctl --endpoints=https://192.168.161.161:2379,https://192.168.161.162:2379,https://192.168.161.163:2379 \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
set /kubernetes/network/config '{"Network":"172.30.0.0/16","SubnetLen":24,"Backend":{"Type":"vxlan"}}'

注意如上更换成自己的IP

创建systemd unit 文件 在三台机器上面都需要执行

代码语言:javascript
复制
cat > flanneld.service << EOF
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service

[Service]
Type=notify
ExecStart=/usr/local/bin/flanneld \\
  -etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
  -etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem \\
  -etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem \\
  -etcd-endpoints=https://192.168.161.161:2379,https://192.168.161.162:2379,https://192.168.161.163:2379 \\
  -etcd-prefix=/kubernetes/network
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure

[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
EOF

mk-docker-opts.sh 脚本将分配给 flanneld 的 Pod 子网网段信息写入到 /run/flannel/docker 文件中,后续 docker 启动时使用这个文件中参数值设置 docker0 网桥;

flanneld 使用系统缺省路由所在的接口和其它节点通信,对于有多个网络接口的机器(如,内网和公网),可以用 -iface=enpxx 选项值指定通信接口;

启动Flannel
代码语言:javascript
复制
mv flanneld.service /etc/systemd/system/

systemctl daemon-reload

systemctl enable flanneld

systemctl start flanneld

systemctl status flanneld
检查flannel服务状态
代码语言:javascript
复制
[[email protected] ~]# /usr/local/bin/etcdctl  --endpoints=https://192.168.161.161:2379,https://192.168.161.162:2379,https://192.168.161.163:2379  --ca-file=/etc/kubernetes/ssl/ca.pem  --cert-file=/etc/kubernetes/ssl/kubernetes.pem  --key-file=/etc/kubernetes/ssl/kubernetes-key.pem  ls /kubernetes/network/subnets

/kubernetes/network/subnets/172.30.78.0-24
/kubernetes/network/subnets/172.30.101.0-24
/kubernetes/network/subnets/172.30.41.0-24

由此可以看出,如上三个节点pod的网段!

部署Flannel网络,kubernetes要求集群内各节点能通过Pod网段互联互通:

代码语言:javascript
复制
$ ping 172.30.78.1
$ ping 172.30.101.1
$ ping 172.30.41.1
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/03/19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 部署etcd
    • 下载etcd安装包
      • 创建工作目录
      • 创建systemd unit 文件
    • 启动 etcd 服务
      • 验证etcd服务,在任何一个etcd节点执行:
  • 部署 Flannel
    • 启动Flannel
      • 检查flannel服务状态
      相关产品与服务
      容器镜像服务
      容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档