コンテナの概要についてはまずこちら👇
AWSにおけるコンテナサービス
#1.kubernetesが動く仕組み#
k8s | |
---|---|
Node | サーバーのこと。コンテナはこのNODEの上で実行されます。 |
Cluster | Nodeを一纏めにしたグループのこと。1台のNodeが故障しても、他のNodeで処理を実行できます。1台のNodeに処理が集中しないように負荷分散することもできます。 |
Master | Clusterを管理するサーバー。誰がどのグループに所属しているか、Nodeが正常か監視したりする。 |
#2.kubernetesの構成部品#
Users
🔽 API/CLI/UIで命令
Contorol Plane
→ マスターノードのこと。
🔽 apiserver/scheduler/controllersといった部品が受け取る。
Nodes
🔽 kubnet という部品で受け取る。
もう少し詳しく、、、
Master | |
---|---|
API Server | 実行命令を受け取り、Nodeに対して命令をだす。 |
etcd | k8sに関する情報が保管される。 |
Scheduler | コンテナの配置を管理する。 |
Controller Manger | 監視し必要に応じて足りないものを生成してくれる。 |
Node | |
---|---|
ContainerRuntime | DockerEnngineなどのコンテナを動かすためのソフトウェア |
Kubelet | K8sのエージェント ContainerRuntimeと連携してコンテナの起動停止を行う。API Serverと通信して命令を受け取る。 |
#3.Minikube を動かしてみる#
- EC2環境
- ubuntu
- t3.micro
基本的な設定は、Running Minikube in AWS EC2 (Ubuntu)
kubectl インストール
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
docker インストール
sudo apt-get update && \
sudo apt-get install docker.io -y
minikube インストール
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
minikube version
管理者権限にして、minikube をスタート
sudo -i
minikube start --vm-driver=none
が、conntrack がないとかエラーになる。
minikube v1.9.2 on Ubuntu 18.04 ✨ Using the none driver based on user configuration 💣 Sorry, Kubernetes v1.18.0 requires conntrack to be installed in root's path
conntrack をインストールすると、minikube スタートが成功する。
apt-get install conntrack
#4 deployment#
nginxイメージでmy-nginxという名前のdeploymentを作成。
kubectl create deployment --image nginx my-nginx
podが作成されていることがわかる。
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-9b596c8c4-dcw9x 1/1 Running 0 43h
Pod
1つ以上のコンテナを纏めた単位のこと。
IPアドレスはPod単位で付与されます。
なので宛先をローカルホストとすることで、Pod内のコンテナは通信可能ということです。
また、同じポート番号を共有することはできません。
複数のコンテナを1つの単位に纏めるとどんないいことがあるのか?
例えば、ローカルボリュームとgitを同期させるgit syncのコンテナを入れるだけで簡単に設定変更することなどができる。
もしもPod化しない場合、どのコンテナがどれと紐づくか管理しなければ行けなくなったり、管理が複雑になる。ネットワークを共有しているPodと纏めることで管理が楽になリます。
最初は1podに1コンテナで構成することをおすすめします。
Replica Set
Podを作成したり管理したりするもの。
これは、deploymentによって作成される。
システムを入れ替える場合は、Replica Setとpodが入れ替わることになります。
podの数を増やすには↓
kubectl scale deployment --replicas 2 my-nginx
podが増えていることがわかる。
kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-9b596c8c4-dcw9x 1/1 Running 0 43h
my-nginx-9b596c8c4-gcfrg 1/1 Running 0 43h
次にサービスを作成して、外からアクセスできるようにしてみる。
kubectl expose deployment my-nginx --port=80 --type=LoadBalancer
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d17h
my-nginx LoadBalancer 10.106.179.40 <pending> 80:32343/TCP 28s
ここでEC2のセキュリティグループを許可することを忘れないようにしましょう。
最後にEC2のパブリックIPアドレス:32343
にアクセスして表示されるか確認!
EC2のパブリックIP ➡️ EC2のプライベートIP:32343 → Services 10.106.179.40:80 → pod 172.17.0.4 172.17.0.5
なので、サービスはロートバランサーの役割もしてくれる。