《OpenShift / RHEL / DevSecOps 汇总目录》
说明:本文初始是在 OpenShift 4.12 + OpenShift Virtualization 4.12 + ACM 2.8 或 MCE 2.3 的环境中验证,目前已经在 Local OpenShift 4.15 + OpenShift Virtualization 4.15 + MCE 2.5 的环境中验证(在单机版的 Local OpenShift 上运行需要有 64G 内存)
文章目录
技术架构
利用 OpenShift Virtualization 运行 OpenShift Hosted Cluster 即托管集群的架构如下图,该模式就是在 OpenShift 管理集群中的由 OpenShift Virtualization 提供的 VM 中运行托管集群的 Worker 节点。
安装配置环境
环境要求
- 如果是生产环境,建议在 Baremetal 环境中运行 OpenShift 管理集群。
- OpenShift 管理集群需要使用 Kubernetes-OVN 类型的 CNI。如果使用的是 OpenShiftSDN,可参考《Migrating to the OVN-Kubernetes network plugin》将其转换成 Kubernetes-OVN。
安装配置 OpenShift Virtualization
- 使用缺省配置安装 OpenShift Virtualization Operator。
- 然后在其内部使用缺省配置创建一个 OpenShift Virtualization Deployment。
安装配置 Red Hat ACM 或 MCE
- 使用缺省配置安装 Red Hat ACM Operator 或 MCE Operator。
- 使用缺省配置创建一个 MultiClusterHub 或 MultiClusterEngine (名称为 multiclusterengine) 对象。
- 如过是 OpenShift 4.12,执行命令允许 multiclusterengine 使用 hypershift-preview。
$ oc patch mce multiclusterengine --type=merge -p '{"spec":{"overrides":{"components":[{"name":"hypershift-preview","enabled":true}]}}}'
- 确认已有名为 hypershift-addon 的 ManagedClusterAddOn 对象。
$ oc get ManagedClusterAddOn hypershift-addon -n local-cluster
NAME AVAILABLE DEGRADED PROGRESSING
hypershift-addon True False
- 确认会自动创建 hypershift 项目并运行 pod 。
$ oc get deployment -n hypershift
NAME READY UP-TO-DATE AVAILABLE AGE
operator 2/2 2 2 6m6s
$ oc get pod -n hypershift
NAME READY STATUS RESTARTS AGE
operator-7fdc8d998b-8s7pl 1/1 Running 0 9h
operator-7fdc8d998b-l9xpd 1/1 Running 0 9h
安装配置 MetalLB
- 使用缺省配置安装 MetalLB Operator。
- 基于以下缺省配置创建一个 MetalLB 对象。
apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
name: metallb
namespace: metallb-system
- 创建一个 IPAddressPool 对象,其中的 IP 地址范围是节点网络中未使用的可用 IP 地址池,例如 192.168.1.101-192.168.1.120。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: ip-addresspool
namespace: metallb-system
spec:
addresses:
- 192.168.1.101-192.168.1.200
autoAssign: true
avoidBuggyIPs: false
- 基于以下 YAML 创建一个 L2Advertisement 对象。
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2-adv
namespace: metallb-system
spec:
ipAddressPools:
- ip-addresspool
修改 OpenShift 配置
- 执行命令,允许 OpenShift 的 ingresscontroller 使用 wildcard DNS routes,执行后才可以正常访问托管集群的控制台。
$ oc patch ingresscontroller -n openshift-ingress-operator default --type=json -p '[{ "op": "add", "path": "/spec/routeAdmission", "value": {wildcardPolicy: "WildcardsAllowed"}}]'
在 OpenShift Virtualization 中创建 OpenShift Hosted Cluster 托管集群
- 创建名为 clusters 的项目,这是托管集群关联的命名空间,默认使用 clusters。
$ oc new-project clusters
- 从 Red Hat 官方下载 pull-secret 文件,或从当前集群获得 pull-secret。
$ oc get secret -n openshift-config pull-secret -o template='{{index .data ".dockerconfigjson"}}' | base64 --decode > $HOME/pull-secret
使用控制台创建托管集群
- 在 RHACM 控制台的集群页面中点击“创建集群”,然后进入 Red Hat OpenShift Virtualization,再点击 “托管”就可看到创建集群的界面。
- 在“集群详情”步骤中点击“基础架构供应商凭证”的下拉框,然后点击“添加凭证”。
- 在“输入凭证基本信息”步骤中提供凭证名称和存放的命名空间。
- 在“输入 pull secret 和 SSH 秘钥”步骤中将 pull-secret 文件中的内容粘贴进去。然后在“复查”后完成添加凭证。
- 在下截图的步骤中选择刚刚添加的凭证,并提供集群名和发行镜像。
- 在下图步骤中提供节点池名称。
- 完成配置并创建托管集群,然后可查看托管集群状态。
使用命令创建托管集群
- 下载 hcp 命令客户端。
$ curl -Lk $(oc get consoleclidownload hcp-cli-download -o json | jq -r '.spec.links[] | select(.text=="Download hcp CLI for Linux for x86_64").href') | tar xvz ./
- 执行以下命令创建托管集群,其 Worker 节点将运行在有 kubevirt 供应的 VM 环境中。
$ export PULL_SECRET="$HOME/pull-secret"
$ export MEM="6Gi"
$ export CPU="2"
$ export WORKER_COUNT="2"
$ export CLUSTER_NAME=my-cluster-1
$ export OCP_VERSION=4.14.19
$ hcp create cluster kubevirt \
--name $CLUSTER_NAME \
--release-image quay.io/openshift-release-dev/ocp-release:$OCP_VERSION-x86_64 \
--node-pool-replicas $WORKER_COUNT \
--pull-secret $PULL_SECRET \
--memory $MEM \
--cores $CPU \
--auto-repair
- 可以执行以下命令查看和 my-cluster-1 托管集群相关资源的创建情况。
$ oc get vm -n clusters-my-cluster-1
$ oc get service -n clusters-my-cluster-1
$ oc get route -n clusters-my-cluster-1
$ oc get pvc -n clusters-my-cluster-1
$ oc get nodepool -n clusters
- 在托管集群成功创建后,可在 RHACM 中看到该集群。
访问托管集群
- 获得 my-cluster-1 托管集群的 kubeconfig。
$ hcp create kubeconfig --name my-cluster-1 > my-cluster-1-kubeconfig
- 查看 my-cluster-1 托管集群的 cluster operator。
$ oc get co --kubeconfig=my-cluster-1-kubeconfig
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE
console 4.14.19 True False False 8m7s
csi-snapshot-controller 4.14.19 True False False 16m
dns 4.14.19 True False False 8m10s
image-registry 4.14.19 True False False 8m12s
ingress 4.14.19 True False False 7m54s
insights 4.14.19 True False False 9m3s
kube-apiserver 4.14.19 True False False 16m
kube-controller-manager 4.14.19 True False False 16m
kube-scheduler 4.14.19 True False False 16m
kube-storage-version-migrator 4.14.19 True False False 8m33s
monitoring 4.14.19 True False False 49s
network 4.14.19 True False False 9m32s
node-tuning 4.14.19 True False False 11m
openshift-apiserver 4.14.19 True False False 16m
openshift-controller-manager 4.14.19 True False False 16m
openshift-samples 4.14.19 True False False 7m34s
operator-lifecycle-manager 4.14.19 True False False 15m
operator-lifecycle-manager-catalog 4.14.19 True False False 15m
operator-lifecycle-manager-packageserver 4.14.19 True False False 16m
service-ca 4.14.19 True False False 9m1s
storage 4.14.19 True False False 15m
- 查看 my-cluster-1 托管集群的节点。
$ oc get nodes --kubeconfig=my-cluster-1-kubeconfig
NAME STATUS ROLES AGE VERSION
my-cluster-1-e8c8e8b9-bpkkp Ready worker 21m v1.27.8+f10c92d
my-cluster-1-e8c8e8b9-v76qk Ready worker 21m v1.27.8+f10c92d
修改托管集群 Worker 节点配置
- 在管理集群的控制台中找到 NodePool 实例 my-cluster-1,点击进入后在 YAML 中修改 CPU 或 Memory 配置,例如将 Memory 调到 8G,然后保存。
- OpenShift 要使用新的 NodePool 配置逐个创建新的 VM 来替换原有节点。
- 最后可以在管理集群中查看 NodePool 以及对应的 VM,或在托管集群中查看 Node 的配置,确认内存都更新到 8G。
删除托管集群
- 可执行以下命令删除托管集群。
$ oc delete managedcluster my-cluster-1
$ hcp destroy cluster kubevirt --name my-cluster-1
2023-09-06T11:59:18Z INFO Found hosted cluster {"namespace": "clusters", "name": "my-cluster-1"}
2023-09-06T11:59:19Z INFO Updated finalizer for hosted cluster {"namespace": "clusters", "name": "my-cluster-1"}
2023-09-06T11:59:19Z INFO Deleting hosted cluster {"namespace": "clusters", "name": "my-cluster-1"}
2023-09-06T12:01:41Z INFO Deleting Secrets {"namespace": "clusters"}
2023-09-06T12:01:41Z INFO Deleted CLI generated secrets
2023-09-06T12:01:41Z INFO Finalized hosted cluster {"namespace": "clusters", "name": "my-cluster-1"}
2023-09-06T12:01:41Z INFO Successfully destroyed cluster and infrastructure {"namespace": "clusters", "name": "my-cluster-1d", "infraID": "my-cluster-1-zkrvf"}
- 确认在删除托管集群后,其对应的 PV 还会继续保存,如果需要也可手动删除。
演示视频
参考
https://cloud.redhat.com/blog/effortlessly-and-efficiently-provision-openshift-clusters-with-openshift-virtualization
https://github.com/RHsyseng/hypershift-baremetal-lab
https://labs.sysdeseng.com/hypershift-baremetal-lab/4.14/index.html
https://medium.com/@ben.swinney_ce/hypershift-with-kubevirt-564bd1f850ce