你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Microsoft Azure Red Hat OpenShift 允许使用基础结构计算机集创建仅托管基础结构组件的计算机,例如默认路由器、集成容器注册表以及用于群集指标和监视的组件。 这些基础结构计算机不会产生 OpenShift 成本;它们只会产生 Azure 计算成本。
在生产部署中,建议部署三个计算机集来保存基础结构组件。 每个节点都可以部署到不同的可用性区域以提高可用性。 这种类型的配置需要三组不同的机器组,每个可用区域配备一组。 有关基础结构节点大小调整指南,请参阅 建议的基础结构做法。
限定的工作负荷
以下基础架构工作负载无需 Azure Red Hat OpenShift 工作节点订阅:
- 在主服务器上运行的 Kubernetes 和 Azure Red Hat OpenShift 控制平面服务 
- 默认路由器 
- 集成容器映像注册表 
- 基于 HAProxy 的入口控制器 
- 群集指标集合或监视服务,包括用于监视用户定义的项目的组件 
- 聚合群集日志记录 
重要
在基础结构节点上运行指定类型以外的工作负荷可能会影响服务级别协议(SLA)和群集的稳定性。
先决条件
若要将添加到群集的 Azure 虚拟机识别为基础结构节点,而不是辅助角色节点,且不收取 OpenShift 费用,必须满足以下条件:
- 节点只能是以下实例类型之一: - Standard_E4s_v5
- Standard_E8s_v5
- Standard_E16s_v5
- Standard_E4as_v5
- Standard_E8as_v5
- Standard_E16as_v5
 
- 不能超过三个节点。 任何额外的节点都收取 OpenShift 费用。 
- 节点必须具有 Azure 标记 - node_role: infra
- 仅允许为基础结构节点指定的工作负荷。 所有其他工作负荷都会包括这些工作节点,并须收取费用。 此指定也可能使 SLA 失效,并损害群集的稳定性。 
创建基础设施机器集群
- 使用 清单定义模板 为基础结构计算机集创建清单定义。 
- 将尖括号( - <>)之间的所有字段替换为特定值。- 例如,将 - location: <REGION>替换为- location: westus2
- 若要获取清单定义模板所需的值,请参阅 命令和值。 
- 使用以下命令创建计算机集: - oc create -f <machine-set-filename.yaml>
- 若要验证计算机集的创建,请运行以下命令: - oc get machineset -n openshift-machine-api- 验证命令的输出应类似于以下值: - NAME DESIRED CURRENT READY AVAILABLE AGE ok0608-vkxvw-infra-westus21 1 1 1 1 165M ok0608-vkxvw-worker-westus21 1 1 1 1 4H24M ok0608-vkxvw-worker-westus22 1 1 1 1 4H24M ok0608-vkxvw-worker-westus23 1 1 1 1 4H24M
清单定义模板
在前面的过程中使用以下模板为基础结构计算机集创建清单定义。
apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: <INFRASTRUCTURE_ID>
    machine.openshift.io/cluster-api-machine-role: infra
    machine.openshift.io/cluster-api-machine-type: infra
  name: <INFRASTRUCTURE_ID>-infra-<REGION><ZONE>
  namespace: openshift-machine-api
spec:
  replicas: 1
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: <INFRASTRUCTURE_ID>
      machine.openshift.io/cluster-api-machineset: <INFRASTRUCTURE_ID>-infra-<REGION><ZONE>
  template:
    metadata:
      creationTimestamp: null
      labels:
        machine.openshift.io/cluster-api-cluster: <INFRASTRUCTURE_ID>
        machine.openshift.io/cluster-api-machine-role: infra
        machine.openshift.io/cluster-api-machine-type: infra
        machine.openshift.io/cluster-api-machineset: <INFRASTRUCTURE_ID>-infra-<REGION><ZONE>
    spec:
      metadata:
        creationTimestamp: null
        labels:
          machine.openshift.io/cluster-api-machineset: <OPTIONAL: Specify the machine set name to enable the use of availability sets. This setting only applies to new compute machines.>
          node-role.kubernetes.io/infra: ''
      providerSpec:
        value:
          apiVersion: azureproviderconfig.openshift.io/v1beta1
          credentialsSecret:
            name: azure-cloud-credentials
            namespace: openshift-machine-api
          image:
            offer: aro4
            publisher: azureopenshift
            sku: <SKU>
            version: <VERSION>
          kind: AzureMachineProviderSpec
          location: <REGION>
          metadata:
            creationTimestamp: null
          natRule: null
          networkResourceGroup: <NETWORK_RESOURCE_GROUP>
          osDisk:
            diskSizeGB: 128
            managedDisk:
              storageAccountType: Premium_LRS
            osType: Linux
          publicIP: false
          resourceGroup: <CLUSTER_RESOURCE_GROUP>
          tags:
            node_role: infra
          subnet: <SUBNET_NAME>
          userDataSecret:
            name: worker-user-data
          vmSize: <Standard_E4s_v5, Standard_E8s_v5, Standard_E16s_v5>
          vnet: <VNET_NAME>
          zone: <ZONE>
      taints:
      - key: node-role.kubernetes.io/infra
        effect: NoSchedule
命令和值
下面是一些用于创建和运行模板的常见命令和值。
列出所有机器集群
oc get machineset -n openshift-machine-api
获取特定计算机集的详细信息:
oc get machineset <machineset_name> -n openshift-machine-api -o yaml
群集资源组:
oc get infrastructure cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}'
网络资源组:
oc get infrastructure cluster -o jsonpath='{.status.platformStatus.azure.networkResourceGroupName}'
基础结构 ID:
oc get infrastructure cluster -o jsonpath='{.status.infrastructureName}'
地区:
oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.location}'
SKU:
oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.image.sku}'
子网:
oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.subnet}'
版本:
oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.image.version}'
虚拟网络:
oc get machineset <machineset_name> -n openshift-machine-api -o jsonpath='{.spec.template.spec.providerSpec.value.vnet}'
将工作负载移到新的基础结构节点
按照以下说明将基础结构工作负载移动到之前创建的基础结构节点。
流入量
对群集中可能具有的任何其他入口控制器使用此过程。 如果应用程序具有较高的入口资源要求,则最好将它们分散到工作器节点或专用计算机集。
- 将 - nodePlacement设置在- ingresscontroller为- node-role.kubernetes.io/infra,并增加- replicas以匹配基础结构节点的数量。- oc patch -n openshift-ingress-operator ingresscontroller default --type=merge \ -p='{"spec":{"replicas":3,"nodePlacement":{"nodeSelector":{"matchLabels":{"node-role.kubernetes.io/infra":""}},"tolerations":[{"effect":"NoSchedule","key":"node-role.kubernetes.io/infra","operator":"Exists"}]}}}'
- 验证 Ingress控制器运算符是否在新基础设施节点上启动pod。 - oc -n openshift-ingress get pods -o wide- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES router-default-69f58645b7-6xkvh 1/1 Running 0 66s 10.129.6.6 cz-cluster-hsmtw-infra-aro-machinesets-eastus-3-l6dqw <none> <none> router-default-69f58645b7-vttqz 1/1 Running 0 66s 10.131.4.6 cz-cluster-hsmtw-infra-aro-machinesets-eastus-1-vr56r <none> <none> router-default-6cb5ccf9f5-xjgcp 1/1 Terminating 0 23h 10.131.0.11 cz-cluster-hsmtw-worker-eastus2-xj9qx <none> <none>
注册表
- 将注册表中的 - nodePlacement设置为- node-role.kubernetes.io/infra:- oc patch configs.imageregistry.operator.openshift.io/cluster --type=merge \ -p='{"spec":{"affinity":{"podAntiAffinity":{"preferredDuringSchedulingIgnoredDuringExecution":[{"podAffinityTerm":{"namespaces":["openshift-image-registry"],"topologyKey":"kubernetes.io/hostname"},"weight":100}]}},"logLevel":"Normal","managementState":"Managed","nodeSelector":{"node-role.kubernetes.io/infra":""},"tolerations":[{"effect":"NoSchedule","key":"node-role.kubernetes.io/infra","operator":"Exists"}]}}'
- 验证注册表作员是否在新基础结构节点上启动 Pod: - oc -n openshift-image-registry get pods -l "docker-registry" -o wide- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES image-registry-84cbd76d5d-cfsw7 1/1 Running 0 3h46m 10.128.6.7 cz-cluster-hsmtw-infra-aro-machinesets-eastus-2-kljml <none> <none> image-registry-84cbd76d5d-p2jf9 1/1 Running 0 3h46m 10.129.6.7 cz-cluster-hsmtw-infra-aro-machinesets-eastus-3-l6dqw <none> <none>
群集监视
- 配置集群监控堆栈,以使用基础设施节点。 - 这会替代群集监视堆栈的任何其他自定义项,因此可能需要在运行命令之前合并现有自定义项。 - cat << EOF | oc apply -f - apiVersion: v1 kind: ConfigMap metadata: name: cluster-monitoring-config namespace: openshift-monitoring data: config.yaml: |+ alertmanagerMain: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: "NoSchedule" key: "node-role.kubernetes.io/infra" operator: "Exists" prometheusK8s: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: "NoSchedule" key: "node-role.kubernetes.io/infra" operator: "Exists" prometheusOperator: {} grafana: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: "NoSchedule" key: "node-role.kubernetes.io/infra" operator: "Exists" k8sPrometheusAdapter: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: "NoSchedule" key: "node-role.kubernetes.io/infra" operator: "Exists" kubeStateMetrics: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: "NoSchedule" key: "node-role.kubernetes.io/infra" operator: "Exists" telemeterClient: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: "NoSchedule" key: "node-role.kubernetes.io/infra" operator: "Exists" openshiftStateMetrics: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: "NoSchedule" key: "node-role.kubernetes.io/infra" operator: "Exists" thanosQuerier: nodeSelector: node-role.kubernetes.io/infra: "" tolerations: - effect: "NoSchedule" key: "node-role.kubernetes.io/infra" operator: "Exists" EOF
- 验证 OpenShift 监控操作员是否正在新的基础结构节点上启动 Pod。 请注意,某些节点(例如 - prometheus-operator)保留在主节点上。- oc -n openshift-monitoring get pods -o wide- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES alertmanager-main-0 6/6 Running 0 2m14s 10.128.6.11 cz-cluster-hsmtw-infra-aro-machinesets-eastus-2-kljml <none> <none> alertmanager-main-1 6/6 Running 0 2m46s 10.131.4.11 cz-cluster-hsmtw-infra-aro-machinesets-eastus-1-vr56r <none> <none> cluster-monitoring-operator-5bbfd998c6-m9w62 2/2 Running 0 28h 10.128.0.23 cz-cluster-hsmtw-master-1 <none> <none> grafana-599d4b948c-btlp2 3/3 Running 0 2m48s 10.131.4.10 cz-cluster-hsmtw-infra-aro-machinesets-eastus-1-vr56r <none> <none> kube-state-metrics-574c5bfdd7-f7fjk 3/3 Running 0 2m49s 10.131.4.8 cz-cluster-hsmtw-infra-aro-machinesets-eastus-1-vr56r <none> <none>
DNS
- 允许 DNS Pod 在基础结构节点上运行。 - oc edit dns.operator/default- apiVersion: operator.openshift.io/v1 kind: DNS metadata: name: default spec: nodePlacement: tolerations: - operator: Exists
- 验证 DNS Pod 是否已调度到所有 - infra节点上运行。- oc get ds/dns-default -n openshift-dns- NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE dns-default 7 7 7 7 7 kubernetes.io/os=linux 35d
相关内容
若要升级群集,请参阅 升级 Azure Red Hat OpenShift 群集。