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!と言われたので、ひとまず完了です。