0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

OpenShiftクラスターへのBYOHのWindowsノード追加

Last updated at Posted at 2021-10-10

はじめに

OpenShift 4.8では、BYOH(Bring Your Own Host)のWindowsノードがサポートされました。

We are proud to announce the general availability of Bring Your Own Host Support for Windows nodes

下記(1)に加えて(2)が追加され、利用が容易になったと理解しています。

(1) AWS・Azure・vSphereのIPI環境で利用可能。カスタムリソースMachineとして管理。
(2) vSphere・ベアメタルのUPI環境で利用可能。非Machineとして管理。

サポート条件は満たさないながら、IBM CloudにUPIインストールしたOpenShiftクラスターにBYOHのWindowsノードを追加することができたので記事として残します。
image.png

下記のRed Hatブログを参考にしています。

1. 事前準備

1.1. ハイブリッドネットワークでOpenShiftをUPIインストール

サポート対象のネットワーク設定は、OVN-Kubernetesを使用したハイブリッドネットワークのみです。

過去記事では、ハイブリッドネットワークを有効にしていなかったのでOpenShiftを再インストールします。ignitionファイルの作成方法が異なります(下記の追加部分)。

classicノード
mkdir bare-metal
cp -p install-config.yaml bare-metal/
./openshift-install create manifests --dir=bare-metal
cp -p 99_*.yaml bare-metal/openshift/

### 追加部分 開始
cp -p cluster-network-03-config.yml bare-metal/manifests/
### 追加部分 終了

./openshift-install create ignition-configs --dir=bare-metal
cp -p bare-metal/*.ign /var/www/html/
chmod 644 /var/www/html/*.ign
ls -l /var/www/html/*.ign
### 標準出力↓
-rw-r--r--. 1 root root 272100  9月 26 20:39 /var/www/html/bootstrap.ign
-rw-r--r--. 1 root root   1715  9月 26 20:39 /var/www/html/master.ign
-rw-r--r--. 1 root root   1715  9月 26 20:39 /var/www/html/worker.ign
cluster-network-03-config.yml
apiVersion: operator.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  defaultNetwork:
    ovnKubernetesConfig:
      hybridOverlayConfig:
        hybridClusterNetwork:
        - cidr: 10.132.0.0/14
          hostPrefix: 23

インストール後、OVN-Kubernetesを使用したハイブリッドネットワークであることを確認します。

classicノード
oc get network.operator cluster -o jsonpath='{.spec.defaultNetwork.type}{"\n"}'
### 標準出力↓
OVNKubernetes

oc get network.operator cluster -o jsonpath='{.spec.defaultNetwork.ovnKubernetesConfig}{"\n"}' | jq -r
### 標準出力↓
{
  "genevePort": 6081,
  "hybridOverlayConfig": {
    "hybridClusterNetwork": [
      {
        "cidr": "10.132.0.0/14",
        "hostPrefix": 23
      }
    ]
  },
  …
}

1.2. 仮想サーバー・インスタンス作成

DNS Servicesに以下のエントリを追加し、仮想サーバー・インスタンス「worker-3」を作成します。「worker-3」はworker-0と同じサブネットで、OSはWindows Server 2019 Server Coreです。Windowsノードは、workerノードと同じサブネットにする必要があります。
image.png

classicノード
./instance-create.sh worker-3 vpc-ocp jp-tok-1 bx2-4x16 subnet-tok1 10.244.0.112
instance-create.sh
# !/bin/sh

ins=${1}
vpc=${2}
zone=${3}
prof=${4}
sub=${5}
ip=${6}

vpcid=`ibmcloud is vpcs | grep ${vpc} | awk '{print $1}'`
subid=`ibmcloud is subnets | grep ${vpc} | grep ${sub} | awk '{print $1}'`
imageid=r022-c30b6a15-3e4a-45c0-8d2c-747af2f0d19a
secgid=`ibmcloud is security-groups | grep ${vpc} | awk '{print $1}'`
keyid=`ibmcloud is keys | grep "sshkey" | awk '{print $1}'`

tmp={\"name\":\"eth0\",\"subnet\":{\"id\":\"${subid}\"},\"primary_ipv4_address\":\"${ip}\",\"security_groups\":[{\"id\":\"${secgid}\"}]}

ibmcloud is instance-create ${ins} ${vpcid} ${zone} ${prof} ${subid} \
  --image-id ${imageid} \
  --primary-network-interface ${tmp} \
  --key-ids ${keyid}

exit 0

1.3. Windowsノードの設定

WindowsノードにSSHサーバーを導入し、classicノードで作成した公開鍵で認証が可能なように設定します。後続の手順でWindows Machine Configオペレーターに秘密鍵を登録します。SSHサーバーの構成には、Red Hatブログ掲載のスクリプトを利用しています。

classicノード(10.192.36.132)
ssh-keygen -t rsa -f /root/.ssh/windows_node -q -N ''
cp -p /root/.ssh/windows_node.pub /var/www/html/
Windowsノード
wget https://red.ht/3gOAA6y -OutFile install-openssh.ps1
wget http://10.192.36.132:8080/windows_node.pub -OutFile windows_node.pub
.\install-openssh.ps1 .\windows_node.pub

次にDockerを導入します。

Windowsノード
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Set-PSRepository PSGallery -InstallationPolicy Trusted
Install-Module -Name DockerMsftProvider -Repository PSGallery
Install-Package -Name docker -ProviderName DockerMsftProvider
Restart-Computer -Force

※1 OpenShiftはclassicノードをプロキシとしてインターネットに接続しています。しかし、WindowsノードへのSSH導入などをプロキシ経由とする方法が分からなかったので、パブリック・ゲートウェイをWindowsノードのサブネットに接続しました。
※2 Windowsノードのビルドバージョンは「17763.1879」でした。

2. OpenShiftへのBYOHのWindowsノード追加

2.1. Windows Machine Configオペレーター導入

OpenShiftコンソールから、Windows Machine Configオペレーターを導入します。
image.png
pic.PNG

OVN-Kubernetesでハイブリッドネットワークを有効にしていれば、ネームスペース「openshift-windows-machine-config-operator」のオペレーターPodがRunning状態になります。

classicノード
oc get pod -n openshift-windows-machine-config-operator
### 標準出力↓
NAME                                               READY   STATUS    RESTARTS   AGE
windows-machine-config-operator-68c98d44fc-22xr5   1/1     Running   5          3d22h

また、ネームスペース「openshift-windows-machine-config-operator」にWindowsノード接続用のsecretを作成します。

classicノード
oc create secret generic cloud-private-key \
  --from-file=private-key.pem=/root/.ssh/windows_node \
  -n openshift-windows-machine-config-operator

2.2. Windowsノード追加

ConfigMapを適用すると、Windows Machine ConfigオペレーターPodがWindowsノードを追加します。

classicノード
oc get nodes
### 標準出力
master-0   Ready    master   4d    v1.21.1+051ac4f
master-1   Ready    master   4d    v1.21.1+051ac4f
master-2   Ready    master   4d    v1.21.1+051ac4f
worker-0   Ready    worker   4d    v1.21.1+051ac4f
worker-1   Ready    worker   4d    v1.21.1+051ac4f
worker-2   Ready    worker   4d    v1.21.1+051ac4f

oc apply -f windows-node.yaml

oc get nodes
### 標準出力
NAME       STATUS   ROLES    AGE     VERSION
master-0   Ready    master   4d2h    v1.21.1+051ac4f
master-1   Ready    master   4d2h    v1.21.1+051ac4f
master-2   Ready    master   4d2h    v1.21.1+051ac4f
worker-0   Ready    worker   4d1h    v1.21.1+051ac4f
worker-1   Ready    worker   4d1h    v1.21.1+051ac4f
worker-2   Ready    worker   4d1h    v1.21.1+051ac4f
worker-3   Ready    worker   3m39s   v1.21.1-1398+98073871f173ba
windows-node.yaml
kind: ConfigMap
apiVersion: v1
metadata:
  name: windows-instances
  namespace: openshift-windows-machine-config-operator
data:
  10.244.0.112: |-
    username=Administrator
classicノード
oc logs windows-machine-config-operator-68c98d44fc-22xr5 -n openshift-windows-machine-config-operator -f
### 標準出力↓
{"level":"info","ts":1633082380.6159787,"logger":"controllers.configmap","msg":"processing","instances in":"windows-instances"}
{"level":"info","ts":1633082410.7295609,"logger":"wc 10.244.0.112","msg":"configuring"}
{"level":"info","ts":1633082410.896953,"logger":"wc 10.244.0.112","msg":"transferring files"}
{"level":"info","ts":1633082444.3505418,"logger":"wc 10.244.0.112","msg":"configured","service":"windows_exporter","args":"--collectors.enabled cpu,cs,logical_disk,net,os,service,system,textfile,container,memory,cpu_info\""}
{"level":"info","ts":1633082447.0613866,"logger":"wc 10.244.0.112","msg":"configured kubelet","cmd":"C:\\k\\\\wmcb.exe initialize-kubelet --ignition-file C:\\Windows\\Temp\\worker.ign --kubelet-path C:\\k\\kubelet.exe --node-ip=10.244.0.112","output":"Bootstrapping completed successfully"}
{"level":"info","ts":1633082477.1159537,"logger":"wc 10.244.0.112","msg":"configure","service":"hybrid-overlay-node","args":"--node worker-3 --k8s-kubeconfig c:\\k\\kubeconfig --windows-service --logfile C:\\var\\log\\hybrid-overlay\\hybrid-overlay.log\" depend= kubelet"}
{"level":"info","ts":1633082598.3541875,"logger":"wc 10.244.0.112","msg":"configured","service":"hybrid-overlay-node","args":"--node worker-3 --k8s-kubeconfig c:\\k\\kubeconfig --windows-service --logfile C:\\var\\log\\hybrid-overlay\\hybrid-overlay.log\" depend= kubelet"}
{"level":"info","ts":1633082644.9759097,"logger":"wc 10.244.0.112","msg":"configured kubelet for CNI","cmd":"C:\\k\\wmcb.exe configure-cni --cni-dir=\"C:\\k\\cni\\ --cni-config=\"C:\\k\\cni\\config\\cni.conf","output":"CNI configuration completed successfully"}
{"level":"info","ts":1633082649.1335378,"logger":"wc 10.244.0.112","msg":"configured","service":"kube-proxy","args":"--windows-service --v=4 --proxy-mode=kernelspace --feature-gates=WinOverlay=true --hostname-override=worker-3 --kubeconfig=c:\\k\\kubeconfig --cluster-cidr=10.132.0.0/24 --log-dir=C:\\var\\log\\kube-proxy\\ --logtostderr=false --network-name=OVNKubernetesHybridOverlayNetwork --source-vip=10.132.0.196 --enable-dsr=false --feature-gates=IPv6DualStack=false\" depend= hybrid-overlay-node"}
{"level":"info","ts":1633082664.1910317,"logger":"nc 10.244.0.112","msg":"instance has been configured as a worker node","version":"3.1.0+06e96071"}
{"level":"info","ts":1633082664.2283046,"logger":"metrics","msg":"Prometheus configured","endpoints":"windows-exporter","port":9182,"name":"metrics"}
{"level":"info","ts":1633082664.2285357,"logger":"controllers.configmap","msg":"processing","instances in":"windows-instances"}
{"level":"info","ts":1633082664.2289386,"logger":"controllers.configmap","msg":"instance is up to date","node":"worker-3","version":"3.1.0+06e96071"}
{"level":"info","ts":1633082664.2518897,"logger":"metrics","msg":"Prometheus configured","endpoints":"windows-exporter","port":9182,"name":"metrics"}

3. OpenShiftへのWindowsコンテナのデプロイ

3.1. コンテナイメージのビルド

当初、BuildConfigを作成してWindowsノードでビルドすることを考えたのですが、ビルドPodで下記のログが出力されてエラーになってしまいました。

classicノード
Warning  FailedMount       <invalid>                      kubelet            MountVolume.SetUp failed for volume "build-ca-bundles" : mkdir c:\var\l
ib\kubelet\pods\0336dac4-a2ff-4ff1-9ad4-43c30523a470\volumes\kubernetes.io~configmap\build-ca-bundles\..2021_10_02_01_43_01.821169354\certs.d\image-re
gistry.openshift-image-registry.svc:5000\: The directory name is invalid.

※WindowsノードにビルドPodをスケジュールするためには、BuildConfigにnodeSelectorを追加したり、「build.config.openshift.io/cluster」にtolerationsを追加したりする必要があります。

また、Windows 10 Home Editionに導入したDocker DesktopでWindowsコンテナをビルドすることもできませんでした。下の画像はDocker Desktopのタスクトレイを右クリックしたときものですが、Windowsコンテナを扱うためにはProかEnterpriseエディションが必要な旨が表示されています。
タスクトレイ.png

止む無く今回はWindowsノードのDockerでビルドしDocker Hubにプッシュしました。

windowsノード
docker build -t iis:latest .
docker tag iis <アカウント名>/<リポジトリ名>:iis
docker login
docker push <アカウント名>/<リポジトリ名>:iis

Dockerfile等は下記URLのサンプルを使用しています。

3.2. コンテナのデプロイ

Docker Hubにプッシュしたイメージからコンテナをデプロイします。

classicノード
oc new-project iis
oc apply -f iis.yaml
oc get pod -o wide
### 標準出力↓
NAME                   READY   STATUS    RESTARTS   AGE   IP            NODE       NOMINATED NODE   READINESS GATES
iis-855bf8d65d-rc54k   1/1     Running   0          7s    10.132.0.12   worker-3   <none>           <none>
iis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: iis
  labels:
    app: iis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iis
  template:
    metadata:
      labels:
        app: iis
    spec:
      containers:
        - name: iis
          image: <アカウント名>/<リポジトリ名>:iis
          ports:
            - containerPort: 80
      tolerations:
      - key: os
        value: Windows
        Effect: NoSchedule
      nodeSelector:
        kubernetes.io/hostname: worker-3
---
apiVersion: v1
kind: Service
metadata:
  name: iis
spec:
  selector:
    app: iis
  type: ClusterIP
  ports:
   - protocol: TCP
     port: 80
     targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: iis
spec:
  rules:
    - host: iis.apps.ocp.cloud.vpc
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: iis
                port:
                  number: 80

Windowsノード(worker-3)にスケジュールするために、nodeSelectorとtolerationsを設定しています。masterノードのようにTaintsが設定されているためです。

classicノード
oc describe node worker-3 | grep "Taints"
### 標準出力↓
Taints:             os=Windows:NoSchedule

oc describe node worker-0 | grep "Taints"
### 標準出力↓
Taints:             <none>

oc describe node master-0 | grep "Taints"
### 標準出力↓
Taints:             node-role.kubernetes.io/master:NoSchedule

ブラウザでhttp://iis.apps.ocp.cloud.vpc/を開くと以下のような画面が表示されます。RHCOSのノード(worker-0~2いずれか)のルーターPodからWindowsノード(worker-3)のIIS Podへの連携ができていることになります。

image.png

OpenShift側から確認すると、Windowsノード(worker-3)で動作しているPodはIISのみです。

classicノード
oc get pod -o wide | grep "worker-3"
### 標準出力↓
iis-855bf8d65d-rc54k   1/1     Running   0          4m21s   10.132.0.12   worker-3   <none>           <none>

Windowsノードで起動されているコンテナは2つでした。Kubernetes関連タスクは3つ確認できました。

Windowsノード(worker-3)
docker ps
### 標準出力↓
CONTAINER ID   IMAGE                                          COMMAND               CREATED         STATUS         PORTS     NAMES
4ce7c95d5563   0be281f1cc6f                                   "ping localhost -t"   2 minutes ago   Up 2 minutes             k8s_iis_iis-855bf8d65d-rc54k_iis_907b0fb8-bc39-4cb2-94fe-62b6012acbfa_0
d116c232b897   mcr.microsoft.com/oss/kubernetes/pause:3.4.1   "/pause.exe"          2 minutes ago   Up 2 minutes             k8s_POD_iis-855bf8d65d-rc54k_iis_907b0fb8-bc39-4cb2-94fe-62b6012acbfa_0

tasklist
### 標準出力↓
…
hybrid-overlay-node.exe       5516 Services                   0     36,328 K
…
kubelet.exe                   1360 Services                   0     82,908 K
kube-proxy.exe                5904 Services                   0     43,232 K
…

おわりに

2021年10月10日現在、IBM CloudではOpenShiftのUPI/IPIインストールはサポートされていません。IBM Cloudの学習を始めて最も残念なことの1つだったのですが、「What's new in Red Hat OpenShift 4.9」のロードマップでは2022年上半期に対応予定とされていました(動画7分25秒頃)。Windowsノードを含めサポートされる機能が広がることを期待しています。

PLATFORM
Alibaba, Nutanix & IBM Cloud(UPI/IPI)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?