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 节点上执行以下步骤。
- 创建 pod 定义备份(在此)。.
创建 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 节点上恢复,它应该永久不可用。这些目录默认包含在此处的备份过程中。在规划备份时需要考虑的其他重要文件包括:
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/
如果软件包被意外删除,或者您需要重新整合
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
如果您使用前面的步骤,则备份目录中存在以下文件:
$ 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 数据存储。
从静态 pod 清单获取 etcd 端点 IP 地址:
$ export ETCD_POD_MANIFEST="/etc/origin/node/pods/etcd.yaml"
$ export ETCD_EP=$(grep https ${ETCD_POD_MANIFEST} | cut -d '/' -f3)
以管理员身份登录:
$ oc login -u system:admin
获取 etcd pod 名称:
$ export ETCD_POD=$(oc get pods -n kube-system | grep -o -m 1 '^master-etcd\S*')
进入
kube-system
项目:$ oc project kube-system
在 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。
流程
删除
/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
然后,重新启动
haproxy
服务。$ sudo systemctl restart haproxy
从负载均衡器中删除 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/: +
- 由于 master 主机是一个可调度的 OpenShift Container Platform 节点,因此请按照 弃用节点主机 部分中的步骤进行操作。
从
/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 节点上恢复。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 主机上执行的步骤
流程
从 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>
在每个 master 上重启 master API 服务:
# master-restart api restart-master controller
在当前 etcd 集群中执行的步骤
流程
从集群中删除失败的主机:
# 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,而不是主机名。
要确保 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
被删除。修改 Ansible 清单文件,以反映集群的当前状态,并避免在重新运行 playbook 时出现问题:
[OSEv3:children] masters nodes etcd ... [OUTPUT ABBREVIATED] ... [etcd] master-0.example.com master-1.example.com
如果您使用 Flannel,请修改每个主机上
/etc/sysconfig/flanneld
的flanneld
服务配置并删除 etcd 主机:FLANNEL_ETCD_ENDPOINTS=https://master-0.example.com:2379,https://master-1.example.com:2379,https://master-2.example.com:2379
重启
flanneld
服务:# systemctl restart flanneld.service