APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【OCI】OKEの疎通確認

目次

はじめに

こんにちは、クラウド事業部の照屋です。
今回はプライベートサブネットに構築したOKEの疎通確認を行いたいと思います。
OKEクラスタとOKEに接続しに行く踏み台サーバ(Bastion)はすでに構築済として進めていきます。

関連記事

Oracle Container Engine for Kubernetes(OKE)をプロビジョニングしよう

OKEとは

アプリを動かすための「専用の土台」をクラウド上で提供するサービスです。

開発したアプリを「コンテナ(小さな箱)」という単位で扱うことで、サーバーのセットアップや障害時の復旧、アクセスの増減に伴う性能調整などをすべてクラウド側に任せることができます。
これにより、運用コストを抑えながら、サービスを止めることなく安定して提供することが可能になります。

また、世界標準のオープン・ソース「Kubernetes」をベースにしているため、最新のクラウド技術を柔軟に取り入れながら、アプリの公開や管理をスピーディーに行うことができます。
Kubernetesエンジン(OKE)の概要

構成図

Kubernetes APIエンドポイント(OKEクラスタ)、ワーカーノード(VM)に対して疎通できるか確認します。
また、Nginxを稼働させたPodを作成し、外部からcurlによる疎通確認を行います。

セキュリティ設定

・Bastionサーバ用NSGには、ipconfigで確認した自分自身のGIPを許可しておきます。(ローカルからTera TermでSSH接続します)

・APIエンドポイント用NSGとワーカーノード用NSGには、BastionサーバのプライベートIPを許可しておきます。

事前準備

1.Bastionへログイン

ssh -i <秘密鍵> opc@[BastionのパブリックIP]

2.OCI CLIのインストール

下記dnfコマンドでインストールします。
※Oracle Linux 9の場合

sudo dnf install -y oracle-ocne-release-el9
sudo dnf config-manager --enable ol9_ocne
sudo dnf install -y ocne

インストール済。

[opc@bation ~]$ oci -v
3.73.1

参考

CLIのインストール

3.kubectlのインストール

sudo dnf install kubectl

インストール済。

[opc@bation ~]$ kubectl version --client
Client Version: v1.33.7+1.el9
Kustomize Version: v5.6.0

参考

kubectlのインストール

手順

Kubernetes APIエンドポイントへの疎通確認

1.Kubernetesを操作するために必要なkubeconfigファイルを格納するディレクトリを作成

$ mkdir -p $HOME/.kube

2.Kubernetes APIエンドポイントに接続するために必要な情報を取得して、Kubeconfigファイルに書き込む

oci ce cluster create-kubeconfig --cluster-id ocid1.cluster.oc1.ap-tokyo-1.aaaaaaaa... --file $HOME/.kube/config --region ap-tokyo-1 --token-version 2.0.0  --kube-endpoint PRIVATE_ENDPOINT

3.kubectlファイルを読み込む

export KUBECONFIG=$HOME/.kube/config

4.kubectl の動作確認

[opc@bation ~]$ kubectl get nodes
NAME        STATUS   ROLES   AGE     VERSION
10.0.1.30   Ready    node    2d18h   v1.34.2

ワーカーノードが Ready 状態で表示されれば正常に起動しており、
OKEのAPIエンドポイントへの接続が成功したことになります。

すでにKubernetes が動くためのシステム Podも正常に稼働していることが確認できます。

[opc@bation ~]$ kubectl get pods -A
NAMESPACE     NAME                                  READY   STATUS    RESTARTS   AGE
kube-system   coredns-7b544c69cb-95vzd              1/1     Running   0          2d17h
kube-system   csi-oci-node-zq2wk                    1/1     Running   1          2d18h
kube-system   kube-dns-autoscaler-56c78ff67-vcp2k   1/1     Running   0          2d17h
kube-system   kube-proxy-grnjb                      1/1     Running   1          2d18h
kube-system   proxymux-client-jh98j                 1/1     Running   1          2d18h
kube-system   vcn-native-ip-cni-s8drg               2/2     Running   2          2d18h

次に、ワーカーノード(VM)へも直接疎通確認を行ってみます。

ワーカーノード(VM)への疎通確認

1.BastionサーバにSSH鍵をアップロード

scpコマンドで事前にローカルからBastionサーバにSSH鍵をアップロードしておきます。

scp -i ssh-key-******.key ssh-key-******.key opc@168.138.215.251:~/.ssh/

2.ワーカーノード(VM)へのログイン確認

この鍵を使ってサーバにログインできるかを確認します。

[opc@bation .ssh]$ ssh -i ssh-key-******.key opc@10.0.1.30
The authenticity of host '10.0.1.30 (10.0.1.30)' can't be established.
ED25519 key fingerprint is SHA256:lS3J73ei8F5Ml4y+8rOCZ5YnA2BGVCZGvdZBUHvcIdQ.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.1.30' (ED25519) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket

[opc@oke-c3jths47lcq-nyt5fmy2ogq-sbke6szcnrq-1 ~]$

ログインに成功しました。

最後に、Podを立てて外部からアクセスできるか確認していこうと思います。

Nginx Podへの疎通確認

1.マニフェストファイル(YAML)の作成

マニフェストファイルを作成していきます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/library/nginx:1.14.2
        ports:
        - containerPort: 80

参考

デプロイメントを使用してステートレスアプリケーションを実行する

2.Nginx Podをデプロイ

Podをデプロイしていきます。

[opc@bation ~]$ kubectl apply -f pod.yaml
deployment.apps/nginx-deployment configured

3.Podの生存確認

Podが正常に起動しているかを確認します。

[opc@bation ~]$ kubectl get pods -l app=nginx
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-75b6b65ddb-rjspq   0/1     ContainerCreating   0          6s
nginx-deployment-bf744486c-jjcgp    0/1     ImageInspectError   0          6m54s
nginx-deployment-bf744486c-ns6ms    0/1     ImageInspectError   0          6m54s

[opc@bation ~]$ kubectl get pods -l app=nginx
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-75b6b65ddb-rjspq   1/1     Running   0          14s
nginx-deployment-75b6b65ddb-z9gvl   1/1     Running   0          7s

無事にノード上で Pod が動作していることが確認できました。

4.Nginxサービスへの外部アクセス

外部からPodで稼働中のNginxサービスにアクセスできるか確認していきます。
今回は最も簡単に確認できる方法として、
ポートフォワーディングする方法で実行していきます。

<注意>
下記コマンドだとフォアグラウンドで実行され、curlコマンドが打てなくなるので、
必ずバックグラウンドで動作させるようにしてください。

[opc@bation ~]$ kubectl port-forward deployment/nginx-deployment 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

[opc@bation ~]$ kubectl port-forward deployment/nginx-deployment 8080:80 > /dev/null &
[1] 434179

[opc@bation ~]$ curl http://localhost:8080



Welcome to nginx!



Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

問題なくアクセスできました!

参考

ローカルポートをPodのポートにフォワードする

トラブルシューティング

Kubernetes APIエンドポイントへの疎通確認のフェーズで、
手順を最後まで踏んだ後、kubectl get nodesを打つと、下記エラーが表示されました。

[opc@bation ~]$ kubectl get nodes
E0130 08:11:06.144812    6741 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0130 08:11:06.146447    6741 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0130 08:11:06.147868    6741 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0130 08:11:06.149339    6741 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0130 08:11:06.150803    6741 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
The connection to the server localhost:8080 was refused - did you specify the right host or port?

どうやらユーザー情報の紐づけがうまくできていない模様。。。

cat ~/.oci/configで設定情報を確認すると、
OCI コンソール画面の「ユーザー設定」に設定されているAPIキーと異なっていました。

[DEFAULT]
user=ocid1.user.oc1..aaaaaaaa************************************************
fingerprint=d3:6a:***********************************
key_file=/home/opc/.oci/teruya_api_key.pem
tenancy=ocid1.tenancy.oc1..aaaaaaaa************************************************
region=ap-tokyo-1

APIキーは、/home/opc/.ociディレクトリに格納されているため、
公開鍵をコピー、OCI コンソール画面の「ユーザー設定」>「APIキーの追加」から追加します。

もう一度、接続に必要な情報をKubeconfigファイルに書き込むと、Kubeconfigファイルへの書き込みが成功したようです。

[opc@bation ~]$ oci ce cluster create-kubeconfig --cluster-id ocid1.cluster.oc1.ap-tokyo-1.aaaaaaaa... --file $HOME/.kube/config --region ap-tokyo-1 --token-version 2.0.0  --kube-endpoint PRIVATE_ENDPOINT
New config written to the Kubeconfig file /home/opc/.kube/config

kubectl get nodesを打つと、正常に起動していることが確認できました。

[opc@bation ~]$ kubectl get nodes
NAME         STATUS   ROLES   AGE   VERSION
10.0.1.205   Ready    node    92m   v1.34.2

おわりに

今回は疎通確認のみでしたが、
次回はPodの挙動についても見ていきたいと思います。

お知らせ

私達クラウド事業部はクラウド技術を活用したSI/SESのご支援をしております。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。

www.ap-com.co.jp