前回の記事では、kubernetesのさわりの部分を紹介しました。
今回はYAMLを利用して構築してみました。
##目次
##準備
minikubeの稼働状況を確認、ダッシュボードを起動する。
$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.114
$ minikube dashboard
Opening http://127.0.0.1:53536/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/ in your default browser...
##デプロイメントの作成
デプロイメントの作成をしてみましょう。
デプロイメントは、レプリカセットなどのリリースに関する管理を行います。
こちらを参考にマニフェストファイル(yaml)を作成。レプリカはなんとなく「1」にしました。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
作成したnginx-deployment.yaml
を指定してkubectl applyする。
$ kubectl apply -f ./nginx-deployment.yaml
ダッシュボードで確認してみると、「デプロイメント」「ポッド」「レプリカセット」が立ち上がっているのが分かる。
もし「反映されて困るが結果だけ知りたい」という場合は、kubectl apply
コマンドに--dry-run
オプションをつけて実行しましょう。
##サービスの作成
サービスを作成しましょう。
サービスでは、Podとの通信ポリシーを定義します。
ports.portに記載したポート番号をports.targetPortのポート番号へ転送します。
今回の場合だと、8080番ポートへアクセスすると80番ポート(Nginxコンテナで利用するように指定したポート)へ転送するようになってます。
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- name: http
port: 8080
targetPort: 80 ##nginx-deployment.yamlのcontainerPortと同値
type
の項目に注目してみると、LoadBalancer
と記載があります。
サービス作成時にLoadBalancerタイプを指定するとホストから直接アクセスが可能となります。
ブラウザを開き、http://localhost:8080/ へアクセスすると、NginxのWelcomeページが表示されました。
##もしminikubeでLoadBalancerが利用できなかった場合
minikubeではLoadBalancerタイプをサポートしていないという情報をちょろっと見かけました。
僕の場合は特に問題なくMacのminikubeでLoadBalancerタイプが利用できていたのですが、もしできなかった場合は以下をお試しください。
※追記2019/08/02
コメントに記載してしまいましたが、僕が実施していた時、実はdocker-for-desctopで稼働していたから問題なく動作していた可能性があります。
試しにdocker-for-desktopをcontextsに設定し、nodeもminikubeではなくdocker-for-desktopであることを確認。
localhost:8080
に接続したら正常にアクセスできました。
逆にminikubeをnodeにして起動すると、localhost~ではアクセスできず、minikube service サービス名 --url
のURLでアクセスできました。
(「localhost」ではなく、ポート番号も30000番台のポート番号になってました。これはこれで正しい。)
もしminikubeでLoadBalancerタイプを利用していた場合は以下を参考にdocker-for-desktopへ切り替えましょう。
- こちらの手順に従って、dicker-for-desktopのkubernetesを起動しましょう。
- そうしましたら以下のコマンドでnodeが「docker-for-desktop」となるように設定。
## 変更前===================
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
docker-for-desktop docker-for-desktop-cluster docker-for-desktop
* minikube minikube minikube
$ kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready master 4d v1.10.0
## 変更===================
$ kubectl config use-context docker-for-desktop
## 変更後===================
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* docker-for-desktop docker-for-desktop-cluster docker-for-desktop
minikube minikube minikube
$ kubectl get node
NAME STATUS ROLES AGE VERSION
docker-for-desktop Ready master 21d v1.10.11
nodeが切り替わったので多分きっと恐らくLoadBalancerがローカルで使えます。
##参考にしたリンク
- Run a Stateless Application Using a Deployment
- Kubernetes: kubectl apply の動作
- Kubernetes で 複数の nginx インスタンスを手元の Mac に立ち上げる
次回はYAMLを拡張して複数コンテナの配置やAutoScalingなど色々やってみます。