Kubernetes for the Absolute Beginners - Hands-on メモ
M1 Mac でできるか怪しいが...
brew install minikube
minikube start --driver=virtualbox
ダメっぽいので以下を参考にする
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64
minikube start --driver=docker
sudo install minikube-darwin-arm64 /usr/local/bin/minikube
$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
Nodeを取得
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 3m11s v1.23.3
Minikubeを起動し、クラスターを作成する
minikube start
k8s deploymentを作成する
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10
deploymentをserviceとして公開する
kubectl expose deployment hello-minikube --type=NodePort --port=8080
公開されたserviceのurlを取得する
minikube service hello-minikube --url
↑ここで何も表示されない
後処理
kubectl delete service hello-minikube
kubectl delete deployment hello-minikube
echoserver イメージは M1 Mac だと無理っぽい?
M1じゃないMac(driver は virtualbox)でやってみる→いけた...
Pod のデプロイ
kubectl run nginx --image=nginx
docker hub の nginx
イメージを使って、nginx
という名前の pod をデプロイする
pod 一覧
kubectl get pods
pod 一覧(pod のプライベートアドレスも取得)
kubectl get pods -o wide
pod の詳細
kubectl describe pod nginx
pod の削除
kubectl delete pods <pod>
YAML の適用
kubectl apply -f <file>
kubectl create
との違い: https://tenzen.hatenablog.com/entry/2019/11/24/033035
Replication Controller
- 可用性
- 負荷分散
→ Replica Set が後継
Replica Set は selector が必要
Pod の定義に書いた label と同じ label をReplica Setで監視する
kubectl create -f replicaset-definition.yml
kubectl get replicaset
kubectl delete replicaset myapp-replicaset
kubectl replace -f replicaset-definition.yml
kubectl scale--replicas=6 -f replicaset-definition.yml
apiVersion: apps/v1
を間違えるとシンタックスハイライトが効かない...
ReplicaSet がすること
- ReplicaSet が作成した Pod を削除すると、すぐに別の Pod を作成する
- ReplicaSet が作成した Pod と同じ Pod を作ると、それを削除する
kubectl edit replicaset myapp-replicaset
これにより一時ファイルが作成される(元のファイルは変わらない!!)
これを編集して、たとえば replicas: 3
の部分を 4
に変えたりすると、その通り Pod が増える
kubectl scale replicaset myapp-replicaset --replicas=2
こうすると直接指定できる
apiVersion: apps/v1 # 左は api、右は apps
kind: ReplicaSet # CamelCase
metadata:
name: frontend
labels: # ここでは app=mywebiste と tier=frontend というラベルを持つ
app: mywebsite
tier: frontend
spec:
replicas: 4
template: # Pod の中身から apiVersion と kind を取ったもの
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: nginx
image: nginx
selector:
matchLabels: # app: myapp というラベルをもとに select する
app: myapp
Deployment
kubectl get all
全てのリソースを取得
k8s は Rolling Update をデフォルトで採用
deployment に関するコマンドのまとめ
# create
kubectl create -f deployment-definition.yml
# get
kubectl get deployments
# update
kubectl apply -f deployment-definition.yml
kubectl set image deployment/myapp-deployment nginx=nginx:1.9.1
# status
kubectl rollout status deployment/myapp-deployment
kubectl rollout history deployment/myapp-deployment
# rollback
kubectl rollout undo deployment/myapp-deployment
rollout
$ kubectl rollout status deployment.apps/myapp-deployment
Waiting for deployment "myapp-deployment" rollout to finish: 0 of 3 updated replicas are available...
Waiting for deployment "myapp-deployment" rollout to finish: 1 of 3 updated replicas are available...
Waiting for deployment "myapp-deployment" rollout to finish: 2 of 3 updated replicas are available...
deployment "myapp-deployment" successfully rolled out
kubectl create -f deployment.yaml --record
--record
オプションで、コマンドを記録
Networking
- IPアドレスはそれぞれの Pod に割り当てられる
- Pod と Pod が通信する時... NAT を使わずに通信できる必要がある
- 何らかのベンダーソフトで Pod の IP を管理する
Services
NodePort
- TargetPort (Webアプリケーションのポート番号)
- Port
- NodePort (外からアクセスする時のポート番号)
minikube service [service name] --url
で Service の URL 確認できる
ClusterIP
frontend, backend, redis... 等のIPをそれぞれまとめる
LoadBalancer
Service: IPアドレスが変動するポッドに対してクライアントが一意の宛先でアクセスするために作成するオブジェクト
ClusterIP はクラスター内部の通信で使う、NodePort はクラスターの外からのアクセスで使う
docker link は deprecated
- Deploy PODs
- Create Services: redis 、db それぞれの POD を他の POD からアクセス可能にする
- Create NodePort: voting-app 、result-app を外部からアクセス可能にする
voting app demo
- podを5つ作成
- internal service (ClusterIP) を作成
- postgres と redis に対応
- exrernal service (nodePort) を作成
- voting-app と result-app に対応
pod/worker-app-pod が立ち上がらない...
Deployment で以下の Pod をそれぞれまとめる
- voting-app
- redis
- postgres
- working-app
- result-app
kubectl scale
ですぐにスケールアップできる
kubectl delete all --all
を使うと全てのリソースを消すことができる
- kops, KubeOne: 自分でVMを用意し管理する
- GKE: provider が管理する