CentOS7 minimal で Kubernetes ~part 3~
今回はマニュアルに従ってLabel, ReplicationController, Service を試してみる。github.com
Label
マニュアルに従うだけ。
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: mynginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
podをlabelで確認
$ kubectl get pods -l app=mynginx NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 2m
podを削除
$ kubectl delete pod nginx
Replication Controller
apiVersion: v1 kind: ReplicationController metadata: name: nginx-controller spec: replicas: 2 # selector identifies the set of Pods that this # replication controller is responsible for managing selector: app: mynginx # podTemplate defines the 'cookie cutter' used for creating # new pods when necessary template: metadata: labels: # Important: these labels need to match the selector above # The api server enforces this constraint. app: mynginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
Replication Controller の作成
$ kubectl create -f replication-controller.yaml
replicationcontrollers/nginx-controller
Replication Controller の確認
$ kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS nginx-controller nginx nginx app=mynginx 2
pod の確認
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-controller-0a2ye 1/1 Running 0 4m nginx-controller-sonfl 1/1 Running 0 4m
pod をscaleさせる
$ kubectl scale --replicas=4 rc nginx-controller scaled $ kubectl get pods NAME READY STATUS RESTARTS AGE nginx-controller-02oqh 0/1 Pending 0 12s nginx-controller-0a2ye 1/1 Running 0 4m nginx-controller-jnqk8 0/1 Pending 0 12s nginx-controller-sonfl 1/1 Running 0 4m [kube@master ~]$
Service
apiVersion: v1 kind: Service metadata: name: nginx-service spec: ports: - port: 8000 # the port that this service should serve on # the container on each pod to connect to, can be a name # (e.g. 'www') or a number (e.g. 80) targetPort: 80 protocol: TCP # just like the selector in the replication controller, # but this time it identifies the set of pods to load balance # traffic to. selector: app: mynginx
service 作成
$ kubectl create -f service.yaml
services/nginx-service
$ kubectl get service NAME LABELS SELECTOR IP(S) PORT(S) kubernetes component=apiserver,provider=kubernetes <none> 10.254.0.1 443/TCP nginx-service <none> app=mynginx 10.254.207.252 8000/TCP
CentOS7 minimal で Kubernetes ~part 2~
kubernetes/README.md at master · kubernetes/kubernetes · GitHub
Kubernetes Cluster を組んだので、podを動かします。ずっとmasterでの作業です。
docker-strorage-setupの設定(minion)(不要かも)
マニュルには記載がないですが、これで私の環境では動くようになった。
状況は後述。
# Edit this file to override any configuration options specified in # /usr/lib/docker-storage-setup/docker-storage-setup. # # For more details refer to "man docker-storage-setup" DATA_SIZE=4GB
pod 作成
pod-nginx.yamlをつくる
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
podを起動
$ kubectl create -f pod-nginx.yaml
pod 確認
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 14m
Volumes を指定したpodも作成
データを永続化するためにVolumesを指定
apiVersion: v1 kind: Pod metadata: name: redis spec: containers: - name: redis image: redis volumeMounts: - name: redis-persistent-storage mountPath: /data/redis volumes: - name: redis-persistent-storage emptyDir: {}
$ kubectl create -f pod-redis.yaml
pods/redis
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 23m redis 1/1 Running 0 27s
docker-storage-setup の設定
podを動かすまでdockerではまった。
最初はkubectl create をしても全然PodがRunningにならなかった。
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx 0/1 Image: nginx is not ready on the node 0 4m
$ kubectl get events Sun, 16 Aug 2015 01:46:15 -0400 Sun, 16 Aug 2015 01:46:15 -0400 1 nginx Pod implicitly required container POD failed {kubelet minion-1} Failed to create docker container with error: no such image
minionのログを見てみると、拡張できないというエラーログが。
# cat /var/log/messages Aug 16 01:46:29 localhost lvm[2293]: Thin centos-docker--pool is now 100% full. Aug 16 01:46:29 localhost lvm[2293]: Insufficient free space: 1 extents needed, but only 0 available Aug 16 01:46:29 localhost lvm[2293]: Failed to extend thin centos-docker--pool.
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 12G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 11.5G 0 part ├─centos-root 253:0 0 10.3G 0 lvm / ├─centos-swap 253:1 0 1.2G 0 lvm [SWAP] ├─centos-docker--pool_tmeta 253:2 0 12M 0 lvm │ └─centos-docker--pool 253:4 0 20M 0 lvm └─centos-docker--pool_tdata 253:3 0 20M 0 lvm └─centos-docker--pool 253:4 0 20M 0 lvm sr0 11:0 1 1024M 0 rom
100%になってる。
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert docker-pool centos twi-a-t-M- 20.00m 100.00 0.36 root centos -wi-ao---- 10.27g swap centos -wi-ao---- 1.20g
いろいろググったけど、Linuxに関する知識が貧弱すぎて、よくわからなっかたので、
Setting Up Storage — Project Atomic
を見て、
dockerを再インストール後、
minionの/etc/sysconfig/docker-storage-setupにDATA_SIZE=4GBを追加。
# cat /etc/sysconfig/docker-storage-setup DATA_SIZE=4GB
CentOS7 minimal で kubernetes ~ part 1~
github.com
に書かれていることをほぼなぞっただけだけど。
VirtualBoxのインストール
割愛。あとで書くかも。
CentOS7 minimal のインストール
master用とminion用に2つ作成
詳細は割愛。あとで書くかも。
ipアドレスの設定
master = 192.168.1.17 minion-1 = 192.168.1.18
CentOSの設定
最新にアップデート(master,minion)
# yum update -y
リポジトリの追加(master,minion)
# vi /etc/yum.repos.d/\_virt7-testing.repo [virt7-testing] name=virt7-testing baseurl=http://cbs.centos.org/repos/virt7-testing/x86_64/os/ gpgcheck=0
kubernetesのインストール(master, minion)
# yum -y install --enablerepo=virt7-testing kubernetes
etcdのインストール(master)
kubernetesを動かすにはetcd-0.4.6-7が必要。
# systemctl restart etcd # curl -s -L http://master:4001/version
やってるときには確認方法がわからなかったので、マニュアルに従う。
# yum erase etcd # yum install http://cbs.centos.org/kojifiles/packages/etcd/0.4.6/7.el7.centos/x86_64/etcd-0.4.6-7.el7.centos.x86_64.rpm # yum -y install --enablerepo=virt7-testing kubernetes
/etc/hostsの設定(master, minion)
echo "192.168.1.17 master 192.168.1.18 minion-1" >> /etc/hosts
/etc/kubernetes/config の設定(master, minion)
### # kubernetes system config # # The following values are used to configure various aspects of all # kubernetes services, including # # kube-apiserver.service # kube-controller-manager.service # kube-scheduler.service # kubelet.service # kube-proxy.service # logging to stderr means we get it in the systemd journal KUBE_LOGTOSTDERR="--logtostderr=true" # journal message level, 0 is debug KUBE_LOG_LEVEL="--v=0" # Should this cluster be allowed to run privileged docker containers KUBE_ALLOW_PRIV="--allow_privileged=false" # Comma separated list of nodes in the etcd cluster KUBE_ETCD_SERVERS="--etcd-servers=http://master:4001"
firewall の無効化(master, minion)
systemctl disable iptables-services firewalld
systemctl stop iptables-services firewalld
Kubernetes Service の設定(master)
/etc/kubernetes/apiserver の設定(master)
### # kubernetes system config # # The following values are used to configure the kube-apiserver # # The address on the local server to listen to. # KUBE_API_ADDRESS="--address=127.0.0.1" KUBE_API_ADDRESS="--address=0.0.0.0" # The port on the local server to listen on. KUBE_API_PORT="--port=8080" # How the replication controller and scheduler find the kube-apiserver KUBE_MASTER="--master=http://master:8080" # Comma separated list of minions KUBELET_ADDRESSES="--machines=minion-1" # Port minions listen on KUBELET_PORT="--kubelet_port=10250" # Address range to use for services KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" # default admission control policies # KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota" # Add your own! KUBE_API_ARGS=""
service 起動(master)
# for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICES done
Kubernetes Service の設定(minion)
/etc/kubernetes/kubeletの設定(minion)
### # kubernetes kubelet (minion) config # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) KUBELET_ADDRESS="--address=0.0.0.0" # The port for the info server to serve on KUBELET_PORT="--port=10250" # You may leave this blank to use the actual hostname KUBELET_HOSTNAME="--hostname_override=minion-1" # location of the api-server KUBELET_API_SERVER="--api_servers=http://master:8080" # Add your own! KUBELET_ARGS=""
/etc/kubernetes/proxy の設定(minion)
マニュアルには書かれていないけれど、kube-proxyこの設定をしないとkube-proxy起動時にエラーログが出力された。*1
### # kubernetes proxy config # default config should be adequate # Add your own! # KUBE_PROXY_ARGS="" KUBE_PROXY_ARGS="--master=http://master:8080"
service 起動(minion)
for SERVICES in kube-proxy kubelet docker; do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICES done
完成!
clusterの確認(master)
# kubectl get nodes NAME LABELS STATUS minion-1 kubernetes.io/hostname=minion-1 Ready
次はpodを動かすよ。
*1:kube-proxy[732]: E0814 07:53:48.793584 732 api.go:180] Unable to load endpoints: Get http://localhost:8080/api/v1/endpoints: dial tcp 127.0.0.1:8080: connection refused kube-proxy[732]: E0814 07:53:48.793631 732 api.go:108] Unable to load services: Get http://localhost:8080/api/v1/services: dial tcp 127.0.0.1:8080: connection refused
Hello docker 〜その3
applicationとpostgresをcontainerで起動できたので、
Legacy container linksを参考に今回はそれを接続する。
postgresは前回と全く同じ。
起動するときにオプションの-P も -p もつけない。
postgres docker container 起動
$ docker run --rm --name mydb myPostgres
Web Application の起動
$ docker run -P --name myapp --link mydb:db setoguchi/site-manager
--link mydb:db
の部分でコンテナ間のリンクをdockerに指示できる。
--link コンテナ名:alias
このように起動すると
aliasを大文字にした変数名で環境変数にアクセスできる。
<name>_PORT_<port>_<protocol>上記の例でいくと、
${DB_PORT_5432_TCP_ADDR}
${DB_PORT_5432_TCP_PORT}
のような変数がapplicationのコンテナに設定されるので、これを設定ファイル等に記載すると接続することができる。
spring bootだと、起動時の引数で指定できるので、Dockerfileを下記のように記載するとよい。
CMD ["java", "-jar", "/myApplication.jar",\ "--spring.datasource.initialize=false",\ "--spring.datasource.driverClassName=org.postgresql.Driver",\ "--spring.datasource.url=jdbc:postgresql://${DB_PORT_5432_TCP_ADDR}:${DB_PORT_5432_TCP_PORT}/mydatabase",\ "--spring.datasource.username=scott",\ "--spring.datasource.password=tiger"]
Hello docker 〜その2
単独でdockerを動かせたので、今回はデータベース(postgres)を作成。
これはdockerのサイトにそのまんまあるので、それを参考に作成。
Dockerizing PostgreSQL
準備
docker-myPostgresディレクトリを作成し、
schema.sql,masterdata.sql,data.sqlを置く。
docker-myApplication
├─schema.sql
├─masterdata.sql
└─data.sql
Dockerfileの作成
FROM ubuntu # PostgreSQLのインストール RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list RUN apt-get update && \ apt-get install -y \ python-software-properties \ software-properties-common \ postgresql-9.4 \ postgresql-client-9.4 \ postgresql-contrib-9.4 # 実行ユーザーの宣言 USER postgres # ユーザとデータベースの作成 RUN /etc/init.d/postgresql start &&\ psql --command "CREATE USER scott WITH SUPERUSER PASSWORD 'tiger';" &&\ createdb -O scott mydatabase --encoding=UTF8 --template=template0 # ネットワーク系の設定 RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.4/main/pg_hba.conf RUN echo "listen_addresses='*'" >> /etc/postgresql/9.4/main/postgresql.conf # ポートをコンテナ間ネットワークに公開 EXPOSE 5432 RUN ls # DDLの追加と実行 ADD schema.sql ./schema.sql ADD masterdata.sql ./masterdata.sql ADD data.sql ./data.sql RUN /etc/init.d/postgresql start &&\ psql fa < ./schema.sql &&\ psql fa < ./masterdata.sql &&\ psql fa < ./data.sql # コンテナイメージが起動した時のコマンド CMD ["/usr/lib/postgresql/9.4/bin/postgres", \ "-D", "/var/lib/postgresql/9.4/main", \ "-c", "config_file=/etc/postgresql/9.4/main/postgresql.conf"]
docker imageの作成
$ docker build -t myPostgres ./
docker container 起動
$ docker run --name mydb myPostgres
Container linking で接続確認
$ docker run --rm -t -i --link mydb:pg myPostgres bash postgres@0b197bc3ddf9:/$ postgres@0b197bc3ddf9:/$ postgres@0b197bc3ddf9:/$ psql -h $PG_PORT_5432_TCP_ADDR -p $PG_PORT_5432_TCP_PORT -d mydatabase -U scott Password for user scott: psql (9.4.4) SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) Type "help" for help.
ホストOSから 接続確認
-P をつけて、containerを起動する。
$ docker run -P --name mydb myPostgres
ホストOSのipアドレスを調べる
$ boot2docker ip 192.168.59.103
ポートを調べる。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3dc0112e6390 myPostgres "/usr/lib/postgresql 13 hours ago Up 57 seconds 0.0.0.0:32771->5432/tcp mydb
psqlで接続
$ psql -h 192.168.59.103 -p 32771 -d mydatabase -U scott Password for user scott: psql (9.4.0, server 9.4.4) SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) Type "help" for help. mydatabase=#
dockerのサイトと違うところ
データベースでは日本語を使いたため、データベース作成時のコマンドに
--encoding=UTF8 --template=template0
を追加
Hello docker 〜その1
dockerでexecutable-jarを動かすためにやったこと
boot2docker のインストール
Get Started with Dockerに従ってインストール
インストールが完了すると、VirtualBox上にboot2docker-vmというLinux仮想マシンが作成され、
そこにsshでホストOSのterminalからアクセスし、dockerのコマンドを発行できるようになる。
docker 準備
$ boot2docker init $ boot2docker up Waiting for VM and Docker daemon to start... ...............ooooooooo Started. To connect the Docker client to the Docker daemon, please set: export DOCKER_HOST=tcp://192.168.59.103:2375 unset DOCKER_CERT_PATH unset DOCKER_TLS_VERIFY
Linux仮想マシンがまだ作成されていない場合は boot2docker init で作成できる。
boot2docker up で仮想マシンの起動する。
環境変数をセットするように教えてくれるのでそれに従う。
$ docker version Client version: 1.7.0 Client API version: 1.19 Go version (client): go1.4.2 Git commit (client): 0baf609 OS/Arch (client): darwin/amd64 Server version: 1.7.0 Server API version: 1.19 Go version (server): go1.4.2 Git commit (server): 0baf609 OS/Arch (server): linux/amd64
docker を無事に使えることを確認。
docker お試し
$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from hello-world a8219747be10: Pull complete 91c95931e552: Already exists hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:aa03e5d0d5553b4c3473e89c8619cf79df368babd18681cf5daeb82aab55838d Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (Assuming it was not already locally available.) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash For more examples and ideas, visit: http://docs.docker.com/userguide/
最初はdocker image をダウンロードするのに時間がかかるが、2回目以降はすぐに起動する。
整いましたので、本題へ。
Dockerfile の作成
dockerで動かすのに必要なものだけを置くディレクトリを作成し、その中にDockerfileを配置.
executable-jarも同じ場所に配置
docker-myApplication
├─Dockerfile
└─myApplication.jar
FROM ubuntu:14.10 # Setup RUN apt-get install -y software-properties-common debconf-utils RUN add-apt-repository -y ppa:webupd8team/java RUN apt-get update # Java8 RUN echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 boolean true" | debconf-set-selections ENV DEBIAN_FRONTEND noninteractive RUN apt-get install -y oracle-java8-installer CMD ["java", "-version"] EXPOSE 8080 ADD ./myApplication.jar /myApplication.jar CMD ["java", "-jar", "/myApplication.jar"]
docker image の作成
$ docker build -t myApplication ./
これも初回は時間がかかるが、2回目以降はcacheをつかうので早くなる。
container 起動
$ docker run myApplication
とっても簡単!
でも、このままではブラウザでアクセスできない。
docker run -P myApplication
-P でポートを利用できるようになる。
docker ps で確認。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b443330c4d66 myApplication "java -jar /tmp/fa-s 13 hours ago Up 14 seconds 0.0.0.0:32768->8080/tcp elegant_feynman
上記の場合だと
http://localhost:32768
でアクセスできる。
もしくはdockerコンテナのipアドレスを調べて
$ docker inspect -f '{{ .NetworkSettings.IPAddress }}' b443330c4d66 172.17.0.3
http://172.17.0.3:8080
でもアクセスできる。
ちょっとはまったところ
TLSつかってないじゃないのと言われる
Post http:///var/run/docker.sock/v1.19/containers/create: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
/var/lib/boot2docker/profileを作成し、DOCKER_TLS=noを記載する。
$ boot2docker ssh ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| Boot2Docker version 1.7.0, build master : 7960f90 - Thu Jun 18 18:31:45 UTC 2015 Docker version 1.7.0, build 0baf609 docker@boot2docker:~$ cat /var/lib/boot2docker/profile DOCKER_TLS=no docker@boot2docker:~$
dial tcp うんたらかんたらと言われる
Get https://index.docker.io/v1/repositories/training/webapp/images: dial tcp: lookup index.docker.io on 192.168.0.1:53: read udp 192.168.0.1:53: i/o timeout
boot2docker を再起動
$ boot2docker restart
20歳のときに知っておきたかったこと
What I Wish to know When I was 20
20歳のときに知っておきたかったこと スタンフォード大学集中講義
- 作者: ティナ・シーリグ,Tina Seelig,高遠裕子
- 出版社/メーカー: CCCメディアハウス
- 発売日: 2010/03/10
- メディア: ハードカバー
- 購入: 475人 クリック: 17,353回
- この商品を含むブログ (402件) を見る
確かに20歳のときに知っておきたかったことが書かれているが、
今でも十分に知っておきたいことでもある。
今よんだことで、間に合ったと思いたい本。
自分に許可を与えることをすぐに始めたい。
他人はあなたのやりたいことをやりなさいと指示することは決してないのだから、
自分でやりたいこと、やってみたいことは自分からやり始めないといけない。
許可を求めるな、許しを請え
ルールは破られるためにある。
ほとんどのルールは万人にとって安全であるようにつくられているので、
目的を達成するためにはルールを疑ってみることも必要である。
事前にコレコレをやってもよいかと許可を求めると、それではダメといわれることも、
事後にコレコレをやってしまいました、というと認めてもらえる。
人間は2つのタイプに分かれる
自分のやりたいことを誰かに許可されるのを待っている人
自分自信で許可する人。
誰かがチャンスを与えるの待つのではなく、自分でつかみにいった方がよい面がたくさんある。
たとえば、リーダーになろうと思ったら、リーダーとしての役割を引き受ける。
ただ、自分に許可を与えればよい。組織のなかに穴がないか探す。自分が欲しいものを求める。
自分のスキルと経験を活かせる方法を見つける。いち早く動こうとする。
Fail Fast
失敗から学ぶことは多い。
失敗のレジュメ作成すると、失敗というレンズを通して、自分の経験をみることにより、自分が犯してきた過ちを受け入れられるようになる。
失敗を認める文化にある場所はイノベーションも生まれる。その最たる場所がシリコンバレーである。
本の中ではタイやスペインが失敗にたいして、寛容でなく、リスクをとれなくなると書かれている。
日本もそちらに近いと思う。
スキルと情熱と市場が重なる場所
仕事だとは思わずに取り組める役割を社会のなかに見つけられたとき、それはやりがいがあるというだけではなく、前向きに情熱を傾けられ、人生を豊かにしてくれる。
幸運が舞い込む確率をあげ、舞い込んだチャンスを最大限活かす
よき観察者であり、開かれた心をもち、人当たりがよく、楽観的な人は幸運を呼び込める。
矢の周りに的を描く
交渉を効果的に進めるには、自分自身の最終目標と同様、交渉相手の目標も理解するよう努め、win-winの効果を模索し、いつ交渉の席を立つべきかを知るべきである。
よきチームプレイヤーであるためにはどうすればよいか?
他人を成功させるための労を惜しまないことである。
優秀な人(矢)を選び、その人が得意なことに近い仕事(的)をつくる。
この本の言いたいことはは
「自分に許可を与える」ということである。
- 常識を疑う許可
- 世の中を新鮮な目で見る許可
- 実験する許可
- 失敗する許可
- 自分自身の限界を許す許可
「自分に対しては真面目すぎず、他人に対しては厳しすぎないこと」
他人や自分の間違いにもっと寛容で失敗も学習プロセスの一環である