一、架构设计
二、集群规划
IP | 集群角色 | 描述 | |
---|---|---|---|
1 | 10.10.0.115 | keepalived 虚拟IP | 虚拟IP, 对10.10.0.15、10.10.0.29做keep alived |
1 | 10.10.0.15 | master、etcd、haproxy、keepalived真实ip | |
2 | 10.10.0.29 | master、etcd、keepalived真实ip | |
3 | 10.10.0.34 | master、etcd |
三、具体方案实现描述
选取三台机器: 10.10.0.15, 10.10.0.29, 10.10.0.34,分别位于机房不同的机架上,这三台机器用于部署 kubernetes 的master。
为了实现高可用,使用 keepalived 作为HA主从切换, keepalived VRRP ip: 10.10.0.115, 真实IP: 10.10.0.15,(主), 10.10.0.29(备)
使用 haproxy 做负载均衡, haproxy 绑定到10.10.0.115:8443, 由并负载均衡到 10.10.0.15:6443, 10.10.0.29:6443, 10.10.0.34:6443。
四、etcd集群安装
参考:ETCD集群安装
五、安装keepalived
注意: virtual_router_id 一定要唯一。而且 vip 10.10.0.115 不要跟同网段上的ip冲突。
在10.10.0.29 上同样配置 /etc/keepalived/keepalived.conf , 修改响应的配置, unicast_src_ip与unicast_peer交换。 注意 为了让 10.10.0.15作为主,需要降低 10.10.0.29 的priority ,即比 10.10.0.15 中的 100 要少。
六、haproxy安装
参数解析:
- bind 绑定到 虚 IP 10.10.0.15,端口为 8443
- haproxy做负载均衡,把来自 请求10.10.0.115:8443 的流量转发到 10.10.0.15:6443,10.10.0.29, 10.10.0.34 三台master的api server
七、kubernetes 集群安装
1、前面工作
参考 使用kubeadm在centos 7.2上安装kubernetes v1.15.0
做到 kubeadm init 以前的步骤。
2、使用配置文件安装第一个master
用前面单master集群安装不同的是,我们用 kubeadm init --config kubeadm-config.yaml --upload-certs 指定配置文件来安装,其kubeadm-config.yaml的内容如下:
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups :
- system : bootstrappers : kubeadm : default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.10.0.15
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: yizhuang-10-10-0-15
taints:
- effect : NoSchedule
key: node-role.kubernetes.io/master
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: stable
# controlPlaneEndpoint 用keepalived 生成的虚ip
controlPlaneEndpoint: "10.10.0.115:8443"
etcd:
external:
endpoints:
- https : //10 .10.0.15: 2379
- https : //10 .10.0.29: 2379
- https : //10 .10.0.34: 2379
caFile: /etc/kubernetes/pki/etcd/ca.pem
certFile: /etc/kubernetes/pki/etcd/client.pem
keyFile: /etc/kubernetes/pki/etcd/client-key.pem
|
配置文件解析:
-
controlPlaneEndpoint:使用了虚IP:10.10.0.115, 且假定其端口为 8443
- 外部etcd 配置为 10.10.0.15, 10.10.0.29, 10.10.0.34,用client auth 证书,用于访问etcd 集群
- 注意:nodeRegistration中name应该为机器的hostname
-
在InitConfiguration 中指定 advertiseAddress 为第一个 master 节点 10.10.0.15
执行命令行:
kubeadm init --config=kubeadm-config.yaml --upload-certs
执行成功后,可得到以下信息:
kubeadm join 10.10.0.115:8443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:3c67b2dad479675486b2580022eb11f39be932405b4de6d338a6eb268d24e59c \
--control-plane --certificate-key 71f80e4fffc2a3b7d2e6117f03ecfee26207d7022d85fac95fb6946b8de387a0 --apiserver-advertise-address 10.10.0.115
kubeadm join 10.10.0.115:8443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:3c67b2dad479675486b2580022eb11f39be932405b4de6d338a6eb268d24e59c --apiserver-advertise-address 10.10.0.115
恭喜客户端第一个master 节点安装成功了
3、join 另外两个master
在另外两个master 分别安装 dokcer, kubeadm, kubectl ,kubelet, 然后执行 kubeadm join
kubeadm join 10.10.0.115:8443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert- hash sha256:3c67b2dad479675486b2580022eb11f39be932405b4de6d338a6eb268d24e59c \
--control-plane --certificate-key 71f80e4fffc2a3b7d2e6117f03ecfee26207d7022d85fac95fb6946b8de387a0 --apiserver-advertise-address 10.10.0.115
|
参数解析
- --control-plane 参数, 表明加入集群的是 master 节点,
- --certificate-key 71f80e4fffc2a3b7d2e6117f03ecfee26207d7022d85fac95fb6946b8de387a0 参数与之前的 --upload-certs参数对应, 用于自动把第一个master生成的证书上传到 join节点
-
--apiserver-advertise-address, 指定为 init 中的 controlPlaneEndpoint 中的虚ip. 注意,千万不要把apiserver-advertise-address 设置为第1个 master
4、join 其他的node节点
在其他节点 分别安装 dokcer, kubeadm, kubectl ,kubelet, 然后执行 kubeadm join
kubeadm join 10.10.0.115:8443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert- hash sha256:3c67b2dad479675486b2580022eb11f39be932405b4de6d338a6eb268d24e59c --apiserver-advertise-address 10.10.0.115
|
参数解析:
- 与master 不同的是没有,join node 节点时不需要 指定 --control-plane --certificate-key
5、网络安装
- 准备calica-etcd.yaml, 可以从官方下载
curl https://docs.projectcalico.org/v3.10/manifests/calico-etcd.yaml -o calico.yaml
-
修改ConfigMap对象 中的 endPoints, etcd_ca, etcd_cert, etcd_key
其中 etcd_endpoints的value修改为: "https://10.10.0.15:2379,https://10.10.0.29:2379,https://10.10.0.34:2379"etcd_cert的value修改为 "/calico-secrets/etcd-cert"
etcd_key的value修改为"/calico-secrets/etcd-key"etcd_ca的value修改为"/calico-secrets/etcd-ca"
- 修改Secret对象
首先,把 etcd-key, etcd-cert, etcd-ca 等配置的注释去掉
分别用 cat /etc/etcd/certs/client-key.pem | base64 -w 0, cat /etc/etcd/certs/client.pem | base64 -w 0, cat /etc/etcd/certs/ca.pem | base64 -w 0 生成三个字符串,并分别作为 etcd-key, etcd-cert, etcd-c的值 -
修改Daemonset 对象,
关闭CALICO_IPV4POOL_IPIP,把"always"修改为“off” ,实质是打开 bgp
设定IP池,
如果有多个网卡,指定网卡
-
执行 kubectl create -f calico.yaml
-
配置calico节点
参考 calico bgp安装与配置
八、踩过的坑
1、 如果直接参考 k8s 的官方文档,用 kubeadm init --config kuebadm-config.yaml --upload-certs 安装,会提示
W1229 10:09:01.789627 63389 common.go:140] WARNING: could not obtain a bind address for the API Server: no default routes found in "/proc/net/route" or "/proc/net/ipv6_route"; using: 0.0.0.0
W1229 10:09:03.790859 63389 version.go:98] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable.txt": Get https://dl.k8s.io/release/stable.txt: dial tcp 35.201.71.162:443: connect: network is unreachable
W1229 10:09:03.790936 63389 version.go:99] falling back to the local client version: v1.15.4
cannot use "0.0.0.0" as the bind address for the API Server
解决办法:从错误提示上看说是无法把api server 绑定到0.0.0.0,需要指定api server 的地址。 用新的配置文件,在 kubeadm-config.yaml 中添加 InitConfiguration, 在InitConfiguration 中会指定advertiseAddress. 详细参考本文的 使用配置文件 安装 k8s 集群。
2、etcd 证书
kubernetes 集群的各个节点证书之前使用了 peer 的证书,这里会存在问题,因为peer 是需要host 授权的,在做证书的时候就已经确定host了,如果集群节点没有在host列表中,认证就会失败。所以,集群节点不能用peer证书,只能用client证书。
3、hostname
4 、join时 --apiserver-advertise-address 参数必须为: 10.10.0.115
5、calico.yaml, 当 calico 的版本设置为 v3.10.1时, 要修改 livenessProbe, readinessProbe 中的命令行 ,去掉 - -bird-ready
6、启动haproxy失败,错误信息:
haproxy Starting proxy https-apiserver: cannot bind socket
解决办法:
vi /etc/sysctl .conf #修改内核参数
net.ipv4.ip_nonlocal_bind = 1 #没有就新增此条记录
sysctl -p #保存结果,使结果生效
|
附录、参考文档
1、https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/clustering.md (etcd集群安装)
2、https://github.com/coreos/docs/blob/master/os/generate-self-signed-certificates.md (https证书生成)
3、https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/ (k8s官方高可用文档)
4、https://blog.51cto.com/billy98/2350660 (kubeadm安装kubernetes 1.13.2多master高可用集群)
5、Haproxy启动故障:Starting proxy:cannot bind socket
标签:0.115,kubernetes,--,集群,etcd,master,10.10,kubeadm,安装 From: https://www.cnblogs.com/tz2011/p/17215650.html