五.部署高可用etcd集群

etcd是key-value存储(同zookeeper),在整个kubernetes集群中处于中心数据库地位,以集群的方式部署,可有效避免单点故障。

这里采用静态配置的方式部署(另也可通过etcd提供的rest api在运行时动态添加,修改或删除集群成员)。

以kubenode1为例,kubenode2&kubenode3做适当小调整。

1. 下载

[root@kubenode1 ~]# cd /usr/local/src/
[root@kubenode1 src]# wget https://github.com/coreos/etcd/releases/download/v3.3.0/etcd-v3.3.0-linux-amd64.tar.gz
[root@kubenode1 src]# tar -zxvf etcd-v3.3.0-linux-amd64.tar.gz # 解压目录整体拷贝并更名,可执行文件在解压目录中
[root@kubenode1 src]# mv etcd-v3.3.0-linux-amd64/ /usr/local/etcd

2. 创建etcd TLS证书与私钥

客户端(etcdctl)与etcd集群,etcd集群之间通信采用TLS加密。

1)创建etcd证书签名请求

[root@kubenode1 ~]# mkdir -p /etc/kubernetes/etcdssl
[root@kubenode1 ~]# cd /etc/kubernetes/etcdssl/
[root@kubenode1 etcdssl]# touch etcd-csr.json # hosts字段指定使用该证书的ip或域名列表,这里指定了所有节点ip,生成的证书可被etcd集群各节点使用,kubenode2&kubenode3节点可不用生成证书,由kubenode1直接分发即可
[root@kubenode1 etcdssl]# vim etcd-csr.json
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"172.30.200.21",
"172.30.200.22",
"172.30.200.23"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "ChengDu",
"L": "ChengDu",
"O": "k8s",
"OU": "cloudteam"
}
]
}

2)生成etcd证书与私钥

# 指定相应的ca证书,秘钥,签名文件等
[root@kubenode1 etcdssl]# cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \
-ca-key=/etc/kubernetes/ssl/ca-key.pem \
-config=/etc/kubernetes/ssl/ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd

# 分发etcd.pem,etcd-key.pem,另有ca.pem(前面已分发)
[root@kubenode1 etcdssl]# scp etcd.pem etcd-key.pem root@172.30.200.22:/etc/kubernetes/etcdssl/
[root@kubenode1 etcdssl]# scp etcd.pem etcd-key.pem root@172.30.200.23:/etc/kubernetes/etcdssl/

3. 设置iptables

[root@kubenode1 ~]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2379 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2380 -j ACCEPT [root@kubenode1 ~]# service iptables restart

4. 配置etcd的systemd unit文件

# 创建工作目录
[root@kubenode1 ~]# mkdir -p /var/lib/etcd # WorkingDirectory:指定工作/数据目录为上面创建的目录;
# EnvironmentFile:这里将etcd的启动参数放在unit文件之外,方便修改后不用重载;
# ExecStart:启动文件位置,并带上指定参数的变量
[root@kubenode1 ~]# touch /usr/lib/systemd/system/etcd.service
[root@kubenode1 ~]# vim /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
Documentation=https://github.com/coreos
After=network.target
After=network-online.target
Wants=network-online.target [Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=/usr/local/etcd/etcd.conf
ExecStart=/usr/local/etcd/etcd $ETCD_ARGS
Restart=on-failure
RestartSec=5
LimitNOFILE=65536 [Install]
WantedBy=multi-user.target # ETCD_ARGS:对应systemd unit文件中ExecStart后的变量;
# --cert-file,--key-file:分别指定etcd的公钥证书和私钥;
# --peer-cert-file,--peer-key-file:分别指定etcd的peers通信的公钥证书和私钥;
# --trusted-ca-file:指定客户端的CA证书;
# --peer-trusted-ca-file:指定peers的CA证书;
# --initial-cluster-state=new:表示这是新初始化集群,--name指定的参数值必须在--initial-cluster中
[root@kubenode1 ~]# touch /usr/local/etcd/etcd.conf
[root@kubenode1 ~]# vim /usr/local/etcd/etcd.conf
ETCD_ARGS="--name=kubenode1 \
--cert-file=/etc/kubernetes/etcdssl/etcd.pem \
--key-file=/etc/kubernetes/etcdssl/etcd-key.pem \
--peer-cert-file=/etc/kubernetes/etcdssl/etcd.pem \
--peer-key-file=/etc/kubernetes/etcdssl/etcd-key.pem \
--trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \
--initial-advertise-peer-urls=https://172.30.200.21:2380 \
--listen-peer-urls=https://172.30.200.21:2380 \
--listen-client-urls=https://172.30.200.21:2379,http://127.0.0.1:2379 \
--advertise-client-urls=https://172.30.200.21:2379 \
--initial-cluster-token=etcd-cluster-1 \
--initial-cluster=kubenode1=https://172.30.200.21:2380,kubenode2=https://172.30.200.22:2380,kubenode3=https://172.30.200.23:2380 \
--initial-cluster-state=new \
--data-dir=/var/lib/etcd"

5. 启动etcd

# 第一个启动的etcd进程会卡顿,等待其他etcd节点启动进程加入集群;
# 如果等待超时,则第一个etcd节点进程启动会失败
[root@kubenode1 ~]# systemctl daemon-reload
[root@kubenode1 ~]# systemctl enable etcd.service
[root@kubenode1 ~]# systemctl restart etcd.service

6. 验证

# 查看member list;
# ETCDCTL_API=3:api版本;
# 通信采用TLS加密,客户端访问时间需要指定对应公钥&私钥
[root@kubenode1 ~]# ETCDCTL_API=3 etcdctl \
--endpoints=https://172.30.200.21:2379 \
--cacert=/etc/kubernetes/ssl/ca.pem \
--cert=/etc/kubernetes/etcdssl/etcd.pem \
--key=/etc/kubernetes/etcdssl/etcd-key.pem \
member list

# 查看节点健康状态
[root@kubenode1 ~]# export NODE_IPS="172.30.200.21 172.30.200.22 172.30.200.23"
[root@kubenode1 ~]# for ip in ${NODE_IPS}; do
ETCDCTL_API=3 etcdctl \
--endpoints=https://${ip}:2379 \
--cacert=/etc/kubernetes/ssl/ca.pem \
--cert=/etc/kubernetes/etcdssl/etcd.pem \
--key=/etc/kubernetes/etcdssl/etcd-key.pem \
endpoint health; done

高可用Kubernetes集群-3. etcd高可用集群的更多相关文章

  1. 基于saltstack自动化部署高可用kubernetes集群

    SaltStack自动化部署HA-Kubernetes 本项目在GitHub上,会不定期更新,大家也可以提交ISSUE,地址为:https://github.com/skymyyang/salt-k8 ...

  2. 高可用Kubernetes集群-16. ansible快速部署

    说明 本文档指导采用二进制包的方式快速部署高可用kubernetes集群. 脚本托管:k8s-ansible(持续更新) 参考:高可用kubernetes集群 组件版本 组件 版本 备注 centos ...

  3. 高可用Kubernetes集群-1. 集群环境

    参考文档: 部署kubernetes集群1:https://github.com/opsnull/follow-me-install-kubernetes-cluster 部署kubernetes集群 ...

  4. 高可用Kubernetes集群原理介绍

    ■ 文/ 天云软件 云平台开发工程师 张伟 1. 背景 Kubernetes作为容器应用的管理中心,对集群内部所有容器的生命周期进行管理,结合自身的健康检查及错误恢复机制,实现了集群内部应用层的高可用 ...

  5. 搭建高可用kubernetes集群(keepalived+haproxy)

    序 由于单master节点的kubernetes集群,存在master节点异常之后无法继续使用的缺陷.本文参考网管流程搭建一套多master节点负载均衡的kubernetes集群.官网给出了两种拓扑结 ...

  6. 使用Kubeadm搭建高可用Kubernetes集群

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...

  7. K8S 使用Kubeadm搭建高可用Kubernetes(K8S)集群 - 证书有效期100年

    1.概述 Kubenetes集群的控制平面节点(即Master节点)由数据库服务(Etcd)+其他组件服务(Apiserver.Controller-manager.Scheduler...)组成. ...

  8. 基于Containerd安装部署高可用Kubernetes集群

    转载自:https://blog.weiyigeek.top/2021/7-30-623.html 简述 Kubernetes(后续简称k8s)是 Google(2014年6月) 开源的一个容器编排引 ...

  9. hype-v上centos7部署高可用kubernetes集群实践

    概述 在上一篇中已经实践了 非高可用的bubernetes集群的实践 普通的k8s集群当work node 故障时是高可用的,但是master node故障时将会发生灾难,因为k8s api serv ...

随机推荐

  1. docker搭建本地私仓

    环境centos7  docker-ce 18 启动仓库镜像 docker run -d -p 5000:5000 registry:2 docker images 通过docker tag 标识镜像 ...

  2. Java中的IO流(五)

    上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...

  3. 2019年,iOS开发的你不可或缺的进阶之路!

    序言 我相信很多人都在说,iOS行业不好了,iOS现在行情越来越难了,失业的人比找工作的人还要多.失业即相当于转行,跳槽即相当于降低自己的身价.那么做iOS开发的你,你是否在时刻准备着跳槽或者转行了. ...

  4. Token ,Cookie和Session的区别

    在做接口测试时,经常会碰到请求参数为token的类型,但是可能大部分测试人员对token,cookie,session的区别还是一知半解. Cookie cookie 是一个非常具体的东西,指的就是浏 ...

  5. Java调用WeChat's API总结

    微信公众号结合着内置浏览器,有着普通浏览器无法完成的服务,前者可以获取浏览页面的微信用户的信息,从而根据信息为用户提供基于微信的更多服务:而后者仅仅能够浏览页面,通过用户的输入信息与用户互动. 本人根 ...

  6. JDK1.8降到1.7技巧

    前言: 最近部署一个产品,该产品不支持JDK1.8,碰巧我的机器安装的是1.8,这就需要降到1.7才能部署启动成功.那么我也是不赞成卸载1.8来安装1.7,因为很多时候可能需要1.8和1.7来回切换. ...

  7. golang总结-Redis整合

    目录 1. 基本用法 2. Redis连接池 go get github.com/gomodule/redigo/redis 1. 基本用法 获取连接 package conn import ( &q ...

  8. less.js插件监听

    <script>less.watch();</script> 在不手动刷新/重新加载页面会自动监听less的变化,页面做出相应的变化 . 写在这两行后面就好 了 <lin ...

  9. 大数据:Windows下配置flink的Stream

    对于开发人员来说,最希望的是需要在windows中进行测试,然后把调试好的程序放在集群中运行.下面写一个Socket,上面是监控本地的一个运行端口,来实时的提取数据.获取视频中文档资料及完整视频的伙伴 ...

  10. ruby on rails 环境搭建(mac or ubuntu)

    环境配置前操作 mac: app_store安装x-code ubuntu: 终端->配置文件->首选项->命令->以shell方式登录 安装RVM mac: $ ruby - ...