OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

Kubernetes 1.10.4でServiceを作成してクラスタ外にサービスを公開

カテゴリ:OSSセットアップ | ソフトウェア:Kubernetes | タグ:
最終更新日:2020/11/18 | 公開日:2018/06/14

目次

概要

 『Kubernetes 1.10.2でDeploymentの作成と削除』で作成したDeploymentが 存在している前提とします。このDeploymentから起動されたNginxのDockerコンテナがノード上で起動しています。 Deploymentを作成しただけだとNginxのサービスはKubernetesのクラスタ内のみでしかアクセスできません。 Nginxのサービスにクラスタ外(例えばインターネットから)アクセスるためには、Serviceを作成し、 Nginx(Dockerコンテナ)が使用している80/tcpポートをホストマシンのポートにマッピングする必要があります。

 今回はServiceを作成してNginxのサービスポートをAWSのEC2インスタンスのポートにマッピングし、 PCのブラウザからインターネット経由でNginxにアクセスできることを確認します。 なお、NginxにWebコンテンツを配置していないため、ブラウザに表示されるのはNginxのデフォルトの画面です。

構成

利用環境

 サーバ環境はAWS(Amazon Web Services)のEC2インスタンスを利用しました。 サーバのスペックは以下のとおりです。

■サーバスペック
項目内容
AMICentOS 7 (x86_64) - with Updates HVM
インスタンスタイプt2.micro
vCPU1
メモリ1GiB
ディスク汎用SSD(GP2) 8GiB
リージョン日本

サーバ構成

OSバージョン

CentOS 7.5.1804 x86_64

ソフトウェア・パッケージ一覧

  • docker-1.13.1-63.git94f4240.el7.centos.x86_64.rpm
  • 3bfc22d32a20afc46175242700455a62bb88eda8edf0867295ec83098de09aaf-kubectl-1.10.4-0.x86_64.rpm
  • 56f73d32965af49f582da3d790a145c121843c20e99fdcc6dc05a23f6afff338-kubeadm-1.10.4-0.x86_64.rpm
  • 2d41bb10c7142326719c9052e9f0301f0875c3f25761fa4740ba862eaae0888e-kubelet-1.10.4-0.x86_64.rpm

クライアント構成

OSバージョン

Windows 10 Home 64bit

ソフトウェア・パッケージ一覧

  • Microsoft Edge 42.17134.1.0

環境構築

マスタサーバでServiceの作成

Serviceの定義ファイル作成

 kubernetes.ioで公開されているサンプルの定義ファイルを参考にして、稼働しているDeployment用のServiceを作成します。

$ sudo su -
Last login: Tue Jun 12 15:37:37 UTC 2018 on pts/0
# cd /data/k8s/
# vi nginx-service.yaml
ファイル名:/data/k8s/nginx-service.yaml
※ファイルを新規作成※
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

定義ファイルからServiceを作成

 上記の定義ファイルを元にServiceを作成します。

# kubectl create -f nginx-service.yaml
service "nginx-service" created

Serviceの確認

 作成されたServiceを確認します。 定義ファイルに従い、 nginx-service という名まで作成されています。 80番ポートが31319番ポートにマッピングされていますので、 ブラウザからアクセスするときに指定するポートは31319になります。 なお、ポートはServiceを起動するたびに自動採番されるため、毎回31319になるわけではありません。

# kubectl get service nginx-service
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   10.101.31.240           80:31319/TCP   1m
# kubectl describe service nginx-service
Name:                     nginx-service
Namespace:                default
Labels:                   
Annotations:              
Selector:                 app=nginx
Type:                     NodePort
IP:                       10.101.31.240
Port:                       80/TCP
TargetPort:               80/TCP
NodePort:                   31319/TCP
Endpoints:                10.244.1.30:80,10.244.1.31:80,10.244.1.32:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   

ブラウザからのアクセス確認

 ブラウザのURL入力欄に http://<IPv4 パブリック IP>:31319/ を入力してアクセスします。 以下のような「Welcome to nginx!」という画面が表示されます。

 なお、もし表示されない場合は、セキュリティグループのインバウンドの設定に 31319 ポートからのアクセスを 追加してみてください。私はセキュリティグループの設定で、ソース定義に「マイ IP」を選択し、 自宅のPCからすべてのTCPポートに対してアクセスできるように設定してこの動作確認を行っています。

 なお、原因未確認ですが、 http://<パブリック DNS (IPv4)>:31319/ ではアクセスできませんでした。

補足

 今回Serviceの定義ファイルを作成し、定義ファイルに従ってServiceを作成しました。 これを以下のコマンドで代用することもできます。下記コマンドを実行すると、 生成されるServiceの名前はDeploymentの名前と同じになります。

# kubectl expose deployment nginx-deployment --type=NodePort 
service "nginx-deployment" exposed
# kubectl get svc nginx-deployment
NAME               TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx-deployment   NodePort   10.109.139.108           80:31130/TCP   1m

マスタサーバでServiceの削除

 備忘録として削除の手順も載せておきます。

Serviceの削除

 今回作成した nginx-service という名のServiceを削除してみます。

# kubectl delete service nginx-service
service "nginx-service" deleted

Serviceの確認

 Serviceの状態を確認します。 リソースが存在しないと表示され、Serviceが削除されたことが分かります。

# kubectl get services nginx-service
Error from server (NotFound): services "nginx-service" not found

参考にしたサイト

 Kubernetesの公式サイト kubernetes.io に掲載されているServiceの定義ファイルを参考にしました。