入门

安装kubernetes高可用集群-1.18-CentOS

本文档所需文件均可在以下百度网盘中下载:

系统准备

  • 使用网盘中提供的ISO安装系统(请使用SuperMap提供的CentOS-8.3.2011-x86_64-Minimal.iso文件安装干净的系统)。

    • 网盘路径为:iManager 部署包/软件工具包/OS/OS-ISO/CentOS-8.3.2011-x86_64-Minimal.iso
  • 在安装系统时,除了swap分区外,其他分区的文件系统格式(Format)一律选择ext4类型;要求根(/)分区占据磁盘总量90% 以上。
  • 规格:CPU: 4核+,内存: 8GB+(规格越大性能越好)。

安装包准备

  • 网盘路径:iManager部署包/软件工具包/Kubernetes离线安装包/kubernetes-1.18.20-centos-8.3-deploy.zip

环境准备

  • 针对 Kubernetes 高可用集群,为了保证集群的高可用性,至少准备三台物理机作为 master 节点,每台物理机参考系统准备安装。多个 master 节点组成的 Kubernetes 集群具有更强的容错能力,如果有 N 个 master 节点组成的集群,可以允许 (N-1)/2 个 master 同时失败(断线,硬件错误,磁盘损坏等导致),当 master 节点失败数量大于 (N-1)/2 个,此时整个 Kubernetes 集群都将失败。参照下面表格

    master 节点大小 容错能力
    1 0
    2 0
    3 1
    4 1
    5 2
    6 2
    7 3
    8 3
    9 4

    如表格所示,Kubernetes 高可用集群的 master 数量最好是奇数,偶数数量并不会增加集群容错能力。

  • 准备一个空闲 IP 作为 Kubernetes 集群入口 IP。IP 最好和物理机在同一个网段,并且没有被占用。
  • 暂不支持在阿里云和华为云上部署该环境。

安装 kubernetes master 节点

  • 在本机解压kubernetes-1.18.20-centos-8.3-deploy.zip
  • 将解压后目录里的offline-kubernetes-1.18.20-centos-8.3.tar.gz拷贝到要安装 kubernetes 的机器任意目录,然后根据以下命令操作:

    1. 解压:
    tar ‐zxvf offline-kubernetes-1.18.20-centos-8.3.tar.gz
    1. 进入解压后的目录:
    cd offline-kubernetes-1.18.20-centos-8.3
    1. 编辑.env文件,对 Kubernetes 集群进行设置
    # 必填,当前节点的 hostname,不能和其他 kubernetes 节点相同。不建议包含 "master" 字符串,可选替换 main/control;不建议包含特殊字符“.”
    HOSTNAME=
    # 连接 Kubernetes 集群使用的 ip。如果是高可用集群,CLUSTER_IP 是一个虚拟 ip,也就是前面准备的空闲 ip;如果是单个 master 节点组成的集群,CLUSTER_IP 是该 master 节点的 ip
    CLUSTER_IP=
    # 连接 Kubernetes 集群使用的端口。
    # 如果是高可用集群,CLUSTER_PORT 是 Kubernetes 集群连接的端口,但是不能等于 6443 端口,可以使用 9443 等没有占用的端口
    # 如果是单个 master 节点组成的集群,CLUSTER_PORT 是该 master 节点的暴露的 6443 端口
    CLUSTER_PORT=
    # 是否作为高可用方式初始化/加入 Kubernetes 集群
    HA_ENABLED=true
    # EANBLED_HA=true 时必填,高可用 Kubernetes 集群负载均衡的 master 节点地址,多个地址以逗号分割。e.g. 172.16.120.144,172.16.120.145
    HA_APISERVER_BACKEND=
    # EANBLED_HA=true 时必填,虚拟 IP 在当前物理机上要绑定的网卡名称。网卡需要是可以正常通信的网卡
    HA_NETWORK_CARD=
    # 加入节点时指定当前安装的节点在 Kubernetes 集群中的角色,可选 MASTER,WORKER。不填默认使用 WORKER
    JOIN_ROLE=
    # 加入节点(工作节点和控制节点)时必填,加入节点使用的 token,可在控制节点通过 kubeadm token create 创建,24小时过期
    JOIN_TOKEN=
    # JOIN_ROLE=MASTER 时必填,加入使用的密钥。可通过 kubeadm init phase upload-certs --upload-certs 创建,2小时过期
    JOIN_MASTER_CERT_KEY=
    # master 节点(包括初始化的 master 节点和加入集群的 master 节点)默认是否参与服务调度。默认为 false,即不参与调度;为 true 时参与调度
    # 服务调度:是否允许 Kubernetes 集群上的服务部署到 master 节点。
    #    集群规模大,需要 master 节点管理 node 节点时,不建议参与调度,增加压力。
    #    集群规模小,需要尽可能利用一切物理机资源,master 节点可以参与调度。 
    MASTER_DISPATCH=false

    需要配置的具体参数请参照下面表格

    安装 master 节点 需要配置的参数名称
    HOSTNAME
    CLUSTER_IP
    CLUSTER_PORT
    HA_ENABLED
    HA_ APISERVER_BACKEND
    HA_ NETWORK_CARD
    MASTER_DISPATCH
    1. root 用户下,执行安装脚本:
    chmod +x install.sh && ./install.sh master

注意:

多网卡情况下需要通过参数( ‐‐apiserver‐advertise‐address <ip> )指定 kubernetes 使用哪块网卡。 <ip> 为希望使用的网卡对应的 ip。例如: 指定172.16.16.9所在网卡,使用以下指令:

chmod +x install.sh && ./install.sh master ‐‐apiserver‐advertise‐address 172.16.16.9
  1. 安装完成之后,访问 http:// <ip> :31234 可以看到 kubernetes 的 dashboard 界面 。
  2. 单个 master 节点也可以直接使用,后期随着业务需求增大,可以随时增加 master/node 节点。

加入 kubernetes master 节点

若要加入 kubernetes master 节点,需重新选择一台机器,新的 master 节点不可与其他 master 节点在同一台机器上。集群中每个节点时间应该保持一致。如何同步时间参考 常见问题解答->问题7

  • 在本机解压kubernetes-1.18.20-centos-8.3-deploy.zip
  • 将解压后目录里的offline-kubernetes-1.18.20-centos-8.3.tar.gz拷贝到要安装 kubernetes 的机器任意目录,然后根据以下命令执行操作:

    1. 解压:
    tar ‐zxvf offline-kubernetes-1.18.20-centos-8.3.tar.gz
    1. 进入解压后的目录:
    cd offline-kubernetes-1.18.20-centos-8.3
    1. 参照安装 kubernetes master节点和下表编辑 .env 文件,对 Kubernetes 集群进行设置
加入 master 节点 需要配置的参数名称
HOSTNAME
CLUSTER_IP
CLUSTER_PORT
HA_ENABLED
HA_ APISERVER_BACKEND
HA_ NETWORK_CARD
JOIN_ROLE
JOIN_TOKEN
JOIN_ MASTER_CERT _KEY
MASTER_DISPATCH

注意:

如果当前节点并没有在 .env HA_ APISERVER_BACKEND 中规划,属于后面加入的,那么需要在已经组成集群的每台master节点上执行下面操作:

(1) 在安装目录下,编辑 conf/haproxy.cfg 文件,在最后一行加入

server master-<ip> <ip>:6443 check

<ip> 为当前节点的 ip

例如: server master-172.16.120.146 172.16.120.146:6443 check

(2) 重启容器 docker restart supermap-haproxy

  1. root 用户下,执行安装脚本:
chmod +x install.sh && ./install.sh join

注意:

多网卡情况下可以按照安装master节点时的参数进行指定网卡。

chmod +x install.sh && ./install.sh join --apiserver-advertise-address 172.16.16.10
  1. 加入集群成功后,在当前节点使用下面命令查看:
kubectl get nodes

加入 kubernetes node 节点(可选)

若要安装 kubernetes node 节点,需重新选择一台机器,node 节点不可与 master 节点在同一台机器上。集群中每个节点时间应该保持一致。如何同步时间请参考 常见问题解答->问题7

  • 拷贝offline-kubernetes-1.18.20-centos-8.3.tar.gz到要安装 kubernetes 的机器任意目录,然后根据以下命令操作:

    1. 解压:
    tar ‐zxvf offline-kubernetes-1.18.20-centos-8.3.tar.gz
    1. 进入解压后的目录:
    cd offline-kubernetes-1.18.20-centos-8.3
    1. 参照安装 kubernetes master节点和下表编辑 .env 文件,对 Kubernetes 集群进行设置
    加入 node 节点 需要配置的参数名称
    HOSTNAME
    CLUSTER_IP
    CLUSTER_PORT
    HA_ENABLED
    HA_ APISERVER_BACKEND
    HA_ NETWORK_CARD
    JOIN_TOKEN
    JOIN_ MASTER_CERT _KEY
    1. root 用户下,执行安装脚本:
    chmod +x install.sh && ./install.sh join

    注意:

    多网卡情况下可以按照安装master节点时的参数进行指定网卡。

    chmod +x install.sh && ./install.sh join --apiserver-advertise-address 172.16.16.10
    1. 加入集群成功后,在kubernetes master节点使用下面命令查看:
    kubectl get nodes

常见问题解答

  1. 如果在安装 node 节点时报如下错误,说明 token 过期,需要 master 节点上使用kubeadm token create命令重新创建一个 token 来使用。

    报错信息如下:

    couldn't validate the identify of the API server:abort connection to API server after timeout of 5m0s
  2. 如果 kubernetes node 节点出现故障,需要从 Kubernetes 集群中移除该节点,请在master节点上执行以下命令:

    kubectl delete node <nodeName>

    备注:

    <nodeName> 是即将移除 Kubernetes 集群的节点的名称。

  3. 如果 kubernetes master 节点出现故障,需要从 Kubernetes 集群中移除节点,在任意其他 master 节点上执行以下命令:

    kubectl delete node <nodeName>

    备注:

    <nodeName> 是即将移除 Kubernetes 集群的master节点的名称。

进入 etcd 容器内部,删除被移除的 master 节点上的 etcd 服务

kubectl -n kube-system get pod | grep etcd
# 以实际 etcd 服务名称为准,这里是 etcd-master01
kubectl -n kube-system exec -it etcd-master01 sh

在容器内部输入以下命令,查看存在的 etcd 服务

 etcdctl --endpoints https://127.0.0.1:2379 --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/server.crt --key-file /etc/kubernetes/pki/etcd/server.key member list

输出类似下面

4710f7f5592b46ed: name=master03 peerURLs=https://10.10.130.211:2380 clientURLs=https://10.10.130.211:2379 isLeader=false
b0634635e7aaf095: name=master02 peerURLs=https://10.10.185.16:2380 clientURLs=https://10.10.185.16:2379 isLeader=true
e3eff812e9c03ad9: name=master01 peerURLs=https://10.10.90.97:2380 clientURLs=https://10.10.90.97:2379 isLeader=false

通过 etcd 服务的 id,删除被移除节点的 etcd 服务

etcdctl --endpoints https://127.0.0.1:2379 --ca-file /etc/kubernetes/pki/etcd/ca.crt --cert-file /etc/kubernetes/pki/etcd/server.crt --key-file /etc/kubernetes/pki/etcd/server.key member remove <etcd-id>

<etcd-id> 即为 etcd 服务唯一的 id

移除完成之后,退出 etcd 容器,在其他 kubernetes master 节点上执行下面命令

在安装目录下,编辑 conf/haproxy.cfg 文件,在文件最后删除当前节点负载均衡配置信息,配置信息与下面类似:

server master-<ip> <ip>:6443 check

<ip> 为当前节点的 ip

重启容器:

docker restart supermap-haproxy

前往被移除的 master 节点,清理虚拟 ip 和负载均衡

docker stop supermap-haproxy supermap-keepalived
docker rm supermap-haproxy supermap-keepalived
  1. 移除的节点如何重置,请在节点上执行以下命令:
kubeadm reset
  1. 如果要将移除后的节点再次加入Kubernetes集群,请先在被移除的节点上执行 4 操作,再在加入集群的节点上按照 加入 kubernetes master 节点或者加入 kubernetes node 节点(可选)执行
  2. 如果要卸载 kubernetes,请在各个节点的安装包目录执行以下命令然后重启物理机清理配置:
chmod +x install.sh && ./install.sh down
  1. CentOS 8 自带了 chronyc 作为时间同步工具,要同步时间首先需要一台可以连通的时间服务器。然后按照以下步骤进行:

    (1) 启动 chronyd 服务

    systemctl enable chronyd

    (2) 编辑 /etc/chrony.conf 文件,写入时间服务器地址

    server 172.16.120.139 iburst

    172.16.120.139 替换为实际的时间服务器地址

    (3) 执行命令同步时间

    systemctl start chronyd
    chronyc -a makestep

    如果没有时间服务器,也可以通过 chronyd 将当前机器配置成时间服务器,参考以下步骤:

    (1) 编辑 /etc/chrony.conf,写入以下内容

    allow 172.16.0.0/16 # 设置允许连接到时间服务器的机器的子网,网络
    local stratum 10 # 当 server 中提供的公网 NTP 服务器不可用时,采用本地时间作为同步标准

    (2) 启动 chronyd

    systemctl restart chronyd
    systemctl enable chronyd