ãã¯ããã«
OpenShift Advent Calendar 2022 20æ¥ç® ã®æ稿ã§ãã
ã¿ãªãããããã«ã¡ã¯ãã¬ãããããã§OpenShiftã®ã½ãªã¥ã¼ã·ã§ã³ã¢ã¼ããã¯ãããã¦ããå°éã§ãã主ã«ã¨ãã¸ã³ã³ãã¥ã¼ãã£ã³ã°ãæ å½ãã¦ãã¾ãã
以åã®è¨äºã§ãã¨ãã¸ããã¤ã¹åãã®è»½éçOpenShiftã§ããMicroShiftã¨ãããªã¼ãã³ã½ã¼ã¹ããç´¹ä»ãã¾ããã
Kubernetesã§ã¨ãã¸ããã¤ã¹ã®ã¢ããªã±ã¼ã·ã§ã³ã®ã©ã¤ããµã¤ã¯ã«ã管çããå ´åãã¨ãã¸ããã¤ã¹ãæ°å°ã®å ã¯ç´æ¥kubectlã§äºè¶³ãã¾ãããæ¬çªå±éæã«æ°ä¸ä»¥ä¸ã®ã¨ãã¸ããã¤ã¹ã対象ã«ããå¿ è¦ãåºã¦ããã¨ãå¹çåãèããå¿ è¦ãåºã¦ãã¾ãããããããªæã¯ãAdvanced Cluster Management for Kubernetes(以éãACMã¨ç¥)ã使ãã¨ä¾¿å©ã§ãããã®ACMããæ£ã«ãã¨ãã¸ã¸ãã¯ã©ã¦ããã¤ãã£ããªã¢ããã¼ããæ¡å¼µãããããã«å¤§äºãªå½¹å²ãæ ãã¾ãã
æ¬ç¨¿ã§ã¯ãã¨ãã¸ããã¤ã¹ã¸ã¤ã³ã¹ãã¼ã«ããMicroShiftãAWSä¸ã«å±éããACMãã管çããç°¡åãªæé ããç´¹ä»ãã¾ãã ãªãããããããACMã¨ã¯ï¼ãã¨ããæ¹ã¯ã以ä¸ã®è¨äºããåç §ããã ãã¾ãã¨å¹¸ãã§ãã
ããã§ã¯ãå§ãã¦ããã¾ããããï¼
ACMãMicroShiftã§ä½¿ãå ´åã®æ§æ
ã¾ãã¯ACMã¨MicroShiftã¨ã§ã©ã®æ§ãªæ§æã«ãªãã®ãè¦ã¦ã¿ããã¨æãã¾ãã
ãã®çµµãè¦ã¦ã¿ãã¨ãACMãã¨ãã¸ã®Hubã¨ãªã£ã¦ãHelmãGitãArgoCDãªã©ã®å¤é¨ã·ã¹ãã ã¨é£æºãããªãã¬ã¼ã·ã§ã³ãã¨ãã¸ã¸ãé©ç¨ããå½¹å²ã«è¦ãã¾ãã
OpenShiftã§ACMãå©ç¨ããå ´åã¯ãACMãAPIããªãã³ã®OpenShiftã¯ã©ã¹ã¿ã®ãããã¸ã§ãã³ã°æ©è½(OpenShift Hive)ã¨é£æºããOpenShiftã¯ã©ã¹ã¿ã®ã¤ã³ã¹ãã¼ã«ãACMããè¡ããã¨ãå¯è½ã§ããä¸æ¹ãMicroShiftã§ACMãå©ç¨ããå ´åã¯ã(å°ãªãã¨ãç¾æç¹ã¯)ã¨ãã¸ããã¤ã¹ã¸ãããã¸ã§ãã³ã°æ¸ã¿ã®MicroShiftãACMã¸ã¤ã³ãã¼ããã¦å©ç¨ãã¾ãã
ä¸çªã·ã³ãã«ãªä½¿ãæ¹ã¯ãã¯ã©ã¦ãããªã³ãã¬ãã¹ã®ç°å¢ã§ã»ããã¢ããããHubã¯ã©ã¹ã¿å´ã§ã¢ããªã±ã¼ã·ã§ã³ã®é ç½®ããªã·(Placement)ãå®ç¾©ããHubã¯ã©ã¹ã¿å´ã§ç®¡çãããã¯ã©ã¹ã¿ã©ãã«ã«å¿ãã¦ãMicroShiftã¸ã®ã¢ããªã±ã¼ã·ã§ã³ã®é ç½®ãã³ã³ããã¼ã«ãã使ãæ¹ã§ãã
æ§ç¯ã«å½ãã£ã¦ã¯ãããããMicroShiftãACMãã¤ã³ã¹ãã¼ã«ãããç¶æ ã§ã
â ã¾ãHubã¯ã©ã¹ã¿ãä½ã
â¡æ¬¡ã«MicroShiftãHubã¯ã©ã¹ã¿ã¸ç»é²ããããã®èªè¨¼æ å ±ãåå¾ãã
â¢ããã¦ãMicroShiftã¸Klusterletã¨Addon Agentããããã¤ããåå¾ããèªè¨¼æ å ±ã使ã£ã¦Hubã¯ã©ã¹ã¿ã«ç»é²ããã
ã®3ã¹ãããã§å®äºã§ãã以ä¸ãæ§ç¯ãé²ãã¦ããã¾ãããã
äºåæºå
ã¨ãã¸ããã¤ã¹ã¸MicroShiftãã¤ã³ã¹ãã¼ã«
ã¾ãã¯èå¿ã®MicroShiftãã¨ãã¸ããã¤ã¹ã«ã¤ã³ã¹ãã¼ã«ããæ¹æ³ãè¨è¼ãã¦ããã¾ããMicroShiftã®ã¤ã³ã¹ãã¼ã«ã¯ä»¥ä¸ã®å ¬å¼ããã¥ã¡ã³ããåç §ãã¦ãã ããã RHELã¸ã¤ã³ã¹ãã¼ã«ããå ´åã¯ãã¬ããããã¨ã®ããã±ã¼ã¸ãªãã¸ããªããdnfã§ã¤ã³ã¹ãã¼ã«ã§ãã¾ãã
# CRI-Oã®ã¤ã³ã¹ãã¼ã« $ command -v subscription-manager &> /dev/null \ && subscription-manager repos --enable rhocp-4.8-for-rhel-8-x86_64-rpms $ sudo dnf install -y cri-o cri-tools $ sudo systemctl enable crio --now # MicroShiftã®ã¤ã³ã¹ãã¼ã« $ sudo dnf copr enable -y @redhat-et/microshift $ sudo dnf install -y microshift
ã¡ãªã¿ã«ãUbuntuãªã©ã®Debianç³»ã¸ã¤ã³ã¹ãã¼ã«ãããå ´åã¯ã以ä¸ã®æé ã§ã¤ã³ã¹ãã¼ã«ãããã¨ãã§ãã¾ãã ããããCRI-Oãå ¥ãã¦ãMicroShiftãã¤ããªãé ç½®ããèµ·åãããã¨ããæµãã§ãã
åèãµã¤ã. microshift-on-jetson.md · GitHub
# CRI-Oã®ã¤ã³ã¹ãã¼ã« $ echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list $ echo "deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /" > /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list $ curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | apt-key add - $ curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | apt-key add - $ apt-get update $ apt-get install cri-o cri-o-runc # MicroShiftã®ã¤ã³ã¹ãã¼ã« $ export ARCH=arm64 $ export VERSION=$(curl -s https://api.github.com/repos/redhat-et/microshift/releases | grep tag_name | head -n 1 | cut -d '"' -f 4) $ curl -LO https://github.com/redhat-et/microshift/releases/download/$VERSION/microshift-linux-${ARCH} $ mv microshift-linux-${ARCH} /usr/local/bin/microshift; chmod 755 /usr/local/bin/microshift ## systemdã§ç®¡çããããã«ãã $ cat << EOF > /usr/lib/systemd/system/microshift.service [Unit] Description=MicroShift After=crio.service [Service] WorkingDirectory=/usr/local/bin/ ExecStart=/usr/local/bin/microshift run Restart=always User=root [Install] WantedBy=multi-user.target EOF $ systemctl enable crio --now $ systemctl enable microshift.service --now
MicroShiftã®ãã¤ããªãsystemdãªãã§èµ·åããã¨ãCRI-Oã¨é£æºãã¦Podãèµ·åãã¦ãããã¨ããä»çµã¿ã§ã¤ã³ã¹ãã¼ã«ãèµ°ãæãã§ããã
æçµçã«ä»¥ä¸ã®PodãRunningã«ãªãã°æ£å¸¸ã«ã¤ã³ã¹ãã¼ã«ã§ãã¦ãã¾ãã
$ oc get po -A NAMESPACE NAME READY STATUS kube-system console-deployment-57cdc94d5d-tsbzr 1/1 Running kube-system kube-flannel-ds-ch28c 1/1 Running kubevirt-hostpath-provisioner kubevirt-hostpath-provisioner-q75vd 1/1 Running openshift-dns dns-default-qjlfh 2/2 Running openshift-dns node-resolver-nq4jl 1/1 Running openshift-ingress router-default-6c96f6bc66-sv6wn 1/1 Running openshift-service-ca service-ca-7bffb6f6bf-r6z4n 1/1 Running
ACMãã¤ã³ã¹ãã¼ã«
次ã«ãOpenShiftãã¤ã³ã¹ãã¼ã«ãããç°å¢ã«ã¦ãOperatorãç¨ãã¦ACMãã¤ã³ã¹ãã¼ã«ãã¦ããã¾ãã
ACMã®ã¤ã³ã¹ãã¼ã«èªä½ã¯è¶ ç°¡åã§ãOperatorHubãããAdvanced Cluster Managementããæ¤ç´¢ãã¦ã¤ã³ã¹ãã¼ã«ãã¿ã³ãæ¼ãããã£ãããã ãã§ãï¼(使ããããã¼ã¸ã§ã³ãããå ´åã¯ã¤ã³ã¹ãã¼ã«ãã¿ã³ãæ¼ããå¾ã®ç»é¢ã§é©å®é¸æãã¦ãã ãã)
ãªããæ¬ç¨¿ã§ã¯AWSä¸ã¸OpenShift 4.11ãã¤ã³ã¹ãã¼ã«ãã¦æ§ç¯ãã¦ãã¾ãã
ACMã§MicroShiftã管çãã
æºåãæ´ãã¾ããã®ã§ãACMã¸MicroShiftã管çã§ããæ§ã«ãã¦ã¿ã¾ãã
â Hubã¯ã©ã¹ã¿ã®ã»ããã¢ãã
ã¤ã³ã¹ãã¼ã«æ¸ã¿ã®Operatorã®ACMã®ç»é¢ãéãããMultiClusterHubãã¤ã³ã¹ã¿ã³ã¹ãä½æãã¾ããããã§ã¯ããã¤ã³ã¹ã¿ã³ã¹ã®ä½æããã¿ã³ãæ¼ãã¦ãç¹ã«ä½ãå¤æ´ãã[ä½æ]ãã¿ã³ãæ¼ãã¾ãã
ããã¨ãé 次Podãèµ·åããOpenShiftã®ã³ã³ã½ã¼ã«ç»é¢ãæ´æ°ããã¦ãå·¦ã¡ãã¥ã¼ã«ã¯ã©ã¹ã¿é¸æã®ã¡ãã¥ã¼ã追å ããã¾ãã
â¡MicroShiftãHubã¯ã©ã¹ã¿ã«ç»é²ããããã®èªè¨¼æ å ±ã®åå¾
Hubã¯ã©ã¹ã¿ã¸Managedã¯ã©ã¹ã¿ãç»é²ããã®ã«å¿ è¦ãªèªè¨¼æ å ±ãçºè¡ãã¾ãã
ç»é²ãããã¯ã©ã¹ã¿ã®ååã§Projectï¼Namespaceï¼ãä½ããACMã®ã«ã¹ã¿ã ãªã½ã¼ã¹ã§ããManagedClusterãªã½ã¼ã¹ã¨KlusterletAddonConfigãªã½ã¼ã¹ãä½æãã¾ãã
$ export CLUSTER_NAME=device01 $ oc new-project ${CLUSTER_NAME} $ oc label namespace ${CLUSTER_NAME} cluster.open-cluster-management.io/managedCluster=${CLUSTER_NAME} # ManagedClusterãªã½ã¼ã¹ãä½æ $ cat <<EOF | oc apply -f - apiVersion: cluster.open-cluster-management.io/v1 kind: ManagedCluster metadata: name: device01 spec: hubAcceptsClient: true EOF # KlusterletAddonConfigãä½æ $ cat <<EOF | oc apply -f - apiVersion: agent.open-cluster-management.io/v1 kind: KlusterletAddonConfig metadata: name: device01 namespace: device01 spec: clusterName: device01 clusterNamespace: device01 applicationManager: enabled: true certPolicyController: enabled: false clusterLabels: cloud: auto-detect vendor: auto-detect iamPolicyController: enabled: false policyController: enabled: false searchCollector: enabled: true version: 2.5.0 EOF
ãããã§ã¹ããapplysããã¨ãHubã¯ã©ã¹ã¿ã«ä»¥ä¸ã®2ã¤ã®ã«ã¹ã¿ã ãªã½ã¼ã¹ãä½æããã¾ãã
$ oc get klusterletaddonconfig device01 NAME AGE device01 29s $ oc get managedcluster device01 NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE device01 true
ã¾ããMicroShiftå´ã§applyããå¿ è¦ãããã«ã¹ã¿ã ãªã½ã¼ã¹ã¨Hubã¯ã©ã¹ã¿ã¸ç»é²ããããã®èªè¨¼æ å ±ãSecretã¨ãã¦èªåä½æããã¾ãã®ã§ãyamlãã¡ã¤ã«ã¨ãã¦åãåºãã¦ããã¾ãã
$ oc get secret ${CLUSTER_NAME}-import -n ${CLUSTER_NAME} -o jsonpath={.data.crds\\.yaml} | base64 --decode > klusterlet-crd.yaml $ oc get secret ${CLUSTER_NAME}-import -n ${CLUSTER_NAME} -o jsonpath={.data.import\\.yaml} | base64 --decode > import.yaml
â¢MicroShiftã®ç°å¢ãHubã¯ã©ã¹ã¿ã¸ç»é²
â¡ã§ä½æããklusterlet-crd.yaml
ã¨import.yaml
ãMicroShiftä¸ã§oc applyããKlusterletã¨Addon AgentãMicroShiftç°å¢ã¸ãããã¤ãã¾ãã
ãªãããªã¼ãã³ã½ã¼ã¹ã®MicroShiftä¸ã«ãããã¤ããã«ã¯ã¬ãããããã«ã¹ã¿ãã¼ãã¼ã¿ã«ã®ã¢ã«ã¦ã³ããå¿ è¦ã§ããè³¼å ¥ãããµãã¹ã¯ãªãã·ã§ã³ã管çããã¢ã«ã¦ã³ãã¨åããã®ãå©ç¨ããããRed Hat Developerããã°ã©ã ãã30æ¥éã®è©¦ç¨çãµãã¹ã¯ãªãã·ã§ã³ã使ããªã©ãã¦ãéçºè ç¨ã®ã¬ãããããã®ã³ã³ããã¬ã¸ã¹ããª(registry.redhat.io)ã¸ãã°ã¤ã³ã§ããããã«æºåãã¦ããå¿ è¦ãããã¾ãã
詳細ã¯ä»¥ä¸ã®ãªã³ã¯ããåç §ãã ããã
â¡ã§åºåãããããã§ã¹ããMicroShiftå´ã§applyãã¾ãã
$ oc apply -f klusterlet-crd.yaml $ oc apply -f import.yaml
registry.redhat.ioã¸ã®ImagePullSecretãæå®ãã¾ãã
$ export RH_USERNAME=<ã¬ãããããã«ã¹ã¿ãã¼ãã¼ã¿ã«ã®ã¢ã«ã¦ã³ãã®ã¦ã¼ã¶å> $ export RH_PASSWORD=<ã¬ãããããã«ã¹ã¿ãã¼ãã¼ã¿ã«ã®ã¢ã«ã¦ã³ãã®ãã¹ã¯ã¼ã> $ export EMAIL=<ç»é²ããã¡ã¼ã«ã¢ãã¬ã¹> $ oc project open-cluster-management-agent $ oc create secret docker-registry open-cluster-management-image-pull-credentials \ --docker-server=registry.redhat.io \ --docker-username=${RH_USERNAME} \ --docker-password=${RH_PASSWORD} \ --docker-email=${EMAIL} $ oc secrets link klusterlet open-cluster-management-image-pull-credentials --for=pull $ oc secrets link klusterlet-registration-sa open-cluster-management-image-pull-credentials --for=pull $ oc secrets link klusterlet-work-sa open-cluster-management-image-pull-credentials --for=pull $ oc project open-cluster-management-agent-addon $ oc create secret docker-registry open-cluster-management-image-pull-credentials \ --docker-server=registry.redhat.io \ --docker-username=$RH_USERNAME \ --docker-password=$RH_PASSWORD \ --docker-email=$EMAIL $ oc secrets link cluster-proxy open-cluster-management-image-pull-credentials --for=pull $ oc secrets link klusterlet-addon-search open-cluster-management-image-pull-credentials --for=pull $ oc secrets link application-manager open-cluster-management-image-pull-credentials --for=pull $ oc secrets link klusterlet-addon-workmgr open-cluster-management-image-pull-credentials --for=pull
MicroShiftä¸ã«ä¸è¨ã®Podãèµ·åãã¦ãã¾ããRunningã¨ãªãã¾ã§å¾ ã¡ã¾ãããã
$ oc get po -A | grep open-cluster open-cluster-management-agent-addon application-manager-7488766d49-vs4f2 1/1 Running open-cluster-management-agent-addon cluster-proxy-proxy-agent-66dd8845b-ndzpw 2/2 Running open-cluster-management-agent-addon cluster-proxy-proxy-agent-66dd8845b-qm8ts 2/2 Running open-cluster-management-agent-addon klusterlet-addon-search-5bdfd9685-tc4br 1/1 Running open-cluster-management-agent-addon klusterlet-addon-workmgr-7c6b8679bd-vqbcc 1/1 Running open-cluster-management-agent klusterlet-54d4bfd556-zm7gr 1/1 Running open-cluster-management-agent klusterlet-registration-agent-557cb5bb4b-vtclx 1/1 Running open-cluster-management-agent klusterlet-work-agent-5598cdf789-lht8k 1/1 Running
MicroShiftå´ã§klusterlet-registration-agent PodãRunningã¨ãªãã¨ãHubã¯ã©ã¹ã¿ã®æ¹ããManagedã¯ã©ã¹ã¿ã®StatusãReadyã¸å¤ããã¯ãã§ãã
ã¢ããªã³ãå ¨ã¦Availableã«ãªã£ããå®äºã§ãã
Hubã¯ã©ã¹ã¿ããManagedã¯ã©ã¹ã¿ã¸ã¢ããªããããã¤ãã¦ã¿ã
Hubã¯ã©ã¹ã¿ã§MicroShiftã管çã§ããããã«ãªã£ãã®ã§ãACMãç¨ãã¦ã¢ããªã±ã¼ã·ã§ã³ãMicroShiftã¸ãããã¤ãã¦ã¿ã¾ããããã¾ãã¯ãHubã¯ã©ã¹ã¿ä¸ã§ç®¡çä¸ã®MicroShiftã«ä»»æã®ã©ãã«ãä»ä¸ãã¦ããã¾ãã
âHubã¯ã©ã¹ã¿å´
$ kubectl label managedcluster device01 device=device01
ãã®ã©ãã«ã¯Hubã¯ã©ã¹ã¿ã§ã¢ããªã±ã¼ã·ã§ã³ã®é ç½®ããªã·ãå®ç¾©ããéã«ãã©ã®ã¯ã©ã¹ã¿ã¸ã¢ããªã±ã¼ã·ã§ã³ãé ç½®ãããå¤æããããã«ä½¿ç¨ããã¾ããåãã©ãã«ãè¤æ°ã®MicroShiftã¯ã©ã¹ã¿ã¸ä»ä¸ãã¦ããã°ãåãã¢ããªã±ã¼ã·ã§ã³ããã®ã©ãã«ãä»ä¸ãããè¤æ°ã®MicroShiftã¸ä¸æã«ãããã¤ã§ãã¾ãã
ã©ãã«ãä»ä¸ããããä»åº¦ã¯Hubã¯ã©ã¹ã¿ã§Subscriptionãä½æãã¦ã¿ã¾ãã以ä¸ã«åèã¨ãã¦ãhttps://github.com/stolostron/application-samplesã®nginxããããã¤ãããããã§ã¹ããè¨è¼ãã¦ããã¾ãã
âHubã¯ã©ã¹ã¿å´
$ vi nginx-subscription.yaml apiVersion: v1 kind: Namespace metadata: name: nginx-sample --- apiVersion: app.k8s.io/v1beta1 kind: Application metadata: name: nginx-sample namespace: nginx-sample spec: componentKinds: - group: apps.open-cluster-management.io kind: Subscription descriptor: {} selector: matchExpressions: - key: app operator: In values: - nginx-sample --- apiVersion: apps.open-cluster-management.io/v1 kind: Subscription metadata: annotations: apps.open-cluster-management.io/git-branch: production apps.open-cluster-management.io/git-path: nginx apps.open-cluster-management.io/reconcile-option: merge labels: app: nginx-sample name: nginx-sample-subscription-1 namespace: nginx-sample spec: channel: ggithubcom-stolostron-application-samples-ns/ggithubcom-stolostron-application-samples placement: placementRef: kind: PlacementRule name: nginx-sample-placement-1 --- apiVersion: apps.open-cluster-management.io/v1 kind: PlacementRule metadata: labels: app: nginx-sample name: nginx-sample-placement-1 namespace: nginx-sample spec: clusterSelector: matchLabels: 'device': 'device01' $ oc apply -f nginx-subscription.yaml namespace/nginx-sample unchanged application.app.k8s.io/nginx-sample created subscription.apps.open-cluster-management.io/nginx-sample-subscription-1 created placementrule.apps.open-cluster-management.io/nginx-sample-placement-1 created
MicroShiftå´ãè¦ã¦ã¿ãã¨ãHubã¯ã©ã¹ã¿ã§æå®ããnginx-sample
Namespaceã«nginxãèµ·åãã¦ããã®ããããã¾ãã
âMicroShiftå´
$ oc get po -n nginx-sample NAME READY STATUS RESTARTS AGE nginx-sample-7667b4ff65-6dg4r 1/1 Running 0 3m35s nginx-sample-7667b4ff65-rwlpx 1/1 Running 0 3m35s nginx-sample-7667b4ff65-zvbng 1/1 Running 0 3m35s
ãã¡ãããHubã¯ã©ã¹ã¿å´ã«ã¯nginxã¯ä½æããã¦ãã¾ããã
âHubã¯ã©ã¹ã¿å´
$ oc get po -n nginx-sample No resources found in nginx-sample namespace.
ACMã®GUIããã以ä¸ã®ãããªãããã¸ã¼ãã¥ã¼ã§ãªã½ã¼ã¹ã®ä½æç¶æ³ã確èªãããã¨ãã§ãã¾ãã
ãã¾ã¨ã
æ¬ç¨¿ã§ã¯ãAdvanced Cluster Management for Kubernetseã使ã£ã¦MicroShiftãã¤ã³ã¹ãã¼ã«ãããã¨ãã¸ããã¤ã¹ã¸ã¢ããªã±ã¼ã·ã§ã³ãå±éããç°¡åãªæé ããç´¹ä»ãã¾ãããä»åãç´¹ä»ããæ¹æ³ãåºæ¬ã¨ãã¦ãä¾ãã°ArgoCDã¨ACMãé£æºããããã¨ã§ã¨ãã¸ããã¤ã¹ã«å¯¾ãã¦GitOpsã§ã¢ããªã±ã¼ã·ã§ã³ããªãªã¼ã¹ãããã¨ãå¯è½ã«ãªãã¾ãããã®è¾ºãã®è©±ãè¿ã ãããã¨æãã¾ããï¼
æå¾ã«...
Save the date!!! 27th Jan ==> "OpenShift.Run 2023"
å¹´æãããã¾ãï¼OpenShift.Runï¼ ã¾ã OpenShift User Groupã«å ¥ã£ã¦ãªã人ã¯ãã²ãåå ã®ç¨ãããããé¡ããã¾ãï¼
ã¾ããOpenShift.Runã«è³ãéã®ãâ¦ã¨ãããã¨ã§ãããã¬ã©ã³ï¼ã¨ããªãã¤OpenShiftããéå¬ä¸ã§ããåå¿è ã®æ¹ããä¸ç´è ã®æ¹ã¾ã§ãå®éã«æãåãããªãã OpenShift ã楽ããã§é ããä¼ã¨ãã¦ããèªèº«ã®ã¹ãã¼ãæã§ãã£ãããã¬ã©ã³ã§ãã¾ãããã¡ãã奮ã£ã¦ãåå ãã ããã¾ãã