5.2. 在裸机上管理托管的 control plane
在裸机上部署托管的 control plane 后,您可以通过完成以下任务来管理托管集群。
5.2.1. 访问托管集群
您可以通过直接从资源获取 kubeconfig
文件和 kubeadmin
凭证来访问托管集群,或使用 hcp
命令行界面生成 kubeconfig
文件。
先决条件
要通过直接从资源获取 kubeconfig
文件和凭证来访问托管集群,您必须熟悉托管集群的访问 secret。托管的集群(hosting) 命名空间包含托管的集群资源和访问 secret。托管 control plane 命名空间是托管 control plane 运行的位置。
secret 名称格式如下:
-
kubeconfig
secret:<hosted_cluster_namespace>-<name>-admin-kubeconfig
。例如clusters-hypershift-demo-admin-kubeconfig
。 -
kubeadmin
密码 secret:<hosted_cluster_namespace>-<name>-kubeadmin-password
。例如,clusters-hypershift-demo-kubeadmin-password
。
kubeconfig
secret 包含一个 Base64 编码的 kubeconfig
字段,您可以解码并保存到要使用以下命令使用的文件中:
$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
kubeadmin
密码 secret 也为 Base64 编码的。您可以对它进行解码,并使用密码登录到托管集群的 API 服务器或控制台。
流程
要使用
hcp
CLI 访问托管集群来生成kubeconfig
文件,请执行以下步骤:输入以下命令生成
kubeconfig
文件:$ hcp create kubeconfig --namespace <hosted_cluster_namespace> --name <hosted_cluster_name> > <hosted_cluster_name>.kubeconfig
保存
kubeconfig
文件后,您可以输入以下示例命令来访问托管集群:$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get nodes
5.2.2. 为托管集群扩展 NodePool 对象
您可以通过在托管集群中添加节点来扩展 NodePool
对象。当您扩展节点池时,请考虑以下信息:
- 当您由节点池扩展副本时,会创建一个机器。对于每台机器,Cluster API 供应商会找到并安装一个满足节点池规格中指定的要求的 Agent。您可以通过检查其状态和条件来监控代理的安装。
- 当您缩减节点池时,代理会从对应的集群绑定。在重复使用代理前,您必须使用 Discovery 镜像重启它们。
流程
将
NodePool
对象扩展到两个节点:$ oc -n <hosted_cluster_namespace> scale nodepool <nodepool_name> --replicas 2
Cluster API 代理供应商会随机选择两个分配给托管集群的代理。这些代理会经历不同的状态,最终将托管集群作为 OpenShift Container Platform 节点加入。代理按以下顺序传递状态:
-
binding
-
discovering
-
insufficient
-
installing
-
install-in-progress
-
added-to-existing-cluster
-
输入以下命令:
$ oc -n <hosted_control_plane_namespace> get agent
输出示例
NAME CLUSTER APPROVED ROLE STAGE 4dac1ab2-7dd5-4894-a220-6a3473b67ee6 hypercluster1 true auto-assign d9198891-39f4-4930-a679-65fb142b108b true auto-assign da503cf1-a347-44f2-875c-4960ddb04091 hypercluster1 true auto-assign
输入以下命令:
$ oc -n <hosted_control_plane_namespace> get agent -o jsonpath='{range .items[*]}BMH: {@.metadata.labels.agent-install\.openshift\.io/bmh} Agent: {@.metadata.name} State: {@.status.debugInfo.state}{"\n"}{end}'
输出示例
BMH: ocp-worker-2 Agent: 4dac1ab2-7dd5-4894-a220-6a3473b67ee6 State: binding BMH: ocp-worker-0 Agent: d9198891-39f4-4930-a679-65fb142b108b State: known-unbound BMH: ocp-worker-1 Agent: da503cf1-a347-44f2-875c-4960ddb04091 State: insufficient
输入 extract 命令,获取新的托管集群的 kubeconfig :
$ oc extract -n <hosted_cluster_namespace> secret/<hosted_cluster_name>-admin-kubeconfig --to=- > kubeconfig-<hosted_cluster_name>
代理访问
added-to-existing-cluster
状态后,输入以下命令验证是否可以看到托管的集群中的 OpenShift Container Platform 节点:$ oc --kubeconfig kubeconfig-<hosted_cluster_name> get nodes
输出示例
NAME STATUS ROLES AGE VERSION ocp-worker-1 Ready worker 5m41s v1.24.0+3882f8f ocp-worker-2 Ready worker 6m3s v1.24.0+3882f8f
集群 Operator 开始通过向节点添加工作负载来协调。
输入以下命令验证在扩展
NodePool
对象时是否创建了两台机器:$ oc -n <hosted_control_plane_namespace> get machines
输出示例
NAME CLUSTER NODENAME PROVIDERID PHASE AGE VERSION hypercluster1-c96b6f675-m5vch hypercluster1-b2qhl ocp-worker-1 agent://da503cf1-a347-44f2-875c-4960ddb04091 Running 15m 4.x.z hypercluster1-c96b6f675-tl42p hypercluster1-b2qhl ocp-worker-2 agent://4dac1ab2-7dd5-4894-a220-6a3473b67ee6 Running 15m 4.x.z
clusterversion
协调过程最终达到缺少 Ingress 和 Console 集群 Operator 的时间点。输入以下命令:
$ oc --kubeconfig kubeconfig-<hosted_cluster_name> get clusterversion,co
输出示例
NAME VERSION AVAILABLE PROGRESSING SINCE STATUS clusterversion.config.openshift.io/version False True 40m Unable to apply 4.x.z: the cluster operator console has not yet successfully rolled out NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE clusteroperator.config.openshift.io/console 4.12z False False False 11m RouteHealthAvailable: failed to GET route (https://console-openshift-console.apps.hypercluster1.domain.com): Get "https://console-openshift-console.apps.hypercluster1.domain.com": dial tcp 10.19.3.29:443: connect: connection refused clusteroperator.config.openshift.io/csi-snapshot-controller 4.12z True False False 10m clusteroperator.config.openshift.io/dns 4.12z True False False 9m16s
5.2.2.1. 添加节点池
您可以通过指定名称、副本数和任何其他信息,如代理标签选择器,为托管集群创建节点池。
流程
要创建节点池,请输入以下信息:
$ hcp create nodepool agent \ --cluster-name <hosted_cluster_name> \1 --name <nodepool_name> \2 --node-count <worker_node_count> \3 --agentLabelSelector size=medium 4
通过列出
cluster
命名空间中的nodepool
资源来检查节点池的状态:$ oc get nodepools --namespace clusters
输入以下命令提取
admin-kubeconfig
secret:$ oc extract -n <hosted_control_plane_namespace> secret/admin-kubeconfig --to=./hostedcluster-secrets --confirm
输出示例
hostedcluster-secrets/kubeconfig
一段时间后,您可以输入以下命令来检查节点池的状态:
$ oc --kubeconfig ./hostedcluster-secrets get nodes
验证
输入以下命令验证可用节点池的数量是否与预期的节点池数量匹配:
$ oc get nodepools --namespace clusters
5.2.2.2. 为托管集群启用节点自动扩展
当托管集群和备用代理有更多容量时,您可以启用自动扩展来安装新的 worker 节点。
流程
要启用自动扩展,请输入以下命令:
$ oc -n <hosted_cluster_namespace> patch nodepool <hosted_cluster_name> --type=json -p '[{"op": "remove", "path": "/spec/replicas"},{"op":"add", "path": "/spec/autoScaling", "value": { "max": 5, "min": 2 }}]'
注意在示例中,最少的节点数量为 2,最大值为 5。添加的最大节点数可能会被您的平台绑定。例如,如果您使用 Agent 平台,则最大节点数量由可用代理数量绑定。
创建需要新节点的工作负载。
使用以下示例创建一个包含工作负载配置的 YAML 文件:
apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: reversewords name: reversewords namespace: default spec: replicas: 40 selector: matchLabels: app: reversewords strategy: {} template: metadata: creationTimestamp: null labels: app: reversewords spec: containers: - image: quay.io/mavazque/reversewords:latest name: reversewords resources: requests: memory: 2Gi status: {}
-
将文件保存为
workload-config.yaml
。 输入以下命令应用 YAML:
$ oc apply -f workload-config.yaml
输入以下命令提取
admin-kubeconfig
secret:$ oc extract -n <hosted_cluster_namespace> secret/<hosted_cluster_name>-admin-kubeconfig --to=./hostedcluster-secrets --confirm
输出示例
hostedcluster-secrets/kubeconfig
您可以输入以下命令来检查新节点是否处于
Ready
状态:$ oc --kubeconfig ./hostedcluster-secrets get nodes
要删除节点,请输入以下命令删除工作负载:
$ oc --kubeconfig ./hostedcluster-secrets -n <namespace> delete deployment <deployment_name>
等待几分钟,无需额外容量。在 Agent 平台上,代理已停用,可以被重复使用。您可以输入以下命令确认节点已被删除:
$ oc --kubeconfig ./hostedcluster-secrets get nodes
对于 IBM Z 代理,计算节点只适用于带有 KVM 代理的 IBM Z。对于 z/VM 和 LPAR,您必须手动删除计算节点。
代理只能用于带有 KVM 的 IBM Z。对于 z/VM 和 LPAR,重新创建代理以将其用作计算节点。
5.2.2.3. 为托管集群禁用节点自动扩展
要禁用节点自动扩展,请完成以下步骤。
流程
输入以下命令为托管集群禁用节点自动扩展:
$ oc -n <hosted_cluster_namespace> patch nodepool <hosted_cluster_name> --type=json -p '[\{"op":"remove", "path": "/spec/autoScaling"}, \{"op": "add", "path": "/spec/replicas", "value": <specify_value_to_scale_replicas>]'
命令从 YAML 文件中删除
"spec.autoScaling"
,并添加"spec.replicas"
,并将"spec.replicas"
设置为您指定的整数值。
其他资源
5.2.3. 在裸机上的托管集群中处理 ingress
每个 OpenShift Container Platform 集群都有一个默认应用程序 Ingress Controller,它通常关联有一个外部 DNS 记录。例如,如果您创建一个名为 example
的托管集群,其基域为 krnl.es
,您可以预期通配符域 *.apps.example.krnl.es
可以被路由。
流程
要为 *.apps
域设置负载均衡器和通配符 DNS 记录,请在客户机集群上执行以下操作:
通过创建包含 MetalLB Operator 配置的 YAML 文件来部署 MetalLB:
apiVersion: v1 kind: Namespace metadata: name: metallb labels: openshift.io/cluster-monitoring: "true" annotations: workload.openshift.io/allowed: management --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: metallb-operator-operatorgroup namespace: metallb --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: metallb-operator namespace: metallb spec: channel: "stable" name: metallb-operator source: redhat-operators sourceNamespace: openshift-marketplace
-
将文件保存为
metallb-operator-config.yaml
。 输入以下命令应用配置:
$ oc apply -f metallb-operator-config.yaml
Operator 运行后,创建 MetalLB 实例:
创建包含 MetalLB 实例的配置的 YAML 文件:
apiVersion: metallb.io/v1beta1 kind: MetalLB metadata: name: metallb namespace: metallb
-
将文件保存为
metallb-instance-config.yaml
。 输入以下命令创建 MetalLB 实例:
$ oc apply -f metallb-instance-config.yaml
使用单个 IP 地址创建
IPAddressPool
资源。此 IP 地址必须与集群节点使用的网络位于同一个子网中。创建一个文件,如
ipaddresspool.yaml
,其内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: namespace: metallb name: <ip_address_pool_name> 1 spec: addresses: - <ingress_ip>-<ingress_ip> 2 autoAssign: false
输入以下命令为 IP 地址池应用配置:
$ oc apply -f ipaddresspool.yaml
创建 L2 广告。
创建一个文件,如
l2advertisement.yaml
,内容类似以下示例:apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: <l2_advertisement_name> 1 namespace: metallb spec: ipAddressPools: - <ip_address_pool_name> 2
输入以下命令应用配置:
$ oc apply -f l2advertisement.yaml
创建
LoadBalancer
类型的服务后,MetalLB 为该服务添加外部 IP 地址。配置一个新的负载均衡器服务,通过创建名为
metallb-loadbalancer-service.yaml
的 YAML 文件将入口流量路由到 ingress 部署:kind: Service apiVersion: v1 metadata: annotations: metallb.universe.tf/address-pool: ingress-public-ip name: metallb-ingress namespace: openshift-ingress spec: ports: - name: http protocol: TCP port: 80 targetPort: 80 - name: https protocol: TCP port: 443 targetPort: 443 selector: ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default type: LoadBalancer
-
保存
metallb-loadbalancer-service.yaml
文件。 输入以下命令应用 YAML 配置:
$ oc apply -f metallb-loadbalancer-service.yaml
输入以下命令访问 OpenShift Container Platform 控制台:
$ curl -kI https://console-openshift-console.apps.example.krnl.es
输出示例
HTTP/1.1 200 OK
检查
clusterversion
和clusteroperator
值,以验证所有内容是否正在运行。输入以下命令:$ oc --kubeconfig <hosted_cluster_name>.kubeconfig get clusterversion,co
输出示例
NAME VERSION AVAILABLE PROGRESSING SINCE STATUS clusterversion.config.openshift.io/version 4.x.y True False 3m32s Cluster version is 4.x.y NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE clusteroperator.config.openshift.io/console 4.x.y True False False 3m50s clusteroperator.config.openshift.io/ingress 4.x.y True False False 53m
将
<4.x.y
> 替换为您要使用的受支持 OpenShift Container Platform 版本,如4.17.0-multi
。
5.2.4. 在裸机上启用机器健康检查
您可以在裸机上启用机器健康检查,以修复并自动替换不健康的受管集群节点。您必须具有可在受管集群上安装的附加代理机器。
在启用机器健康检查前请考虑以下限制:
-
您无法修改
MachineHealthCheck
对象。 -
只有在至少有两个节点处于
False
或Unknown
状态超过 8 分钟时,机器健康检查才会替换节点。
为受管集群节点启用机器健康检查后,MachineHealthCheck
对象会在托管集群中创建。
流程
要在托管集群中启用机器健康检查,请修改 NodePool
资源。完成以下步骤:
验证
NodePool
资源中的spec.nodeDrainTimeout
值是否大于0s
。将<hosted_cluster_namespace>
替换为托管集群命名空间的名称,将<nodepool_name>
替换为节点池名称。运行以下命令:$ oc get nodepool -n <hosted_cluster_namespace> <nodepool_name> -o yaml | grep nodeDrainTimeout
输出示例
nodeDrainTimeout: 30s
如果
spec.nodeDrainTimeout
值不大于0s
,请运行以下命令修改值:$ oc patch nodepool -n <hosted_cluster_namespace> <nodepool_name> -p '{"spec":{"nodeDrainTimeout": "30m"}}' --type=merge
通过将
NodePool
资源中的spec.management.autoRepair
字段设置为true
来启用机器健康检查。运行以下命令:$ oc patch nodepool -n <hosted_cluster_namespace> <nodepool_name> -p '{"spec": {"management": {"autoRepair":true}}}' --type=merge
运行以下命令,使用
autoRepair: true
值验证NodePool
资源是否已更新:$ oc get nodepool -n <hosted_cluster_namespace> <nodepool_name> -o yaml | grep autoRepair
5.2.5. 在裸机上禁用机器健康检查
要禁用受管集群节点的机器健康检查,请修改 NodePool
资源。
流程
通过将
NodePool
资源中的spec.management.autoRepair
字段设置为false
来禁用机器健康检查。运行以下命令:$ oc patch nodepool -n <hosted_cluster_namespace> <nodepool_name> -p '{"spec": {"management": {"autoRepair":false}}}' --type=merge
运行以下命令,验证
NodePool
资源是否使用autoRepair: false
值更新:$ oc get nodepool -n <hosted_cluster_namespace> <nodepool_name> -o yaml | grep autoRepair
其他资源