新しい IBM Developer JP サイトへようこそ!サイトのデザインが一新され、旧 developerWorks のコンテンツも統合されました。 詳細はこちら

SSH を使用して管理対象の Kubernetes クラスター上のノードに接続する

コンテナー・オーケストレーションを使用するメリットを最大限に生かそうと目指す開発者にとって、Kubernetes と OpenShift はどちらも理想的な選択肢です。ただし、クラスターのインストールやアップグレードなどの面倒な部分を処理したくないとしたら、IBM がマネージド・ソリューションを提供しています。

マネージド・ソリューションのファンとして、私たちは可能な場合はほぼ完全にマネージド・サービスだけを使用しています。けれども 1 つ気付いた点がありました。それは、Red Hat OpenShift on IBM Cloud または IBM Cloud Kubernetes Service を使用する際に、IBM Cloud ダッシュボード内に表示される、ソリューションの基礎となっているハードウェアである仮想マシン (VM) にアクセスできないことです。そのため、クラスターのマスター・ノードとワーカー・ノードを操作しようとしても、SSH 鍵ペアを追加できません。これにはきっと、もっともな理由があるはずです!

以下のスクリーン・キャプチャーを見るとわかるように、OpenShift クラスターのワーカーのうちの 1 つの ID が VM の名前になっています。

OpenShift クラスター・ワーカーの ID を示す画面のスクリーン・キャプチャー

クラスターを実行している VM に SSH を使用して直接アクセスすることはできません。たとえば、sysctl/ja) ツールを使用して Linux カーネルの設定を微調整しなければならない場合を考えてください。先日、私たちはカーネルのセマフォ設定を変更する必要がありましたが、Kubernetes のマジックを適用すれば、クラスターを実行する VM にアクセスすることができます。

前提条件

このチュートリアルの手順に従うには、IBM Cloud Kubernetes サービスのクラスター、または Red Hat OpenShift on IBM Cloud 上のクラスターが使用可能になっている必要があります。

所要時間

クラスターが使用可能になっている場合、このチュートリアルの所要時間は約 10 分です。

手順

最初に必要な作業として、inspect-node.yaml という名前のファイルを作成します。ファイルの最後の行だけ更新し、WORKER NODE NAME の部分を、アクセス先とするノードの名前で置き換えます。

以下に、inspect-node.yaml ファイルに含めるコードの例を示します。

apiVersion: v1
kind: Pod
metadata:
  name: inspectnode164121
  labels:
    name: inspectnode
  namespace: kube-system
spec:
  tolerations:
    - operator: "Exists"
  hostNetwork: true
  containers:
    - name: inspectnode164121
      image: nkkashyap/inspectndoe:v001
      volumeMounts:
      - mountPath: /host/root
        name: host-root
      - mountPath: /host/etc
        name: host-etc
      - mountPath: /host/log
        name: host-log
      - mountPath: /host/local
        name: host-local
      - mountPath: /run/systemd
        name: host-systemd

  volumes:
  - name: host-root
    hostPath:
      path: /root/
  - name: host-etc
    hostPath:
      path: /etc
  - name: host-log
    hostPath:
      path: /var/log
  - name: host-local
    hostPath:
      path: /usr/local
  - name: host-systemd
    hostPath:
      path: /run/systemd

  nodeSelector:
    kubernetes.io/hostname: WORKER NODE NAME

次に、以下に示す一連のコマンドを実行します。このチュートリアルの例では、VM 上でコマンドを実行します。

  1. OpenShift を使用している場合、ポッドを実行する場所に切り替えます。

    $ oc project kube-system
    
  2. kubectl create を使用してポッドを作成します。

    $ kubectl create -f ./inspect-node.yaml
    
  3. kubectl exec を使用してコンテナーにアクセスします。

    $ kubectl exec -it inspectnode164121 /bin/bash
    
  4. 以下の例では、プロンプトが開発者のターミナルからコンテナーに変更されていることに注意してください。コンテナーには entrypointsystemutil という 2 つのファイルしかありません。このチュートリアルの例では systemutil を使用します。

    root@kube-blnsdved0472n8ongslg-aidacpdtank-default-0000056c:~# ls
    entrypoint  systemutil
    
  5. sed を使用して、ポッド内からルートに対して SSH ログインを有効にします。

    root@kube-blnsdved0472n8ongslg-aidacpdtank-default-0000056c:~# sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /host/etc/ssh/sshd_config
    
  6. 用意されている systemutil スクリプトを使用して SSH デーモンを再起動します。

    root@kube-blnsdved0472n8ongslg-aidacpdtank-default-0000056c:~# ./systemutil  -service sshd.service
    Selected Option:   restart
    Info: Unit Restarted !!
    
  7. 引き続きコンテナー内から SSH でワーカー・ノードへの接続を試行します。接続に成功すると、bash プロンプトが再び変わります。

    root@kube-blnsdved0472n8ongslg-aidacpdtank-default-0000056c:~# ssh root@localhost
    ECDSA key fingerprint is SHA256:b7TAiZXYHtTRP0bSC6MeLKMyKiHp2cqYvnh9rNtnpag.
    Are you sure you want to continue connecting (yes/no)? yes
    
  8. これで、クラスター内のノードを調整または変更できます。この使用ケースの例では、sysctl/ja) コマンドでシステム設定を変更して SELinux を操作しています。

まとめ

このチュートリアルでは、管理対象の環境内にある Kubernetes クラスター上のノードにアクセスする方法を学びました。次は、自分で試してください。このチュートリアルが不便な状況から抜け出すのに役立ったことを願います。ハッキングをお楽しみください!

このトピックに関する情報を提供してくれた Phil Estes 氏、Richard Theis 氏、Neeraj Kumar Kashyap 氏に心から感謝します。