高可用的kubernetes集群安装

一、架构设计

二、集群规划

 
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

posted @   疯狂搬砖  阅读(187)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示