3.3. 使用带有 CLI 的对等 pod 部署 OpenShift 沙盒容器工作负载
您可以使用 CLI 部署 OpenShift 沙盒容器工作负载。首先,您必须安装 OpenShift 沙盒容器 Operator,然后创建 KataConfig
自定义资源。在沙盒容器中部署工作负载后,您必须将 kata-remote-cc
作为 runtimeClassName
添加到工作负载 YAML 文件中。
3.3.1. 使用 CLI 安装 OpenShift 沙盒容器 Operator
您可以使用 Red Hat OpenShift CLI 安装 OpenShift 沙盒容器 Operator。
先决条件
- 在集群中安装了 Red Hat OpenShift 4.13。
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 您已订阅了 OpenShift 沙盒容器目录。
注意订阅 OpenShift 沙盒容器目录为
openshift-sandboxed-containers-operator
命名空间提供了对 OpenShift 沙盒容器 Operator 的访问权限。
流程
为 OpenShift 沙盒容器 Operator 创建
Namespace
对象。创建一个包含以下清单的
Namespace
对象 YAML 文件:apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator
创建
Namespace
对象:$ oc create -f Namespace.yaml
为 OpenShift 沙盒容器 Operator 创建
OperatorGroup
对象。创建一个包含以下清单的
OperatorGroup
对象 YAML 文件:apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: openshift-sandboxed-containers-operator namespace: openshift-sandboxed-containers-operator spec: targetNamespaces: - openshift-sandboxed-containers-operator
创建
OperatorGroup
对象:$ oc create -f OperatorGroup.yaml
创建
Subscription
对象,以便为 OpenShift 沙盒容器 Operator 订阅命名空间
。创建一个包含以下内容的
Subscription
对象 YAML 文件:apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: openshift-sandboxed-containers-operator namespace: openshift-sandboxed-containers-operator spec: channel: stable installPlanApproval: Automatic name: sandboxed-containers-operator source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: sandboxed-containers-operator.v1.4.1
创建
Subscription
对象:$ oc create -f Subscription.yaml
OpenShift 沙盒容器 Operator 现已安装在集群中。
以上列出的所有对象文件名都是建议。您可以使用其他名称创建对象 YAML 文件。
验证
确保正确安装 Operator:
$ oc get csv -n openshift-sandboxed-containers-operator
输出示例
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.4.1 1.4.0 Succeeded
3.3.2. 使用 CLI 为 AWS 设置对等 pod
要设置在 AWS 上使用的对等 pod,您必须创建一个 secret 对象、AWS 镜像虚拟机(AMI)和 peer-pod ConfigMap。
为 AWS 设置对等 pod 后,您仍必须创建 KataConfig
自定义资源(CR)来使用 peer pod 部署 OpenShift 沙盒容器。
先决条件
- 在集群中安装了 Red Hat OpenShift 4.13。
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 - 已安装 OpenShift 沙盒容器 Operator。
3.3.2.1. 使用 CLI 为 AWS 创建 secret 对象
设置 AWS 访问密钥并在 secret 对象中配置网络。secret 对象用于创建 pod 虚拟机镜像,并由对等 pod 使用。
为 AWS 创建 secret 对象时,您必须设置特定的环境值。在创建 secret 对象前,您可以检索其中的一些值。但是,您必须准备以下值:
-
AWS_ACCESS_KEY_ID
-
AWS_SECRET_ACCESS_KEY
流程
收集 secret 对象所需的参数值。确保记下每个值。
检索实例 ID:
$ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')
secret 对象本身不需要这个值,而是用于检索 secret 对象的其他值。
检索 AWS 区域:
$ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}') && echo "AWS_REGION: \"$AWS_REGION\""
检索 AWS 子网 ID:
$ AWS_SUBNET_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SubnetId' --region ${AWS_REGION} --output text) && echo "AWS_SUBNET_ID: \"$AWS_SUBNET_ID\""
检索 AWS VPC ID:
$ AWS_VPC_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].VpcId' --region ${AWS_REGION} --output text) && echo "AWS_VPC_ID: \"$AWS_VPC_ID\""
检索 AWS 安全组 ID:
$ AWS_SG_IDS=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --region ${AWS_REGION} --output text) && echo "AWS_SG_IDS: \"$AWS_SG_IDS\""
使用以下清单创建 YAML 文件:
apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: AWS_ACCESS_KEY_ID: "<enter value>" 1 AWS_SECRET_ACCESS_KEY: "<enter value>" 2 AWS_REGION: "<enter value>" 3 AWS_SUBNET_ID: "<enter value>" 4 AWS_VPC_ID: "<enter value>" 5 AWS_SG_IDS: "<enter value>" 6
应用 secret 对象:
$ oc apply -f peer-pods-secret.yaml
secret 对象被应用。
3.3.2.2. 使用 CLI 创建 AWS 虚拟机镜像(AMI)
要使用 AWS 上的对等 pod 运行 OpenShift 沙盒容器,您必须首先使用 AWS 帐户和资源创建一个 RHEL AMI。
流程
运行以下 K8s 作业以创建镜像:
$ oc apply -f https://raw.githubusercontent.com/openshift/sandboxed-containers-operator/peer-pods-tech-preview/hack/aws-image-job.yaml
注意此镜像不由 OpenShift 沙盒容器管理。您可以使用 AWS Web 控制台或 AWS CLI 工具删除它。
等待作业完成:
$ oc wait --for=condition=complete job.batch/aws-image-creation --timeout=7m -n openshift-sandboxed-containers-operator
创建镜像后,您必须使用 peer-pod ConfigMap 设置镜像。
3.3.2.3. 使用 CLI 为 AWS 创建 peer-pod ConfigMap
为 AWS 创建 ConfigMap 时,您必须设置 AMI ID。在创建 ConfigMap 前,您可以检索这个值。
流程
检索 AMI ID。确保保存该值以便稍后保存。
$ PODVM_AMI_ID=$(aws ec2 describe-images --query "Images[*].[ImageId]" --filters "Name=name,Values=peer-pod-ami" --region ${AWS_REGION} --output text) && echo "PODVM_AMI_ID: \"$PODVM_AMI_ID\""
使用以下清单创建 YAML 文件:
apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "aws" VXLAN_PORT: "9000" PODVM_INSTANCE_TYPE: "t3.medium" PROXY_TIMEOUT: "5m" PODVM_AMI_ID: "<enter value>" 1
- 1
- 输入您检索到的 AMI ID 值。
部署 ConfigMap:
$ oc apply -f peer-pods-cm.yaml
ConfigMap 被部署。创建 KataConfig
CR 后,您可以使用 AWS 上的对等 pod 运行 OpenShift 沙盒容器。
3.3.3. 使用 CLI 为 Azure 设置对等 pod
要设置在 Microsoft Azure 上使用的对等 pod,您必须创建一个 secret 对象、Azure 镜像虚拟机、peer-pod ConfigMap 和 SSH 密钥 secret 对象。
为 Azure 设置对等 pod 后,您仍必须创建 KataConfig
自定义资源(CR)来使用 peer pod 部署 OpenShift 沙盒容器。
先决条件
- 在集群中安装了 Red Hat OpenShift 4.13。
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 - 已安装 OpenShift 沙盒容器 Operator。
3.3.3.1. 使用 CLI 为 Azure 创建 secret 对象
设置 Azure 访问密钥并在 secret 对象中配置网络。secret 对象用于创建 pod 虚拟机镜像,并由对等 pod 使用。
为 Azure 创建 secret 对象时,您必须设置特定的环境值。在创建 secret 对象前,您可以检索其中的一些值。但是,您必须准备以下值:
-
AZURE_CLIENT_ID
-
AZURE_CLIENT_SECRET
-
AZURE_TENANT_ID
流程
为 secret 对象收集额外的参数值。确保记下每个值。
检索订阅 ID:
$ AZURE_SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" -o tsv) && echo "AZURE_SUBSCRIPTION_ID: \"$AZURE_SUBSCRIPTION_ID\""
检索资源组:
$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""
检索 Azure 区域:
$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
使用以下清单创建 YAML 文件:
apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: AZURE_CLIENT_ID: "<enter value>" 1 AZURE_CLIENT_SECRET: "<enter value>" 2 AZURE_TENANT_ID: "<enter value>" 3 AZURE_SUBSCRIPTION_ID: "<enter value>" 4 AZURE_REGION: "<enter value>" 5 AZURE_RESOURCE_GROUP: "<enter value>" 6
应用 secret 对象:
$ oc apply -f peer-pods-secret.yaml
secret 对象被应用。
3.3.3.2. 使用 CLI 创建 Azure 虚拟机镜像
要使用 Azure 上的对等 pod 运行 OpenShift 沙盒容器,您必须首先使用 Azure 帐户和资源为 Azure 创建 RHEL 镜像。
流程
运行以下 K8s 作业以创建镜像:
$ oc apply -f https://raw.githubusercontent.com/openshift/sandboxed-containers-operator/peer-pods-tech-preview/hack/azure-image-job.yaml
注意此镜像不由 OpenShift 沙盒容器管理。如果需要,可以使用 Azure web 控制台或 Azure CLI 工具删除它。
等待作业完成:
$ oc wait --for=condition=complete job.batch/azure-image-creation --timeout=7m -n openshift-sandboxed-containers-operator
创建镜像后,您必须使用 peer-pod ConfigMap 设置镜像。
3.3.3.3. 使用 CLI 为 Azure 创建 peer-pod ConfigMap
为 Azure 创建 ConfigMap 时,您必须设置特定的配置值。在创建 ConfigMap 前,您可以检索这些值。
流程
收集 Azure peer-pod ConfigMap 的配置值。确保记下每个值。
检索 Azure 镜像 ID:
$ AZURE_IMAGE_ID=$(az image list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id: id} | [? contains(Id, 'peer-pod-vmimage')]" --output tsv) && echo "AZURE_IMAGE_ID: \"$AZURE_IMAGE_ID\""
检索 Azure VNet 名称:
$ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)
ConfigMap 不需要这个值,但用于检索 Azure 子网 ID。
检索 Azure 子网 ID:
$ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""
检索 Azure 网络安全组(NSG) ID:
$ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""
使用以下清单创建 YAML 文件:
apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "azure" VXLAN_PORT: "9000" AZURE_INSTANCE_SIZE: "Standard_B2als_v2" AZURE_SUBNET_ID: "<enter value>" 1 AZURE_NSG_ID: "<enter value>" 2 AZURE_IMAGE_ID: "<enter value>" 3 PROXY_TIMEOUT: "5m" DISABLECVM: "true"
部署 ConfigMap:
$ oc apply -f peer-pods-cm.yaml
ConfigMap 被部署。
3.3.3.4. 使用 CLI 为 Azure 创建 SSH 密钥 secret 对象
您必须生成 SSH 密钥并创建 SSH 密钥 secret 对象,以便在 Azure 中使用对等 pod。
流程
生成 SSH 密钥:
$ ssh-keygen -f ./id_rsa -N ""
创建 SHH secret 对象:
$ oc create secret generic ssh-key-secret -n openshift-sandboxed-containers-operator --from-file=id_rsa.pub=./id_rsa.pub --from-file=id_rsa=./id_rsa
SSH 密钥已创建,并且创建了 SSH 密钥 secret 对象。创建 KataConfig
CR 后,您可以使用 Azure 上的对等 pod 运行 OpenShift 沙盒容器。
3.3.4. 使用 CLI 创建 KataConfig 自定义资源
您必须创建一个 KataConfig
自定义资源(CR),以便在节点上安装 kata-remote-cc
作为 RuntimeClass
。创建 KataConfig
CR 会触发 OpenShift 沙盒容器 Operator 来执行以下操作:
-
在 RHCOS 节点上安装所需的 RHCOS 扩展,如 QEMU 和
kata-containers
。 - 确保 CRI-O 运行时配置了正确的运行时处理程序。
-
使用默认配置,创建一个名为
kata-remote-cc
的RuntimeClass
CR。这可让用户在RuntimeClassName
字段中引用 CR 将工作负载配置为使用kata-remote-cc
作为运行时。此 CR 也指定运行时的资源开销。
默认情况下,对等 pod 的 Kata 安装在所有 worker 节点上。如果要在特定节点上安装 kata-remote-cc
作为 RuntimeClass
,您可以在这些节点上添加标签,然后在创建时在 KataConfig
CR 中定义标签。
先决条件
- 在集群中安装了 Red Hat OpenShift 4.13。
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 - 已安装 OpenShift 沙盒容器 Operator。
创建 KataConfig
CR 会自动重启 worker 节点。重启可能需要 10 到 60 分钟。妨碍重启时间的因素如下:
- 带有更多 worker 节点的大型 Red Hat OpenShift 部署。
- 激活 BIOS 和 Diagnostics 实用程序。
- 在硬盘而不是 SSD 上部署。
- 在物理节点上部署,如裸机,而不是在虚拟节点上部署。
- CPU 和网络较慢。
流程
使用以下清单创建 YAML 文件:
apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: cluster-kataconfig spec: enablePeerPods: true logLevel: info
(可选)如果您要仅在所选节点上安装
kata-remote-cc
作为RuntimeClass
,请创建一个包含清单中的标签的 YAML 文件:apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: cluster-kataconfig spec: enablePeerPods: true logLevel: info kataConfigPoolSelector: matchLabels: <label_key>: '<label_value>' 1
- 1
kataConfigPoolSelector
中的标签只支持单个值;不支持nodeSelector
语法。
创建
KataConfig
资源:$ oc create -f cluster-kataconfig.yaml
创建新的 KataConfig
CR,并开始在 worker 节点上安装 kata-remote-cc
作为 RuntimeClass
。等待 kata-remote-cc
安装完成,以及 worker 节点重新引导,然后继续下一步。
OpenShift 沙盒容器仅将 kata-remote-cc
安装为集群上的辅助可选运行时,而不是主运行时。
验证
监控安装进度:
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
当 Is In Progress 的值显示为
false
后,安装就已完成。
其他资源
3.3.5. 使用 CLI 在沙盒容器中部署对等 pod 的工作负载
OpenShift 沙盒容器将 Kata 安装为集群上的辅助、可选运行时,而不是主运行时。
要使用沙盒容器中的对等 pod 部署 pod 模板工作负载,您必须将 kata-remote-cc
作为 runtimeClassName
添加到工作负载 YAML 文件中。
先决条件
- 在集群中安装了 Red Hat OpenShift 4.13。
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用具有
cluster-admin
角色的用户访问集群。 - 已安装 OpenShift 沙盒容器 Operator。
- 您已创建了一个 secret 对象和 peer-pod 配置映射,对云供应商是唯一的。
-
您已创建了
KataConfig
自定义资源 (CR)。
流程
将
runtimeClassName: kata-remote-cc
添加到任何 pod 模板对象中:-
Pod
对象 -
ReplicaSet
对象 -
ReplicationController
对象 -
StatefulSet
对象 -
Deployment
对象 -
deploymentConfig
对象
-
Pod 对象示例
apiVersion: v1 kind: Pod metadata: name: hello-openshift labels: app: hello-openshift spec: runtimeClassName: kata-remote-cc containers: - name: hello-openshift image: quay.io/openshift/origin-hello-openshift ports: - containerPort: 8888 securityContext: privileged: false allowPrivilegeEscalation: false runAsNonRoot: true runAsUser: 1001 capabilities: drop: - ALL seccompProfile: type: RuntimeDefault
Red Hat OpenShift 创建工作负载并开始调度它。
验证
-
检查 pod 模板对象上的
runtimeClassName
字段。如果runtimeClassName
是kata-remote-cc
,则工作负载使用对等 pod 在 OpenShift 沙盒容器上运行。