5.2. Master 主机任务


5.2.1. 弃用 master 主机

弃用 master 主机会从 OpenShift Container Platform 环境中删除它。

弃用或缩减 master 主机的原因包括硬件需要重新调整大小,或替换底层基础架构。

高可用性 OpenShift Container Platform 环境需要至少三个 master 主机和三个 etcd 节点。通常,master 主机与 etcd 服务在一起。如果您弃用了 master 主机,您也从该主机中删除 etcd 静态 pod。

重要

由于在这些服务间发生的投票机制,请确保始终以奇数数字部署 master 和 etcd 服务。

5.2.1.1. 创建 master 主机备份

在对 OpenShift Container Platform 基础架构进行任何更改之前执行此备份过程,如系统更新、升级或其他显著修改。定期备份数据,以确保在出错时有最新的数据可用。

OpenShift Container Platform 文件

主(master)实例运行重要的服务,如 API 和控制器。/etc/origin/master 目录存储很多重要文件:

  • 配置、API、控制器、服务等
  • 安装生成的证书
  • 所有与云供应商相关的配置
  • 密钥及其他身份验证文件,例如,如果使用 htpasswd 时为 htpasswd
  • 更多

您可以自定义 OpenShift Container Platform 服务,如增加日志级别或使用代理。配置文件存储在 /etc/sysconfig 目录中。

因为 master 也是节点,所以备份整个 /etc/origin 目录。

流程
重要

您必须在每个 master 节点上执行以下步骤。

  1. 创建 pod 定义备份(在)。.
  2. 创建 master 主机配置文件的备份:

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo mkdir -p ${MYBACKUPDIR}/etc/sysconfig
    $ sudo cp -aR /etc/origin ${MYBACKUPDIR}/etc
    $ sudo cp -aR /etc/sysconfig/ ${MYBACKUPDIR}/etc/sysconfig/
    注意

    master 配置文件为/etc/origin/master/master-config.yaml。

    警告

    /etc/origin/master/ca.serial.txt 文件仅对 Ansible 主机清单中列出的第一个 master 生成。如果您弃用了第一个 master 主机,请在进程前将 /etc/origin/master/ca.serial.txt 文件复制到其余 master 主机中。

    重要

    在运行多个 master 的 OpenShift Container Platform 3.11 集群中,其中一个 master 节点在 /etc/origin/master/etc/etcd/ca/etc/etcd/generated_certs 中包括额外的 CA 证书。这些是应用程序节点和 etcd 节点扩展操作所必需的,且需要在另一个 master 节点上恢复,它应该永久不可用。这些目录默认包含在此处的备份过程中。

  3. 在规划备份时需要考虑的其他重要文件包括:

    File

    描述

    /etc/cni/*

    容器网络接口配置(如果使用)

    /etc/sysconfig/iptables

    存储 iptables 规则的地方

    /etc/sysconfig/docker-storage-setup

    container-storage-setup 命令的输入文件

    /etc/sysconfig/docker

    docker 配置文件

    /etc/sysconfig/docker-network

    docker 网络配置(如 MTU)

    /etc/sysconfig/docker-storage

    docker 存储配置(由 container-storage-setup 生成)

    /etc/dnsmasq.conf

    dnsmasq 的主要配置文件

    /etc/dnsmasq.d/*

    不同的 dnsmasq 配置文件

    /etc/sysconfig/flanneld

    flannel 配置文件(如果使用)

    /etc/pki/ca-trust/source/anchors/

    添加到系统的证书(例如,外部 registry)

    创建这些文件的备份:

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo mkdir -p ${MYBACKUPDIR}/etc/sysconfig
    $ sudo mkdir -p ${MYBACKUPDIR}/etc/pki/ca-trust/source/anchors
    $ sudo cp -aR /etc/sysconfig/{iptables,docker-*,flanneld} \
        ${MYBACKUPDIR}/etc/sysconfig/
    $ sudo cp -aR /etc/dnsmasq* /etc/cni ${MYBACKUPDIR}/etc/
    $ sudo cp -aR /etc/pki/ca-trust/source/anchors/* \
        ${MYBACKUPDIR}/etc/pki/ca-trust/source/anchors/
  4. 如果软件包被意外删除,或者您需要重新整合 rpm 软件包中所含的文件,则系统中安装的 rhel 软件包列表会很有用。

    注意

    如果您使用 Red Hat Satellite 功能(如内容视图或事实存储),请提供正确机制来重新安装缺少的软件包和系统中安装的软件包的历史数据。

    要创建系统中当前 rhel 软件包的列表:

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo mkdir -p ${MYBACKUPDIR}
    $ rpm -qa | sort | sudo tee $MYBACKUPDIR/packages.txt
  5. 如果您使用前面的步骤,则备份目录中存在以下文件:

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo find ${MYBACKUPDIR} -mindepth 1 -type f -printf '%P\n'
    etc/sysconfig/flanneld
    etc/sysconfig/iptables
    etc/sysconfig/docker-network
    etc/sysconfig/docker-storage
    etc/sysconfig/docker-storage-setup
    etc/sysconfig/docker-storage-setup.rpmnew
    etc/origin/master/ca.crt
    etc/origin/master/ca.key
    etc/origin/master/ca.serial.txt
    etc/origin/master/ca-bundle.crt
    etc/origin/master/master.proxy-client.crt
    etc/origin/master/master.proxy-client.key
    etc/origin/master/service-signer.crt
    etc/origin/master/service-signer.key
    etc/origin/master/serviceaccounts.private.key
    etc/origin/master/serviceaccounts.public.key
    etc/origin/master/openshift-master.crt
    etc/origin/master/openshift-master.key
    etc/origin/master/openshift-master.kubeconfig
    etc/origin/master/master.server.crt
    etc/origin/master/master.server.key
    etc/origin/master/master.kubelet-client.crt
    etc/origin/master/master.kubelet-client.key
    etc/origin/master/admin.crt
    etc/origin/master/admin.key
    etc/origin/master/admin.kubeconfig
    etc/origin/master/etcd.server.crt
    etc/origin/master/etcd.server.key
    etc/origin/master/master.etcd-client.key
    etc/origin/master/master.etcd-client.csr
    etc/origin/master/master.etcd-client.crt
    etc/origin/master/master.etcd-ca.crt
    etc/origin/master/policy.json
    etc/origin/master/scheduler.json
    etc/origin/master/htpasswd
    etc/origin/master/session-secrets.yaml
    etc/origin/master/openshift-router.crt
    etc/origin/master/openshift-router.key
    etc/origin/master/registry.crt
    etc/origin/master/registry.key
    etc/origin/master/master-config.yaml
    etc/origin/generated-configs/master-master-1.example.com/master.server.crt
    ...[OUTPUT OMITTED]...
    etc/origin/cloudprovider/openstack.conf
    etc/origin/node/system:node:master-0.example.com.crt
    etc/origin/node/system:node:master-0.example.com.key
    etc/origin/node/ca.crt
    etc/origin/node/system:node:master-0.example.com.kubeconfig
    etc/origin/node/server.crt
    etc/origin/node/server.key
    etc/origin/node/node-dnsmasq.conf
    etc/origin/node/resolv.conf
    etc/origin/node/node-config.yaml
    etc/origin/node/flannel.etcd-client.key
    etc/origin/node/flannel.etcd-client.csr
    etc/origin/node/flannel.etcd-client.crt
    etc/origin/node/flannel.etcd-ca.crt
    etc/pki/ca-trust/source/anchors/openshift-ca.crt
    etc/pki/ca-trust/source/anchors/registry-ca.crt
    etc/dnsmasq.conf
    etc/dnsmasq.d/origin-dns.conf
    etc/dnsmasq.d/origin-upstream-dns.conf
    etc/dnsmasq.d/node-dnsmasq.conf
    packages.txt

    如果需要,您可以压缩文件以节省空间:

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo tar -zcvf /backup/$(hostname)-$(date +%Y%m%d).tar.gz $MYBACKUPDIR
    $ sudo rm -Rf ${MYBACKUPDIR}

要从头开始创建任何这些文件,openshift-ansible-contrib 存储库包含 backup_master_node.sh 脚本,它将执行前面的步骤。该脚本在运行 脚本的主机上创建一个目录,并复制前面提到的所有文件。

注意

红帽不支持 openshift-ansible-contrib 脚本,但可以在架构团队执行测试以确保代码运行正常且安全时作为参考。

您可以使用以下方法在每个 master 主机上运行该脚本:

$ mkdir ~/git
$ cd ~/git
$ git clone https://github.com/openshift/openshift-ansible-contrib.git
$ cd openshift-ansible-contrib/reference-architecture/day2ops/scripts
$ ./backup_master_node.sh -h

5.2.1.2. 备份 etcd

当备份 etcd 时,您必须备份 etcd 配置文件和 etcd 数据。

5.2.1.2.1. 备份 etcd 配置文件

要保留的 etcd 配置文件都存储在运行 etcd 的实例的 /etc/etcd 目录中。这包括 etcd 配置文件(/etc/etcd/etcd.conf)和集群通信所需的证书。所有这些文件都是在安装时由 Ansible 安装程序生成的。

流程

对于集群的每个 etcd 成员,备份 etcd 配置。

$ ssh master-0 1
# mkdir -p /backup/etcd-config-$(date +%Y%m%d)/
# cp -R /etc/etcd/ /backup/etcd-config-$(date +%Y%m%d)/
1
master-0 替换为 etcd 成员的名称。
注意

每个 etcd 集群成员上的证书和配置文件是唯一的。

5.2.1.2.2. 备份 etcd 数据
先决条件
注意

OpenShift Container Platform 安装程序创建别名,以避免为 etcd v2 任务输入名为 etcdctl2 的所有标志,以及用于 etcd v3 任务的 etcdctl3

但是,etcdctl3 别名不会向 etcdctl 命令提供完整的端点列表,因此您必须指定 --endpoints 选项并列出所有端点。

备份 etcd 之前:

  • etcdctl 二进制文件必须可用,或者在容器化安装中,rhel7/etcd 容器必须可用。
  • 确保 OpenShift Container Platform API 服务正在运行。
  • 确保与 etcd 集群的连接(端口 2379/tcp)。
  • 确保正确的证书以连接到 etcd 集群。
流程
注意

虽然 etcdctl backup 命令用于执行备份,etcd v3 没有 备份 的概念。您可以使用 etcdctl snapshot save 命令对一个实时成员进行快照,或从 etcd 数据目录中复制 member/snap/db 文件。

etcdctl backup 命令重写了备份中所含的一些元数据,特别是节点 ID 和集群 ID,这意味着在备份中,节点会丢失它的以前的身份。要从备份重新创建集群,您可以创建一个新的单节点集群,然后将其他节点的其余部分添加到集群中。元数据被重写以防止新节点加入现有集群。

备份 etcd 数据:

重要

从以前的 OpenShift Container Platform 版本升级的集群可能包含 v2 数据存储。备份所有 etcd 数据存储。

  1. 从静态 pod 清单获取 etcd 端点 IP 地址:

    $ export ETCD_POD_MANIFEST="/etc/origin/node/pods/etcd.yaml"
    $ export ETCD_EP=$(grep https ${ETCD_POD_MANIFEST} | cut -d '/' -f3)
  2. 以管理员身份登录:

    $ oc login -u system:admin
  3. 获取 etcd pod 名称:

    $ export ETCD_POD=$(oc get pods -n kube-system | grep -o -m 1 '^master-etcd\S*')
  4. 进入 kube-system 项目:

    $ oc project kube-system
  5. 在 pod 中生成 etcd 数据快照并将其保存在本地:

    $ oc exec ${ETCD_POD} -c etcd -- /bin/bash -c "ETCDCTL_API=3 etcdctl \
        --cert /etc/etcd/peer.crt \
        --key /etc/etcd/peer.key \
        --cacert /etc/etcd/ca.crt \
        --endpoints $ETCD_EP \
        snapshot save /var/lib/etcd/snapshot.db" 1
    1
    您必须将快照写入 /var/lib/etcd/ 下的目录中。

5.2.1.3. 弃用 master 主机

Master 主机运行重要的服务,如 OpenShift Container Platform API 和控制器服务。为了弃用 master 主机,必须停止这些服务。

OpenShift Container Platform API 服务是一个主动/主动服务,因此只要请求发送到单独的 master 服务器,停止该服务不会影响环境。但是,OpenShift Container Platform 控制器服务是一个主动/被动服务,服务使用 etcd 来决定活跃的 master。

在多主控机架构中弃用 master 主机包括从负载均衡器池中移除 master,以避免尝试使用该 master 的新连接。这个过程很大程度上依赖于使用的负载均衡器。以下步骤显示从 haproxy 中删除 master 的详细信息。如果 OpenShift Container Platform 在云供应商上运行或使用 F5 设备,请查看特定的产品文档来从轮转中删除 master。

流程
  1. 删除 /etc/haproxy/haproxy.cfg 配置文件中的 backend 部分。例如,如果使用 haproxy 弃用名为 master-0.example.com 的 master,请确保从以下内容中删除主机名:

    backend mgmt8443
        balance source
        mode tcp
        # MASTERS 8443
        server master-1.example.com 192.168.55.12:8443 check
        server master-2.example.com 192.168.55.13:8443 check
  2. 然后,重新启动 haproxy 服务。

    $ sudo systemctl restart haproxy
  3. 从负载均衡器中删除 master 后,通过将定义文件移出静态 pod dir /etc/origin/node/pods 来禁用 API 和控制器服务:

    # mkdir -p /etc/origin/node/pods/disabled
    # mv /etc/origin/node/pods/controller.yaml /etc/origin/node/pods/disabled/:
    +
  4. 由于 master 主机是一个可调度的 OpenShift Container Platform 节点,因此请按照 弃用节点主机 部分中的步骤进行操作。
  5. /etc/ansible/hosts Ansible 清单文件中的 [masters][nodes] 组移除 master 主机,以避免在使用该清单文件运行任何 Ansible 任务时出现问题。

    警告

    弃用 Ansible 清单中列出的第一个 master 主机需要额外的举措。

    /etc/origin/master/ca.serial.txt 文件仅对 Ansible 主机清单中列出的第一个 master 生成。如果您弃用了第一个 master 主机,请在进程前将 /etc/origin/master/ca.serial.txt 文件复制到其余 master 主机中。

    重要

    在运行多个 master 的 OpenShift Container Platform 3.11 集群中,其中一个 master 节点会包括额外的 CA 证书(/etc/origin/master, /etc/etcd/ca, 和 /etc/etcd/generated_certs)。这些是应用程序节点和 etcd 节点扩展操作所必需的,如果 CA 主机 master 已被弃用,则必须在另一个 master 节点上恢复。

  6. kubernetes 服务将 master 主机 IP 作为端点包含在内。要验证 master 已被正确弃用,请查看 kubernetes 服务输出并查看已弃用的 master 是否已被删除:

    $ oc describe svc kubernetes -n default
    Name:			kubernetes
    Namespace:		default
    Labels:			component=apiserver
    			provider=kubernetes
    Annotations:		<none>
    Selector:		<none>
    Type:			ClusterIP
    IP:			10.111.0.1
    Port:			https	443/TCP
    Endpoints:		192.168.55.12:8443,192.168.55.13:8443
    Port:			dns	53/UDP
    Endpoints:		192.168.55.12:8053,192.168.55.13:8053
    Port:			dns-tcp	53/TCP
    Endpoints:		192.168.55.12:8053,192.168.55.13:8053
    Session Affinity:	ClientIP
    Events:			<none>

    主机成功弃用后,可以安全地删除之前运行主控机的主机。

5.2.1.4. 删除 etcd 主机

如果 etcd 主机无法恢复,将其从集群中移除。

在所有 master 主机上执行的步骤

流程
  1. 从 etcd 集群中删除其他 etcd 主机。为每个 etcd 节点运行以下命令:

    # etcdctl3 --endpoints=https://<surviving host IP>:2379
      --cacert=/etc/etcd/ca.crt
      --cert=/etc/etcd/peer.crt
      --key=/etc/etcd/peer.key member remove <failed member ID>
  2. 在每个 master 上重启 master API 服务:

    # master-restart api restart-master controller

在当前 etcd 集群中执行的步骤

流程
  1. 从集群中删除失败的主机:

    # etcdctl2 cluster-health
    member 5ee217d19001 is healthy: got healthy result from https://192.168.55.12:2379
    member 2a529ba1840722c0 is healthy: got healthy result from https://192.168.55.8:2379
    failed to check the health of member 8372784203e11288 on https://192.168.55.21:2379: Get https://192.168.55.21:2379/health: dial tcp 192.168.55.21:2379: getsockopt: connection refused
    member 8372784203e11288 is unreachable: [https://192.168.55.21:2379] are all unreachable
    member ed4f0efd277d7599 is healthy: got healthy result from https://192.168.55.13:2379
    cluster is healthy
    
    # etcdctl2 member remove 8372784203e11288 1
    Removed member 8372784203e11288 from cluster
    
    # etcdctl2 cluster-health
    member 5ee217d19001 is healthy: got healthy result from https://192.168.55.12:2379
    member 2a529ba1840722c0 is healthy: got healthy result from https://192.168.55.8:2379
    member ed4f0efd277d7599 is healthy: got healthy result from https://192.168.55.13:2379
    cluster is healthy
    1
    remove 命令需要 etcd ID,而不是主机名。
  2. 要确保 etcd 配置在 etcd 服务重启时不使用失败的主机,修改所有剩余的 etcd 主机上的 /etc/etcd/etcd.conf 文件,并在 ETCD_INITIAL_CLUSTER 变量的值中删除失败主机:

    # vi /etc/etcd/etcd.conf

    例如:

    ETCD_INITIAL_CLUSTER=master-0.example.com=https://192.168.55.8:2380,master-1.example.com=https://192.168.55.12:2380,master-2.example.com=https://192.168.55.13:2380

    成为:

    ETCD_INITIAL_CLUSTER=master-0.example.com=https://192.168.55.8:2380,master-1.example.com=https://192.168.55.12:2380
    注意

    不需要重启 etcd 服务,因为失败的主机是使用 etcdctl 被删除。

  3. 修改 Ansible 清单文件,以反映集群的当前状态,并避免在重新运行 playbook 时出现问题:

    [OSEv3:children]
    masters
    nodes
    etcd
    
    ... [OUTPUT ABBREVIATED] ...
    
    [etcd]
    master-0.example.com
    master-1.example.com
  4. 如果您使用 Flannel,请修改每个主机上 /etc/sysconfig/flanneldflanneld 服务配置并删除 etcd 主机:

    FLANNEL_ETCD_ENDPOINTS=https://master-0.example.com:2379,https://master-1.example.com:2379,https://master-2.example.com:2379
  5. 重启 flanneld 服务:

    # systemctl restart flanneld.service
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.