参考地址:https://www.cnblogs.com/nf01/articles/15324715.html
https://www.cnblogs.com/linuxws/p/11194403.html
Etcd是一个分布式键值存储系统,Kubernetes使用Etcd进行数据存储,所以先准备一个Etcd数据库,为解决Etcd单点故障,应采用集群方式部署。使用3台组建集群,则可容忍1台机器故障,使用5台组件集群,则可容忍2台机器故障。
可以与K8S的节点机器复用,也可以独立于K8S集群之外部署,只要ApiServer能连接到就可以。
1.从Github中下载Etcd二进制文件
下载地址:https://github.com/etcd-io/etcd/releases/download/v3.5.7/etcd-v3.5.7-linux-amd64.tar.gz
2.创建工作目录并解压二进制包
mkdir -p /opt/etcd/{cfg,data,ssl} tar -zxvf etcd-v3.5.7-linux-amd64.tar.gz mv etcd-v3.5.7-linux-amd64/{etcd,etcdctl,etcdutl} /usr/local/bin
3.生成相关证书【可略】
1.下载证书工具cfssl
cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。
https://github.com/cloudflare/cfssl/releases
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl_1.6.3_linux_amd64 wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssljson_1.6.3_linux_amd64 wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl-certinfo_1.6.3_linux_amd64 chmod +x cfssl_1.6.3_linux_amd64 cfssljson_1.6.3_linux_amd64 cfssl-certinfo_1.6.3_linux_amd64 mv cfssl_1.6.3_linux_amd64 /usr/local/bin/cfssl mv cfssljson_1.6.3_linux_amd64 /usr/local/bin/cfssljson mv cfssl-certinfo_1.6.3_linux_amd64 /usr/local/bin/cfssl-certinfo
2.生成证书
1.配置生成CA证书的请求文件
cat > ca-csr.json << EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Tianjin", "ST": "Tianjin", "O": "k8s", "OU": "System" } ], "ca": { "expiry": "87600h" } } EOF
注:CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
O:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
2.生成CA证书和密钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca #生成CA证书和密钥
3.使用自签CA签发Etcd证书
1.生成证书配置文件(CA 进行签名时需要的配置)
# 生成证书配置文件(CA 进行签名时需要的配置) cat > ca-config.json << EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF # 这个策略,有一个默认的配置,和一个profile,可以设置多个profile,这里的profile是etcd。 # 默认策略,指定了证书的有效期是一年(8760h) # etcd策略,指定了证书的用途 # signing, 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE # server auth:表示 client 可以用该 CA 对 server 提供的证书进行验证 # client auth:表示 server 可以用该 CA 对 client 提供的证书进行验证
2.创建生成服务端证书的请求文件
cat > server-csr.json << EOF { "CN": "server", "hosts": [ "127.0.0.1", "192.168.64.130", "192.168.64.131", "192.168.64.132", "192.168.64.133", "192.168.64.134", "10.10.10.1", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluste.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Tianjin", "ST": "Tianjin", "O": "k8s", "OU": "System" } ] } EOF #上述文件hosts字段中IP为所有etcd节点的集群内部通信ip,一个都不能少!为了方便后期扩容可以多写几个预留的IP。
3.基于之前生成的ca证书生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
4.移动证书到etcd目录
cp ~/TLS/etcd/{ca,server}*pem /opt/etcd/ssl/
4.创建etcd配置文件
cat > /opt/etcd/cfg/etcd.conf.yml << EOF # 这是etcd服务器的配置文件。 # 此成员的名称。 name: 'etcd-1' # 数据目录的路径。 data-dir: /opt/etcd/data # 专用 wal 目录的路径。 wal-dir: # 触发快照到磁盘的已提交事务数。 snapshot-count: 10000 # 心跳间隔的时间(以毫秒为单位)。 heartbeat-interval: 100 # 选举超时的时间(以毫秒为单位)。 election-timeout: 1000 # 当后端大小超过给定配额时发出警报。 0 表示使用默认配额。 quota-backend-bytes: 0 # 用于侦听对等流量的逗号分隔 URL 列表。 listen-peer-urls: http://192.168.64.130:2380 # 用于侦听客户端流量的逗号分隔 URL 列表。 listen-client-urls: http://192.168.64.130:2379,http://127.0.0.1:2379 # 要保留的最大快照文件数(0 为无限制)。 max-snapshots: 5 # 要保留的 wal 文件的最大数量(0 是无限制的)。 max-wals: 5 # 逗号分隔的 CORS(跨源资源共享)来源白名单。 cors: # 该成员的对等 URL 列表,用于向集群的其余部分通告。 # URL 需要是逗号分隔的列表。 initial-advertise-peer-urls: http://192.168.64.130:2380 # 要向公众公布的此成员的客户端 URL 列表。 # URL 需要是逗号分隔的列表。 advertise-client-urls: http://192.168.64.130:2379,http://127.0.0.1:2379 # 用于引导集群的发现 URL。 discovery: # 有效值包括 'exit', 'proxy' discovery-fallback: 'proxy' # 用于发现服务流量的 HTTP 代理。 discovery-proxy: # 用于引导初始集群的 DNS 域。 discovery-srv: # 用于引导的初始集群配置。 initial-cluster: etcd-1=http://192.168.64.130:2380,etcd-2=http://192.168.64.131:2380,etcd-3=http://192.168.64.132:2380 # 引导期间 etcd 集群的初始集群令牌。 initial-cluster-token: 'etcd-cluster' # 初始集群状态 ('new' or 'existing'). initial-cluster-state: 'new' # 拒绝会导致仲裁丢失的重新配置请求。 strict-reconfig-check: false # 通过 HTTP 服务器启用运行时分析数据 enable-pprof: true # 有效值包括 'on', 'readonly', 'off' proxy: 'off' # 端点将保持在失败状态的时间(以毫秒为单位)。 proxy-failure-wait: 5000 # 端点刷新间隔的时间(以毫秒为单位)。 proxy-refresh-interval: 30000 # 拨号超时的时间(以毫秒为单位)。 proxy-dial-timeout: 1000 # 写入超时的时间(以毫秒为单位)。 proxy-write-timeout: 5000 # 读取超时的时间(以毫秒为单位)。 proxy-read-timeout: 0 client-transport-security: # 客户端服务器 TLS 证书文件的路径。 cert-file: /opt/etcd/ssl/server.pem # 客户端服务器 TLS 密钥文件的路径。 key-file: /opt/etcd/ssl/server-key.pem # 启用客户端证书身份验证。 client-cert-auth: true # 客户端服务器 TLS 可信 CA 证书文件的路径。 trusted-ca-file: /opt/etcd/ssl/ca.pem # 使用生成的证书的客户端 TLS auto-tls: false peer-transport-security: # 对等服务器 TLS 证书文件的路径。 cert-file: /opt/etcd/ssl/server.pem # 对等服务器 TLS 密钥文件的路径。 key-file: /opt/etcd/ssl/server-key.pem # 启用对等客户端证书身份验证。 client-cert-auth: true # 对等服务器 TLS 信任的 CA 证书文件的路径。 trusted-ca-file: /opt/etcd/ssl/ca.pem # 使用生成的证书的对等 TLS。 auto-tls: false # 自签名证书的有效期,单位是年。 self-signed-cert-validity: 1 # 为 etcd 启用调试级别的日志记录。 log-level: debug logger: zap # 指定 'stdout' 或 'stderr' 以跳过 journald 日志记录,即使在 systemd 下运行也是如此。 log-outputs: [stderr] # 强制创建一个新的单成员集群。 force-new-cluster: false auto-compaction-mode: periodic auto-compaction-retention: "1" EOF
5.创建etcd.service服务配置文件,使用systemd进行管理
cat > /usr/lib/systemd/system/etcd.service << EOF [Unit] Description=Etcd Server Documentation=https://github.com/etcd-io/etcd After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify WorkingDirectory=/usr/local/bin/ ExecStart=etcd --config-file=/opt/etcd/cfg/etcd.conf.yml Restart=on-failure LimitNOFILE=65536 RestartSec=10s [Install] WantedBy=multi-user.target EOF
6.设置开机自启
systemctl daemon-reload systemctl start etcd.service systemctl enable etcd.service systemctl status etcd.service
标签:版本,证书,ca,etcd3.5,cfssl,集群,etcd,linux,amd64 From: https://www.cnblogs.com/fanqisoft/p/17131338.html