# Tako Team Note
2020/2/20
---
## 1. Azureアカウントを2つ作成
小野さん、猿舘さんがAzureアカウント(無料)を作成
## 2. 踏み台サーバーを1つ作成
小野さんのAzureアカウントにてGUI(Web)から作成
---
### 2-1 Dockerインストール
```
sudo apt-get update
```
```
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
```
```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```
```
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable test edge"
```
```
sudo apt-get update
```
```
sudo apt-get install docker-ce
```
---
sudoコマンドなしで
```
# dockerグループがなければ作る
sudo groupadd docker
# 現行ユーザをdockerグループに所属させる
sudo gpasswd -a $USER docker
# dockerデーモンを再起動する (CentOS7の場合)
sudo systemctl restart docker
# exitして再ログインすると反映される。
exit
```
---
### 2-2 azcliインストール
```
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
```
---
### 2-3 javaソースの作成
```
git clone https://github.com/yoshioterada/k8s-Azure-Container-Service-AKS--on-Azure
```
---
### 2-4 Dockerfile作成
cloneした
FrontService/0-Dockerfile-for-Maven
だと思われ...
---
### 2-5 Dockerイメージ作成
1-Dockerfile-Multi
build→build-tako 2箇所を修正(必要があった訳ではない)
```
docker build [ -t {イメージ名} [ :{タグ名} ] ] {Dockerfileのあるディレクトリ}
docker build -t maven-include-localrepo:1.0
#docker build -t maven-include-localrepo:1.0 . -f 0-Dockerfile-for-Maven #pdfにあった記載
#docker build -t maven-include-localrepo:1.0 . # -fで指定しなければDockerfileが呼ばれる
打ったやつ↓
docker build -t maven-include-localrepo-tako:1.0 . -f 0-Dockerfile-for-Maven
docker build -t tako-front-service:1.0 . -f 1-Dockerfile-Multi
```
---
### 2-6 Dockerイメージ動作確認
```
docker images
```
```
docker run -p 8080:8080 -it tako-front-service:1.0
```
```
curl http://localhost:8080/sample/hello
```
---
### 2-7 バージョン違いのイメージ作成と動作確認
```
docker build -t tako-front-service:1.1 . -f 1-Dockerfile-Multi
```
```
docker run -p 8080:8080 -it tako-front-service:1.1
```
---
## 3. AKSの作成
猿舘さんのAzureアカウントにてGUI(Web)から作成
### 3-1 kubectlインストール
```
sudo az aks install-cli
az login
#URLが出てくるのでブラウザでログインする
#認証コードを入力する
#az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
az aks get-credentials --resource-group tako-k8s-reee --name tako-k8s-cluster
```
レジストリ:takok8s
ログインサーバ:takok8s.azurecr.io
```
kubectl create secret docker-registry docker-reg-credential --docker-server=takok8s.azurecr.io --docker-username=takok8s --docker-password="nSV0CZ3jo6DbwN+h4bfDBsCGeXqGTK+c" --docker-email=mutenet.sarudate@gmail.com
```
### 3-2 dockerログイン
```
docker login -u takok8s takok8s.azurecr.io
```
### 3-3 docker イメージをACRにpushする
```
#名前空間を設定
docker tag ika/front-service:1.0 ikak8s.azurecr.io/ika/front-service:1.0
```
```
#docker tag ika/front-service:1.1 ikak8s.azurecr.io/ika/front-service:1.1
docker tag tako-front-service:1.0 takok8s.azurecr.io/tako/front-service:1.0
docker push takok8s.azurecr.io/tako/front-service:1.0
#同様に1.1もpush
```
```
kubectl apply -f 4-create-deployment-svc.yaml
```
```
apiVersion: apps/v1
kind: Deployment
metadata:
name: tako-front-service #ここでdeploymentを分ける
spec:
replicas: 2
selector:
matchLabels:
app: tako-front-service #ラベル?
# ~~
#中略
# ~~
template:
metadata:
labels:
app: tako-front-service #selectorの判別用
version: v1 #判別用
stage: staging
spec:
securityContext:
runAsUser: 1000
imagePullSecrets:
- name: docker-reg-credential
containers:
- name: tako-front-service #コンテナ名
image: takok8s.azurecr.io/tako/front-service:1.0 ##イメージ名
env:
- name: TZ
value: JST-9
```
### deploymentの追加
metadataのnameを変えると別のdeploymentとして認識される
同じままだと上書きになる
### serviceの追加
Service YAMLを適用
```
kubectl apply 11-Service.yaml
```
Service 作成の確認
```
kubectl get svc
```
- TYPE:ClusterIPのサービスが追加される
### 一時的にIPの割り当て
- 外部IPを割り当てるためにyamlのTYPEをLoadBalancerに変更し、再度apply
外部IPが割り当てられるため、ブラウザで確認 http://{EXTERNAL-IP}/sample/hello
- 再びapplyして元に戻そうとしても戻せないため、直接既存の設定を変更
```
kubectl edit svc/tako-front-service
```
- nodePortの行を消す
- LoadBalancer -> ClusterIPに戻す
### Ingressの追加
ポータルのAKSサービスからHTTP アプリケーションのルーティング ドメインを選択し、hostに設定
2eda1cfdd3664b858a2b.japaneast.aksapp.io
ingressでbackendを複数もつ
```
- host: v1.2eda1cfdd3664b858a2b.japaneast.aksapp.io
http:
paths:
- backend:
serviceName: tako-front-service-v1-1
servicePort: 80
path: /v2 #v1.2eda1cfdd3664b858a2b.japaneast.aksapp.io/v2/sample/hello
- backend:
serviceName: tako-front-service
servicePort: 80
path: / #v1.2eda1cfdd3664b858a2b.japaneast.aksapp.io/sample/hello
```
## 4. ACRの作成
## 注意点
・latestタグを使わない
・小さいサイズのイメージを作る
・ユーザのパーミッションは設定しよう
・Docker Hubのイメージをむやみに信じない
・Docker Fileの記述は、変更があるものを最下部に書く
・Podのリソース使用量を適切に設定する(他Podへの影響をなくす)
・SelectorとLabelの理解は重要
・Serviceで極力LoadBalancerは使用しない
・無理にk8sのすべての機能を利用する必要はない。適材適所
・複雑な構成を作らない
・k8sのポータビリティはある点とない点がある
・バージョンごとに設定や機能の差異がある
(後方互換性はJavaのほうが優秀。サードパーティ系のプラグインを使うときはより注意)
・大規模k8sクラスタを構築しない
(ノード数を多く作らない)
クラスタの寿命を考える(AKSの場合は約1年半でEOL)
作ったものは必ず壊れるという前提意識をもつ
・k8sのアップグレードは慎重に
まずは新バージョンの新規クラスタを構築
何か問題があった時に旧バージョンのクラスタに戻せる
・Volumeは極力使わない
・k8s以外の選択肢も考える
(30くらいのサービスであればWeb App for Containersや Containerのほうが運用管理が楽)
## Topic
・DBはマネージドサービスを利用
・k8s上で稼働するアプリのデバッグ(Azure DevOps)
・Azure Managedなモニタリング
(他モニタリングツールの設定不要)
## 問題が発生した時よく使うコマンドベスト5
```
kubectl describe pod
```
```
kubectl logs POD_NAME
```
```
kubectl exec -it POD_NAME /bin/sh
```
```
kubectl get events -w
```
```
Deploy Ubuntu POD in same NameSpace
```
{"metaMigratedAt":"2023-06-15T04:30:52.031Z","metaMigratedFrom":"Content","title":"Tako Team Note","breaks":true,"contributors":"[{\"id\":null,\"add\":5384,\"del\":171},{\"id\":\"3842a4fa-0ed2-4b74-b12e-d02562d24a05\",\"add\":707,\"del\":336}]"}