Think Twice

Memorandum

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

f:id:mix-juice001:20150709141558p:plain

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

f:id:mix-juice001:20150709144740p:plain

単独で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

f:id:mix-juice001:20150708225218j:plain

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歳のときに知っておきたかったこと スタンフォード大学集中講義

20歳のときに知っておきたかったこと スタンフォード大学集中講義

  • 作者: ティナ・シーリグ,Tina Seelig,高遠裕子
  • 出版社/メーカー: CCCメディアハウス
  • 発売日: 2010/03/10
  • メディア: ハードカバー
  • 購入: 475人 クリック: 17,353回
  • この商品を含むブログ (402件) を見る

確かに20歳のときに知っておきたかったことが書かれているが、
今でも十分に知っておきたいことでもある。
今よんだことで、間に合ったと思いたい本。
自分に許可を与えることをすぐに始めたい。

他人はあなたのやりたいことをやりなさいと指示することは決してないのだから、
自分でやりたいこと、やってみたいことは自分からやり始めないといけない。

許可を求めるな、許しを請え

ルールは破られるためにある。
ほとんどのルールは万人にとって安全であるようにつくられているので、
目的を達成するためにはルールを疑ってみることも必要である。
事前にコレコレをやってもよいかと許可を求めると、それではダメといわれることも、
事後にコレコレをやってしまいました、というと認めてもらえる。

人間は2つのタイプに分かれる

自分のやりたいことを誰かに許可されるのを待っている人
自分自信で許可する人。

誰かがチャンスを与えるの待つのではなく、自分でつかみにいった方がよい面がたくさんある。
たとえば、リーダーになろうと思ったら、リーダーとしての役割を引き受ける。
ただ、自分に許可を与えればよい。組織のなかに穴がないか探す。自分が欲しいものを求める。
自分のスキルと経験を活かせる方法を見つける。いち早く動こうとする。

Fail Fast

失敗から学ぶことは多い。
失敗のレジュメ作成すると、失敗というレンズを通して、自分の経験をみることにより、自分が犯してきた過ちを受け入れられるようになる。
失敗を認める文化にある場所はイノベーションも生まれる。その最たる場所がシリコンバレーである。
本の中ではタイやスペインが失敗にたいして、寛容でなく、リスクをとれなくなると書かれている。
日本もそちらに近いと思う。

スキルと情熱と市場が重なる場所

仕事だとは思わずに取り組める役割を社会のなかに見つけられたとき、それはやりがいがあるというだけではなく、前向きに情熱を傾けられ、人生を豊かにしてくれる。

幸運が舞い込む確率をあげ、舞い込んだチャンスを最大限活かす

よき観察者であり、開かれた心をもち、人当たりがよく、楽観的な人は幸運を呼び込める。

矢の周りに的を描く

交渉を効果的に進めるには、自分自身の最終目標と同様、交渉相手の目標も理解するよう努め、win-winの効果を模索し、いつ交渉の席を立つべきかを知るべきである。

よきチームプレイヤーであるためにはどうすればよいか?
他人を成功させるための労を惜しまないことである。
優秀な人(矢)を選び、その人が得意なことに近い仕事(的)をつくる。

この本の言いたいことはは
「自分に許可を与える」ということである。

  1. 常識を疑う許可
  2. 世の中を新鮮な目で見る許可
  3. 実験する許可
  4. 失敗する許可
  5. 自分自身の限界を許す許可

「自分に対しては真面目すぎず、他人に対しては厳しすぎないこと」
他人や自分の間違いにもっと寛容で失敗も学習プロセスの一環である


A crash course in creativity: Tina Seelig at ...