Kubernetes 1.10.4でServiceを作成してクラスタ外にサービスを公開
目次
概要
『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インスタンスを利用しました。 サーバのスペックは以下のとおりです。
項目 | 内容 |
---|---|
AMI | CentOS 7 (x86_64) - with Updates HVM |
インスタンスタイプ | t2.micro |
vCPU | 1 |
メモリ | 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
※ファイルを新規作成※
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.24080: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.10880: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の定義ファイルを参考にしました。