KubernetesをWeb上で実行する

5月 14, 2021

Kubernetesを勉強したい!
minikubeをインストールすれば簡単に動かせるみたいですね。

ただ、いろいろいじくることになると思うので、PCの環境が汚れてしまうのがなんか嫌なんですよね、、

そんなところに、playground っていうWeb上でkubectl叩けちゃうサービスを見つけたので触ってみました。

Play with Kubernetes

https://labs.play-with-k8s.com/

シンプルなのがかっこいいですねー。

Startを押すと、GithubまたはDockerでログインすることを求められます。

無事ログインできると、タイマーが左上に表示されている画面に遷移します。

このサービスは4時間の時間制限がついているようです。

まあ、そこまで勉強できる集中力はないので、4時間は十分すぎるくらいです。

お試しで、左のADD NEW INSTANCEを押してみます。

nodeを5台まで追加できました。
これ以上追加しようとすると、怒られます。

nodeごとにCPUとMemoryが確認できるのがなんかかっこいい。
かっこいいほど、勉強のやる気も出てきます。

環境準備

master作成

node1で次のコマンドを実行します

kubeadm init --apiserver-advertise-address $(hostname -i)

こんな感じで成功!みたいなログが出てきたら大丈夫そうです

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.0.38:6443 --token w5mi6j.0ltscbsav3h7ipmx \
    --discovery-token-ca-cert-hash sha256:156fca86fee2f8d38a29ccc70e84b8397d15ee017e730796a3c281c13ce52ec0
Waiting for api server to startup
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
daemonset.apps/kube-proxy configured
pod "kube-proxy-vqfhv" deleted

ノード一覧表示して、masterになっていることを確認します

$ kubectl get node
NAME    STATUS     ROLES    AGE     VERSION
node1   NotReady   master   2m34s   v1.18.4

次は、スレーブを作っていきます

左欄のADD NEW INSTANCEでノードを追加していきます

ノード追加したら、各ノードのコンソールでkubeadm joinを実行していきます

kubeadm join 192.168.0.38:6443 --token w5mi6j.0ltscbsav3h7ipmx \
    --discovery-token-ca-cert-hash sha256:156fca86fee2f8d38a29ccc70e84b8397d15ee017e730796a3c281c13ce52ec0

実はこのコマンドは、master作成完了のログの下のほうに出力されています

それをコピペして各ノードで実行していけばいい、ってことですね

うまくいくと、こんなメッセージが表示されます

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

ノード一覧表示で、ノードが追加されていることが確認できました

kubectl get node
NAME    STATUS     ROLES    AGE    VERSION
node1   NotReady   <none>   3m5s   v1.18.4
node2   NotReady   <none>   30s    v1.18.4
node3   NotReady   master   4m8s   v1.18.4

Kubernetes Hello world!!

次のサイトを参考に、Hello worldしてみます。
https://kubernetes.io/ja/docs/tasks/access-application-cluster/service-access-application-cluster/

目標は3つです。

  • 2つのHello Worldアプリケーションを稼働させる。
  • Nodeのポートを公開するServiceオブジェクトを作成する。
  • 稼働しているアプリケーションにアクセスするためにServiceオブジェクトを使用する。

Hello worldアプリケーションのyamlを作成します。

$ vi hello-application.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      run: load-balancer-example
  replicas: 2
  template:
    metadata:
      labels:
        run: load-balancer-example
    spec:
      containers:
        - name: hello-world
          image: gcr.io/google-samples/node-hello:1.0
          ports:
            - containerPort: 8080
              protocol: TCP

次のコマンドで、クラスタでHello worldアプリケーションを稼働させます。

$ kubectl apply -f https://k8s.io/examples/service/access/hello-application.yaml
The connection to the server localhost:8080 was refused - did you specify the right host or port?

なんか変なエラー出たぞ、、、

kubernetesマスターを初期化する必要があるみたいです。
今やってる環境だと、4時間こえてセッション切れた場合は毎回やる必要ありそうです。

$ kubeadm init

もういちど

$ kubectl apply -f hello-application.yaml
deployment.apps/hello-world created

お、できてそう
Deploymentを見てみます。

$ kubectl get deployments hello-world
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
hello-world   0/2     2            0           98s
$ kubectl describe deployments hello-world
Name:                   hello-world
Namespace:              default
CreationTimestamp:      Fri, 28 Aug 2020 06:41:16 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=load-balancer-example
Replicas:               2 desired | 2 updated | 2 total | 0 available | 2 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  run=load-balancer-example
  Containers:
   hello-world:
    Image:        gcr.io/google-samples/node-hello:1.0
    Port:         8080/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      False   MinimumReplicasUnavailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   hello-world-86d6c6f84d (2/2 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  2m44s  deployment-controller  Scaled up replica set hello-world-86d6c6f84d to 2

いい感じー

レプリカセット

$ kubectl get replicasets
NAME                     DESIRED   CURRENT   READY   AGE
hello-world-86d6c6f84d   2         2         0       3m28s
$ kubectl describe replicasets
Name:           hello-world-86d6c6f84d
Namespace:      default
Selector:       pod-template-hash=86d6c6f84d,run=load-balancer-example
Labels:         pod-template-hash=86d6c6f84d
                run=load-balancer-example
Annotations:    deployment.kubernetes.io/desired-replicas: 2
                deployment.kubernetes.io/max-replicas: 3
                deployment.kubernetes.io/revision: 1
Controlled By:  Deployment/hello-world
Replicas:       2 current / 2 desired
Pods Status:    0 Running / 2 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  pod-template-hash=86d6c6f84d
           run=load-balancer-example
  Containers:
   hello-world:
    Image:        gcr.io/google-samples/node-hello:1.0
    Port:         8080/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  3m38s  replicaset-controller  Created pod: hello-world-86d6c6f84d-mxx7c
  Normal  SuccessfulCreate  3m38s  replicaset-controller  Created pod: hello-world-86d6c6f84d-ch25b

Deploymentを公開するServiceオブジェクトを作成します。

$ kubectl expose deployment hello-world --type=NodePort --name=example-service
service/helloworld-service exposed

Serviceに関する情報を表示します

$ kubectl describe services example-service
Name:                     example-service
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 run=load-balancer-example
Type:                     NodePort
IP:                       10.105.33.25
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  31421/TCP
Endpoints:                <none>
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

NodePortの値を記録しておきます。上の例では、32566です。

Hello Worldアプリーションが稼働しているPodを表示します

$  kubectl get pods --selector="run=load-balancer-example" --output=wide
NAME                           READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
hello-world-86d6c6f84d-wjl84   1/1     Running   0          4m38s   10.244.1.5   node01   <none>    <none>
hello-world-86d6c6f84d-zmkt5   1/1     Running   0          4m38s   10.244.1.4   node01   <none>    <none>

OK

Podの起動が確認できたので、masterからcurlしてみます。

$ curl http://<node1のパブリックIP>:32566
Hello Kubernetes!

Hello Kubernetes!と言われたので、ひとまず完了です。

IT

Posted by papa