设为首页 收藏本站
查看: 2532|回复: 1

[经验分享] 配置安全证书的Etcd集群

[复制链接]
发表于 2018-1-5 16:39:46 | 显示全部楼层 |阅读模式
  不知在哪篇技术文档中看到,kubernetes master和etcd分开部署模式,因为集群的状态都保存在etcd中,这样当kubernetes master挂掉后,通过API Server交互的Scale等功能无法使用外,其他已经部署的Pod仍然能继续工作。
  基于这种考虑,通过yum以及修改etcd.conf方式部署了一个三节点的etcd集群,但对于企业使用而言,虽然在局域网内访问,多数情况下还是需要配置安全证书,就好像很多政府部门因为三级等保的要求必须在weblogic中配置ssl一样,自己尝试在之前的环境中通过修改conf文件下配置,启动时遭遇各种问题失败,但同样的证书后修改为命令行方式配置后以及手工安装etcd后部署成功。记录如下:


  • 安装cfssl
  

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64  
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64
  
mv cfssl_linux-amd64 /usr/local/bin/cfssl
  
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  



  • 创建CA
  

# mkdir /root/ssl  
# cd
/root/ssl  
# cfssl print
-defaults config > ca-config.json  
# cfssl print
-defaults csr > ca-csr.json  

  修改ca-config.json
  

[iyunv@etc0 ssl]# cat ca-config.json  
{
"signing": {"default": {"expiry": "8760h"  },
"profiles": {"kubernetes": {"expiry": "8760h","usages": ["signing","key encipherment","server auth","client auth"  ]
  }
  }
  }
  
}
  

  server auth表示client可以用该ca对server提供的证书进行验证
  client auth表示server可以用该ca对client提供的证书进行验证
  创建证书签名请求
  

[iyunv@etc0 ssl]# cat ca-csr.json  
{
"CN": "kubernetes","key": {"algo": "rsa","size": 2048  },
"names": [  {
"C": "US","L": "CA","ST": "San Francisco","O": "k8s","OU": "System"  }
  ]
  
}
  

  生成CA证书和私钥
  

# cfssl gencert -initca ca-csr.json | cfssljson -bare ca  
# ls ca
*  
ca
-config.json ca.csr ca-csr.json ca-key.pem ca.pem  



  • 创建kubernetes证书
  

[iyunv@etc0 ssl]# cat kubernetes-csr.json  
{
"CN": "kubernetes","hosts": ["127.0.0.1","192.168.0.102","192.168.0.103","192.168.0.104","192.168.0.105","192.168.0.106","10.254.0.1","kubernetes","kubernetes.default","kubernetes.default.svc","kubernetes.default.svc.cluster","kubernetes.default.svc.cluster.local"  ],
"key": {"algo": "rsa","size": 2048  },
"names": [  {
"C": "CN","ST": "BeiJing","L": "BeiJing","O": "k8s","OU": "System"  }
  ]
  
}
  

  可以看到该证书把etcd集群的所有ip,kubernetes master的所有ip以及kubernetes服务的ip(10.254.0.1)都加入进去了,这样他们都能使用同一个密钥
  生成Kubernetes证书和密钥
  

# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes  
# ls kuberntes
*  
kubernetes.csr kubernetes
-csr.json kubernetes-key.pem kubernetes.pem  



  • 分发证书文件
  在每台etcd机器中运行
  

# mkdir -p /etc/kubernetes/ssl  
# cp
*.pem /etc/kubernetes/ssl  

  etcd集群配置
  在/etc/hosts文件中加入地址
  

[iyunv@etc0 ssl]# cat /etc/hosts  

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4  
::
1         localhost localhost.localdomain localhost6 localhost6.localdomain6  

192.168.0.102   etc0  

192.168.0.103   etc1  

192.168.0.104   etc2  



  • 手工下载和安装etcd
  访问https://github.com/coreos/etcd/releases,我下载的是3.2.9版本
  https://github.com/coreos/etcd/releases/download/v3.2.9/etcd-v3.2.9-linux-amd64.tar.gz
  在每台机器上运行
  

tar -xvf etcd-v3.2.9-linux-amd64.tar.gz  
mv etcd
-v3.2.9-linux-amd64/etcd* /root/local/bin  

  
mkdir
-p /var/lib/etcd  

  建立一个etcd.service文件,内容如下(针对不同的etcd节点需要修改ip地址和name)
  

[iyunv@etc0 ssl]# cat /etc/systemd/system/etcd.service  
[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/
  
EnvironmentFile=-/etc/etcd/etcd.conf
  
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /root/local/bin/etcd --name=etc0 --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.0.102:2380 --listen-peer-urls=https://192.168.0.102:2380 --listen-client-urls=https://192.168.0.102:2379,https://127.0.0.1:2379 --advertise-client-urls=https://192.168.0.102:2379 --initial-cluster-token=etcd-cluster-0 --initial-cluster=\"etc0=https://192.168.0.102:2380,etc1=https://192.168.0.103:2380,etc2=https://192.168.0.104:2380\" --initial-cluster-state=new --data-dir=/var/lib/etcd"
  
Restart=on-failure
  
RestartSec=5
  
LimitNOFILE=65536
  

  
[Install]
  
WantedBy=multi-user.target
  

  在每台etcd节点上启动etcd服务
  

# mv etcd.service /etc/systemd/system/  
# systemctl daemon
-reload  
# systemctl enable etcd
  
# systemctl start etcd
  
# systemctl status etcd
  

  

[iyunv@etc1 bin]# systemctl status etcd  
● etcd.service
- Etcd Server  Loaded: loaded (
/etc/systemd/system/etcd.service; disabled; vendor preset: disabled)  Active: active (running) since Thu
2017-10-19 18:21:28 CST; 1h 20min ago  Docs: https:
//github.com/coreos  Main PID: 9178 (etcd)
  CGroup: /system.slice/etcd.service
  └─9178 /root/local/bin/etcd --name=etc1 --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem...
  

  
Oct 19 18:22:19 etc1 etcd[9178]: lost the TCP streaming connection with peer 70df68d0b37fcd43 (stream MsgApp v2 reader)
  
Oct 19 18:22:20 etc1 etcd[9178]: failed to dial 70df68d0b37fcd43 on stream Message (dial tcp 192.168.0.104:2380: getsockopt: connection refused)
  
Oct 19 18:22:20 etc1 etcd[9178]: peer 70df68d0b37fcd43 became inactive
  
Oct 19 18:22:21 etc1 etcd[9178]: peer 70df68d0b37fcd43 became active
  
Oct 19 18:22:21 etc1 etcd[9178]: closed an existing TCP streaming connection with peer 70df68d0b37fcd43 (stream MsgApp v2 writer)
  
Oct 19 18:22:21 etc1 etcd[9178]: established a TCP streaming connection with peer 70df68d0b37fcd43 (stream MsgApp v2 writer)
  
Oct 19 18:22:21 etc1 etcd[9178]: closed an existing TCP streaming connection with peer 70df68d0b37fcd43 (stream Message writer)
  
Oct 19 18:22:21 etc1 etcd[9178]: established a TCP streaming connection with peer 70df68d0b37fcd43 (stream Message writer)
  
Oct 19 18:22:21 etc1 etcd[9178]: established a TCP streaming connection with peer 70df68d0b37fcd43 (stream Message reader)
  
Oct 19 18:22:21 etc1 etcd[9178]: established a TCP streaming connection with peer 70df68d0b37fcd43 (stream MsgApp v2 reader)
  

  如果出现任何错误,可以通过journalctl -xe去看到启动详情。


  • 验证服务
  

[iyunv@etc1 bin]# ./etcdctl --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem --endpoints=https://192.168.0.102:2379,https://192.168.0.103:2379,https://192.168.0.104:2379 cluster-health  
member 4701789a3a673ef5 is healthy: got healthy result from https://192.168.0.103:2379
  
member 70df68d0b37fcd43 is healthy: got healthy result from https://192.168.0.104:2379
  
member 90262c9df511cc4d is healthy: got healthy result from https://192.168.0.102:2379
  
cluster is healthy
  

  如果不带证书访问,报错信息为
  

[iyunv@etc1 bin]# ./etcdctl  --endpoints=https://192.168.0.102:2379,https://192.168.0.103:2379,https://192.168.0.104:2379 cluster-health  
cluster may be unhealthy: failed to list members
  
Error:  client: etcd cluster is unavailable or misconfigured; error #0: x509: certificate signed by unknown authority
  
; error #1: x509: certificate signed by unknown authority
  
; error #2: x509: certificate signed by unknown authority
  

  
error #0: x509: certificate signed by unknown authority
  
error #1: x509: certificate signed by unknown authority
  
error #2: x509: certificate signed by unknown authority
  



  • 目前的问题是:
  为什么通过手工方式修改conf文件不成?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431946-1-1.html 上篇帖子: Dock的生态开源技术(Etcd&Machine&Compose&Swarm&Mesos&Kubernetes) 下篇帖子: etcd集群部署
累计签到:464 天
连续签到:5 天
发表于 2019-1-28 08:29:09 | 显示全部楼层
学习,感谢分享

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表