GGG

プログラミング言語やソフトウェア開発について思ったことを書いてます

helm 入門(kubernetes)

以下のサイトを参考に作業してみた。 helmとはどんなものかは、さわってみた qiita.com

前提条件

  • mac
  • minikube
  • kubernetes

mac os

kubernetes version

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.1", GitCommit:"3a1c9449a956b6026f075fa3134ff92f7d55f812", GitTreeState:"clean", BuildDate:"2018-01-04T20:00:41Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.0", GitCommit:"0b9efaeb34a2fc51ff8e4d34ad9bc6375459c4a4", GitTreeState:"dirty", BuildDate:"2017-10-17T15:09:55Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"}

minikube version

 $ minikube version
minikube version: v0.23.0

手順

brew install

$ brew install kubernetes-helm

helm init

$ Helm init

Creating /Users/<user>/.helm 
Creating /Users/<user>/.helm/repository 
Creating /Users/<user>/.helm/repository/cache 
Creating /Users/<user>/.helm/repository/local 
Creating /Users/<user>/.helm/plugins 
Creating /Users/<user>/.helm/starters 
Creating /Users/<user>/.helm/cache/archive 
Creating /Users/<user>/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /Users/<user>/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!

確認: tilter

$ kubectl get pods --all-namespaces | grep tiller 
kube-system   tiller-deploy-5b9d65c7f-xsz6k   1/1       Running   0          18m

確認 helm version

$ helm version
Client: &version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}

確認:stableのパッケージ一覧

 helm search
NAME                            VERSION DESCRIPTION                                       
stable/acs-engine-autoscaler    2.1.1   Scales worker nodes within agent pools            
stable/aerospike                0.1.5   A Helm chart for Aerospike in Kubernetes          
stable/artifactory              6.2.4   Universal Repository Manager supporting all maj...
stable/aws-cluster-autoscaler   0.3.2   Scales worker nodes within autoscaling groups.    
stable/buildkite                0.2.0   Agent for Buildkite                               
stable/centrifugo               2.0.0   Centrifugo is a real-time messaging server.       
stable/chaoskube                0.6.1   Chaoskube periodically kills random pods in you...
stable/chronograf               0.4.0   Open-source web application written in Go and R...
stable/cluster-autoscaler       0.3.1   Scales worker nodes within autoscaling groups.    
stable/cockroachdb              0.5.4   CockroachDB is a scalable, survivable, strongly...
stable/concourse                0.10.8  Concourse is a simple and scalable CI system.     
stable/consul                   1.1.3   Highly available and distributed service discov...
stable/coredns                  0.8.0   CoreDNS is a DNS server that chains plugins and...
stable/coscale                  0.2.0   CoScale Agent                                     
stable/dask-distributed         2.0.0   Distributed computation in Python                 
stable/datadog                  0.10.3  DataDog Agent                                     
stable/docker-registry          1.0.0   A Helm chart for Docker Registry                  
stable/dokuwiki                 0.2.1   DokuWiki is a standards-compliant, simple to us...
stable/drupal                   0.11.3  One of the most versatile open source content m...
stable/elastalert               0.1.0   ElastAlert is a simple framework for alerting o...
stable/etcd-operator            0.6.2   CoreOS etcd-operator Helm chart for Kubernetes    
stable/external-dns             0.4.4   Configure external DNS servers (AWS Route53, Go...
stable/factorio                 0.3.0   Factorio dedicated server.                        
stable/fluent-bit               0.2.4   Fast and Lightweight Log/Data Forwarder for Lin...
stable/g2                       0.2.0   G2 by AppsCode - Gearman in Golang                
stable/gcloud-endpoints         0.1.0   Develop, deploy, protect and monitor your APIs ...
stable/gcloud-sqlproxy          0.2.2   Google Cloud SQL Proxy                            
stable/ghost                    2.1.7   A simple, powerful publishing platform that all...
stable/gitlab-ce                0.2.1   GitLab Community Edition                          
stable/gitlab-ee                0.2.1   GitLab Enterprise Edition                         
stable/grafana                  0.5.4   The leading tool for querying and visualizing t...
stable/hadoop                   1.0.1   The Apache Hadoop software library is a framewo...
stable/heapster                 0.2.4   Heapster enables Container Cluster Monitoring a...
stable/influxdb                 0.8.0   Scalable datastore for metrics, events, and rea...
stable/ipfs                     0.2.0   A Helm chart for the Interplanetary File System   
stable/jasperreports            0.2.3   The JasperReports server can be used as a stand...
stable/jenkins                  0.11.0  Open source continuous integration server. It s...
stable/joomla                   0.5.4   PHP content management system (CMS) for publish...
stable/kapacitor                0.5.0   InfluxDB's native data processing engine. It ca...
stable/keel                     0.2.0   Open source, tool for automating Kubernetes dep...
stable/kibana                   0.2.0   Kibana is an open source data visualization plu...
stable/kube-lego                0.3.0   Automatically requests certificates from Let's ...
stable/kube-ops-view            0.4.1   Kubernetes Operational View - read-only system ...
stable/kube-state-metrics       0.5.1   Install kube-state-metrics to generate and expo...
stable/kube2iam                 0.6.1   Provide IAM credentials to pods based on annota...
stable/kubed                    0.1.0   Kubed by AppsCode - Kubernetes daemon             
stable/kubernetes-dashboard     0.4.3   General-purpose web UI for Kubernetes clusters    
stable/lamp                     0.1.0   Modular and transparent LAMP stack chart suppor...
stable/linkerd                  0.4.0   Service mesh for cloud native apps                
stable/locust                   0.1.2   A modern load testing framework                   
stable/magento                  0.5.2   A feature-rich flexible e-commerce solution. It...
stable/mailhog                  2.0.0   An e-mail testing tool for developers             
stable/mariadb                  2.1.3   Fast, reliable, scalable, and easy to use open-...
stable/mcrouter                 0.1.0   Mcrouter is a memcached protocol router for sca...
stable/mediawiki                0.6.1   Extremely powerful, scalable software and a fea...
stable/memcached                2.0.1   Free & open source, high-performance, distribut...
stable/metabase                 0.3.0   The easy, open source way for everyone in your ...
stable/minecraft                0.2.0   Minecraft server                                  
stable/minio                    0.4.3   Distributed object storage server built for clo...
stable/mongodb                  0.4.22  NoSQL document-oriented database that stores JS...
stable/mongodb-replicaset       2.1.4   NoSQL document-oriented database that stores JS...
stable/moodle                   0.4.1   Moodle is a learning platform designed to provi...
stable/msoms                    0.1.1   A chart for deploying omsagent as a daemonset K...
stable/mysql                    0.3.4   Fast, reliable, scalable, and easy to use open-...
stable/namerd                   0.2.0   Service that manages routing for multiple linke...
stable/neo4j                    0.4.0   Neo4j is the world's leading graph database       
stable/newrelic-infrastructure  0.0.1   A Helm chart to deploy the New Relic Infrastruc...
stable/nginx-ingress            0.8.22  An nginx Ingress controller that uses ConfigMap...
stable/nginx-lego               0.3.0   Chart for nginx-ingress-controller and kube-lego  
stable/odoo                     0.7.0   A suite of web based open source business apps.   
stable/opencart                 0.6.0   A free and open source e-commerce platform for ...
stable/openvpn                  2.0.2   A Helm chart to install an openvpn server insid...
stable/orangehrm                0.5.0   OrangeHRM is a free HR management system that o...
stable/osclass                  0.5.0   Osclass is a php script that allows you to quic...
stable/owncloud                 0.5.3   A file sharing server that puts the control and...
stable/pachyderm                0.1.1   Pachyderm is a large-scale container-based work...
stable/parse                    0.3.2   Parse is a platform that enables users to add a...
stable/percona                  0.3.0   free, fully compatible, enhanced, open source d...
stable/phabricator              0.5.5   Collection of open source web applications that...
stable/phpbb                    0.6.0   Community forum that supports the notion of use...
stable/postgresql               0.8.5   Object-relational database management system (O...
stable/prestashop               0.5.3   A popular open source ecommerce solution. Profe...
stable/prometheus               4.6.16  Prometheus is a monitoring system and time seri...
stable/prometheus-to-sd         0.1.0   Scrape metrics stored in prometheus format and ...
stable/rabbitmq                 0.6.14  Open source message broker software that implem...
stable/rabbitmq-ha              0.1.1   Highly available RabbitMQ cluster, the open sou...
stable/redis                    1.1.5   Open source, advanced key-value store. It is of...
stable/redis-ha                 2.0.0   Highly available Redis cluster with multiple se...
stable/redmine                  2.0.1   A flexible project management web application.    
stable/rethinkdb                0.1.0   The open-source database for the realtime web     
stable/risk-advisor             2.0.0   Risk Advisor add-on module for Kubernetes         
stable/rocketchat               0.1.2   Prepare to take off with the ultimate chat plat...
stable/sapho                    0.2.1   A micro application development and integration...
stable/searchlight              0.1.0   Searchlight by AppsCode - Alerts for Kubernetes   
stable/selenium                 0.2.5   Chart for selenium grid                           
stable/sensu                    0.2.0   Sensu monitoring framework backed by the Redis ...
stable/sentry                   0.1.7   Sentry is a cross-platform crash reporting and ...
stable/sonarqube                0.3.2   Sonarqube is an open sourced code quality scann...
stable/sonatype-nexus           0.1.6   Sonatype Nexus is an open source repository man...
stable/spark                    0.1.6   Fast and general-purpose cluster computing system.
stable/spartakus                1.1.3   Collect information about Kubernetes clusters t...
stable/spinnaker                0.3.10  Open source, multi-cloud continuous delivery pl...
stable/spotify-docker-gc        0.1.1   A simple Docker container and image garbage col...
stable/stash                    0.2.0   Stash by AppsCode - Backup your Kubernetes Volumes
stable/sugarcrm                 0.2.2   SugarCRM enables businesses to create extraordi...
stable/suitecrm                 0.3.2   SuiteCRM is a completely open source enterprise...
stable/sumokube                 0.1.1   Sumologic Log Collector                           
stable/sumologic-fluentd        0.2.1   Sumologic Log Collector                           
stable/swift                    0.2.0   swift by AppsCode - Ajax friendly Helm Tiller P...
stable/sysdig                   0.4.0   Sysdig Monitor and Secure agent                   
stable/telegraf                 0.3.0   Telegraf is an agent written in Go for collecti...
stable/testlink                 0.4.16  Web-based test management system that facilitat...
stable/traefik                  1.15.2  A Traefik based Kubernetes ingress controller w...
stable/uchiwa                   0.2.2   Dashboard for the Sensu monitoring framework      
stable/verdaccio                0.1.2   A lightweight private npm proxy registry (sinop...
stable/voyager                  2.0.0   Voyager by AppsCode - Secure Ingress Controller...
stable/weave-cloud              0.1.2   Weave Cloud is a add-on to Kubernetes which pro...
stable/weave-scope              0.9.1   A Helm chart for the Weave Scope cluster visual...
stable/wordpress                0.7.9   Web publishing platform for building blogs and ...
stable/zeppelin                 1.0.0   Web-based notebook that enables data-driven, in...
stable/zetcd                    0.1.4   CoreOS zetcd Helm chart for Kubernetes    

install

$ helm install stable/redis-ha
NAME:   agile-guppy
LAST DEPLOYED: Mon Jan  8 18:01:54 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Service
NAME                             TYPE       CLUSTER-IP  EXTERNAL-IP  PORT(S)    AGE
agile-guppy-redis-ha-master-svc  ClusterIP  10.0.0.189  <none>       6379/TCP   2s
agile-guppy-redis-ha-sentinel    ClusterIP  10.0.0.198  <none>       26379/TCP  2s
agile-guppy-redis-ha-slave-svc   ClusterIP  10.0.0.61   <none>       6379/TCP   2s

==> v1beta1/Deployment
NAME                           DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
agile-guppy-redis-ha-sentinel  3        3        3           0          2s
agile-guppy-redis-ha-server    3        3        3           0          2s

==> v1/Pod(related)
NAME                                            READY  STATUS             RESTARTS  AGE
agile-guppy-redis-ha-sentinel-55b94ddd8c-5nxsg  0/1    ContainerCreating  0         2s
agile-guppy-redis-ha-sentinel-55b94ddd8c-9kscd  0/1    ContainerCreating  0         2s
agile-guppy-redis-ha-sentinel-55b94ddd8c-9qfk4  0/1    ContainerCreating  0         2s
agile-guppy-redis-ha-server-d474fdb7-25b7x      0/1    Pending            0         2s
agile-guppy-redis-ha-server-d474fdb7-g27gq      0/1    ContainerCreating  0         2s
agile-guppy-redis-ha-server-d474fdb7-m2kxw      0/1    ContainerCreating  0         2s


NOTES:
Redis cluster can be accessed via port 6379 on the following DNS name from within your cluster:
agile-guppy-redis-ha.default.svc.cluster.local

To connect to your Redis server:

1. Run a Redis pod that you can use as a client:

   kubectl exec -it agile-guppy-redis-ha-master-0 bash

2. Connect using the Redis CLI:

  redis-cli -h agile-guppy-redis-ha.default.svc.cluster.local

List

$ helm list                                                                                                              
NAME        REVISION    UPDATED                     STATUS      CHART           NAMESPACE
agile-guppy 1           Mon Jan  8 18:01:54 2018    DEPLOYED    redis-ha-2.0.0  default  

確認pods

kubectl get pods --show-labels                                                                                         
NAME                                             READY     STATUS    RESTARTS   AGE       LABELS
agile-guppy-redis-ha-sentinel-55b94ddd8c-5nxsg   1/1       Running   0          2h        app=redis-ha,chart=redis-ha-2.0.0,heritage=Tiller,name=agile-guppy-redis-ha-sentinel,pod-template-hash=1165088847,podIP=172.17.0.7,redis-role=sentinel,release=agile-guppy
agile-guppy-redis-ha-sentinel-55b94ddd8c-9kscd   1/1       Running   0          2h        app=redis-ha,chart=redis-ha-2.0.0,heritage=Tiller,name=agile-guppy-redis-ha-sentinel,pod-template-hash=1165088847,podIP=172.17.0.8,redis-role=sentinel,release=agile-guppy
agile-guppy-redis-ha-sentinel-55b94ddd8c-9qfk4   1/1       Running   0          2h        app=redis-ha,chart=redis-ha-2.0.0,heritage=Tiller,name=agile-guppy-redis-ha-sentinel,pod-template-hash=1165088847,podIP=172.17.0.6,redis-role=sentinel,release=agile-guppy
agile-guppy-redis-ha-server-d474fdb7-25b7x       1/1       Running   0          2h        app=redis-ha,chart=redis-ha-2.0.0,heritage=Tiller,name=redis-server,pod-template-hash=80309863,podIP=172.17.0.9,redis-node=true,redis-role=master,release=agile-guppy,runID=fe5a64
agile-guppy-redis-ha-server-d474fdb7-g27gq       1/1       Running   0          2h        app=redis-ha,chart=redis-ha-2.0.0,heritage=Tiller,name=redis-server,pod-template-hash=80309863,podIP=172.17.0.11,redis-node=true,redis-role=slave,release=agile-guppy,runID=7781d7
agile-guppy-redis-ha-server-d474fdb7-m2kxw       1/1       Running   0          2h        app=redis-ha,chart=redis-ha-2.0.0,heritage=Tiller,name=redis-server,pod-template-hash=80309863,podIP=172.17.0.10,redis-node=true,redis-role=slave,release=agile-guppy,runID=69b5f2

Delete

$ helm delete agile-guppy
release "agile-guppy" deleted

最後に

  • 参考URLでは独自パッケージ作成をやっているため、そのうちやってみたい。

簡単にredis-ha をデプロイすることができた。

仕事でkubernetesを使っているが、自分で構築した時にそこそこ時間がかかったのを覚えてる。 これだけ簡単にデプロイできるなら選択肢としてもありかも?

もう少し検証した上で採用までもっていけるか判断したいなと思いました。 設定項目はとても参考になりそうです。こちらももう少し掘り下げて行きたい。

brew doctor (coreutil関連)[Putting non-prefixed findutils ...]

brew doctorを実行したら下記のWarningが出ていたので対応した。いつから? もしかしたら brew upgrade して pythonがバージョンが上がったのが影響しているかもしれない。

findutilsについて警告がでている。 要はfindutilsをuninstall -> install して解決。

症状

$ brew doctor 
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Putting non-prefixed findutils in your path can cause python builds to fail.

解決

$ brew uninstall findutils 
Uninstalling /usr/local/Cellar/findutils/4.6.0... (25 files, 1.6MB)


$ brew install findutils
==> Downloading https://homebrew.bintray.com/bottles/findutils-4.6.0.high_sierra.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring findutils-4.6.0.high_sierra.bottle.2.tar.gz
==> Caveats
All commands have been installed with the prefix 'g'.
If you do not want the prefix, install using the "with-default-names" option.

If you need to use these commands with their normal names, you
can add a "gnubin" directory to your PATH from your bashrc like:

    PATH="/usr/local/opt/findutils/libexec/gnubin:$PATH"

Additionally, you can access their man pages with normal names if you add
the "gnuman" directory to your MANPATH from your bashrc as well:

    MANPATH="/usr/local/opt/findutils/libexec/gnuman:$MANPATH"
==> Summary
🍺  /usr/local/Cellar/findutils/4.6.0: 34 files, 1.6MB

参考

Installing and configuring GNU command-line utilities

brew link error

brew doctorを実行したら下記のwarningが出ていたので対応した。 下記URLを参考にしました。

症状

$ brew doctor
・
・
Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  python

brew link python

inking /usr/local/Cellar/python/2.7.14_2... Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks

解決 

sudo install -d -o $(whoami) -g admin /usr/local/Frameworks

参考

gist.github.com

「PEAK PERFORMANCE 最強の成長術」読んで見た

PEAK PERFORMANCE 最強の成長術

PEAK PERFORMANCE 最強の成長術

書店でふと目にとまった。 年末だし、振り返るにはいいかなと思った。来年はさらに良い年になるようにしたいです。

まとめ

  • 上手な休息を実践する
  • 自分を超越した目的を持つ。
  • 負荷は頑張ればギリギリ届くくらいを目標とする

上手な休息

  • マインドフルネスがいいらしい。タイマーを使うといいかも?

1日

業務中

業務中にもしっかり休息時間をとることが重要 個人差があるみたいで、だいたい30分〜90分間ごとに休息をとるのがいいみたい。 本では紹介されていないけど、ポモドーロとか有名ですね。

屋内外問わず散歩がいいらしい。席を立てないなら風景画もあり?

仮眠をとる

30分未満が良いらしい。

帰宅後

  • 家に仕事を持ち帰らない。
  • 睡眠がとても重要。7時間以上寝たほうがいいみたい

平日は寝れていないし、家に帰っても時々やってしまっている。。。

週末

  • 1週間に1日は完全に仕事を忘れる日があると良い。忙しい時ほど重要みたい。

1日は家族と過ごして、携帯もPCも見ない日を作りたい。

長期休暇

  • リフレッシュ休暇は重要みたい。現職だと5営業日しか連続で休めないので、祝日と組み合わせると良いかも?来年は必ず取得しよう。

ここ最近は旅行先でぼーっと過ごしたが、そんなに間違ってなかったかも。来年も続けたい。

目的

  • 自分のためだと限界があるみたい。火事場の馬鹿力を出すためには「誰かのために」があるといいらしい
  • 目に見えるところに貼って毎日確認

職場に貼るのはちょっと恥ずかしい。手帳にでも書いて始業前に確認することから始めようかな?

負荷

  • 重すぎると耐えられず、軽すぎると負荷にならない?絶妙なポイントがいい。コンフォートゾーンから出てるポイントがいいみたい。
    • 人によっても違うからメンバーにアサインする際には注意しないと成長に結びつかないな。来年はもう少し気を使おう。

ルーティーン

  • 心と体の準備はアスリートでなくてもあるといいらしい。千差万別。自分に合ったルーティーンを見つけたい。

補足

プロダクションレディマイクロサービスを読んでみた

書籍を読んだものの、読みっぱなしになっていたので気づいた点をメモしておこうと思う。

動機

  • 所属先ではSREプロジェクトが立ち上がりジョインしているが、具体的に何をするのかよくわかっておらず勉強し始めた次第。
  • コンテナを用いた開発・本番運用が組織内で本格化している。
  • モノリシックなアーキテクチャからマイクロサービスへの転換が起こり始めている。

感想

大規模サービス向けに書かれている内容が多いです。 そのため、求められる基準がかなり高い。

私はスタートアップ系のため、うーん。ただ学ぶことは非常に多い。 これが全てできるようになったら大企業が行なっている品質基準を満たすことができるということがわかった。

これから少しずつ対応していきたい。

書籍でも対応するのに数年かかると言っている。焦らずに地道に対応して行くしかないですね。

思ったことについて、それぞれの項目の中で書いた。

概要

マイクロサービス化をした(あるいは、これからする)ものの、本番環境で利用するには何をすべきかについて 8つの評価基準を設けて、それについて語っているものです。

また、これとは別に可用性という9つ目の指標があるが、これについては8つの基準を満たすことで高い可用性を保つことができると言われている。

  • 安定性 (Stability)
  • 信頼性 (Reliability)
  • スケーラビリティ (Scalability)
  • パフォーマンス (Performance)
  • 耐障害性 (Fault Tolerance)
  • 大惨事対応 (Catastrophe Preparedness)
  • 監視 (Monitoring)
  • ドキュメント (Documentation)

8評価基準に対するメモ

安定性

変更によるマイナスの影響を緩和するための施策が用意されていること

安定したデプロイ 

開発環境 -> ステージング -> カナリア --> 本番

デプロイによる影響を最小限に抑える。また問題が発生しても自動的にリカバリーする仕組みが有ると良い。 カナリア:本番環境の2-5%程度のトラフィックを処理させて変更内容を検証する環境をいうらしい。しばらく、この環境で運用し問題がなければ本番環境にデプロイする流れ。

デプロイに失敗した場合に自動的にロールバックする仕組みが有ると良い。

所感

カナリア環境はないので、へぇー!と思った。用意してみたい。 また、デプロイ成功したんだけど、その後の継続的なヘルスチェックで失敗したらロールバックさせる仕組みが有るといいなと思った。

信頼性

  • クライアントやステークホルダーからみて安心して使えるマイクロサービスであることに対する基準
    • テストがしっかりされている
    • 安心、確実なデプロイ

クライアントはマイクロサービスを使っている別のマイクロサービスという意味も有るかも。

所感

  •  テストはしてるけど、十分にできているかは疑問が湧いた。今までと違った観点でのテストが必要かもしれない。

スケーラビリティ

タスクをどのように分割統治するか

並行性、パーティション分割

  • トラフィックの増加に簡単に対応できる
    • できないと , レイテンシ増加、インシデント、機能停止に繋がる。
  • 質的な成長、量的な成長の二つの判断基準を明確にする
    • 質:ページビューなど
    • 量:毎秒何リクエストまで処理可能かなど
  • データ格納、処理する方法もスケーラブル
  • 急激なトラフィック増大(バースト処理)に対応できる

アーキテクチャのレビューを行うことでどこに問題があるか分かるらしい。

所感

  • ウィークポイントな気がする。書きたいことがいっぱいありすぎる。

パフォーマンス

マイクロサービスがタスクをどれくらい効率よく処理しているか

  • 非同期処理によりパフォーマンス・スケーラビリティ向上ができるのに同期処理にしている ... 改善必要
  • コストが高い通信などの処理を大量に行なっている .. SQLの大量発行とか?
  • CPU,メモリなどのリソース割り当てを富豪的に使っている ... お金の無駄遣い? (コストパフォーマンス?)

所感

  • ウィークポイントな気がする。アプリケーション内の処理で改善できることがたくさんありそう。

耐障害性 / 大惨事対応

機能停止、インシデントが発生した場合の対処が行われている

それらが自動的に繰り返し、ランダムでテストされている

障害の検出と修正

新たに見つかったら、テストスイートに追加する

  1. 障害発生のシナリオを明らかにする
  2. 戦略を練る
  3. 計画を立てる

計画を立てて終わりだと、あまり意味がない。避難訓練みたいに実際にやってみることが大事。

データセンターがダウンしたことを想定し、あるリージョン上のインスタンスを強制的にダウンさせてみるなど。

アーキテクチャレビューを重ねることで、色々問題点が分かるみたい。 基本的にはSPOF(Single Point of Failure)を排除して行くことが課題になりそうだ。

やってみること

回復性テスト

  • マイクロサービスエコシステム、インフラに強制的に障害を発生させてテストする
  • コードテスト
  • ロードテスト
  • カオステスト
    • 本番環境で障害シナリオを実行する。(ランダム&スケジュールされている)
    • 全ての障害シナリオに対応できることを証明し続ける。
    • Netfilixがやってると言われているテストでしょうか?

負荷テスト

トラフィックの急激な変化にどれだけ耐えられるか明確化する。また耐えられなくなった場合の対応措置を明確化する

手に負えない場合のシナリオ

どうしようもない場合に、何をすべきか決めておく。

連絡先の共有とかでしょうか?

所感

  • カオステストやってみたい。

監視

ロギング

必要な情報に簡単にアクセス、検索できることが重要らしい。 最近だと ElasticSearch , Kibanaとか?

必要な情報の定義が難しい。自分の解釈では問題が発生した際に再現をしなくてもログだけで原因がわかり修正ができる。ということかな。 再現できる不具合ばかりではないため。

GUI

dashboardとかの話。 サービスが健全で有ることがすぐ分かること。エンジニアでなくても見て分かることが重要らしい。 見せ方重要ですね。

アラート

効果的でアクション可能な主要メトリックに基づくアラート

障害の検知はアラートで行う。ダッシュボードを見ないとわからない・・・というのはよくないらしい。

  • 正常 , 警告、危険の3種類のアラートが有ると良いみたい。

所感

だいたいできてるのかな。ただ改善点は有る。

ドキュメント

  • 一元管理
  • 簡単にアクセス、検索できることが大事。

所感

ドキュメントはいくつかの場所に散在しちゃってて、改善したいと思ってました。

その他

  • マイクロサービス間の通信について
    • RPC(リモートプロシージャコール)を介したやりとり ... 非同期
    • REST APIによるやりとり ... 同期

マイクロサービスエコシステムの4層モデル

layer / 対象 備考
4 マイクロサービス
3 アプリケーションプラットフォーム
2 通信 サービス間の通信。DNS, RPC, API サービス検出、サービスレジストリ、負荷分散
1 ハードウェア Machine, OS , Docker,...

アンチパターン

  • APIをバージョニングすること

プロダクションレディマイクロサービス ―運用に強い本番対応システムの実装と標準化

プロダクションレディマイクロサービス ―運用に強い本番対応システムの実装と標準化

オリジナルはこちら

Production-Ready Microservices: Building Standardized Systems Across an Engineering Organization

Production-Ready Microservices: Building Standardized Systems Across an Engineering Organization

アジャイルな見積もりと計画づくり

職場の同僚からのお勧め本。

今回はいつもと違う感じでストーリー調に書いていきます。

状況把握

初めに、私はある新企画プロジェクトに参加することになったエンジニアです。リーダーの立場です。 開発メンバーは新卒です。他に企画系が2名います。

新企画プロジェクトの現状はだいたい作りたいものが決まっている状態です。 メンバー、リリース時期もだいたい決まっています。 ただし、仕様が決まっていない状態です。

ガントチャート / 試しにスケジュール作ってみる

そこで試しに「やること」を洗い出しました。 何も決まっていないのに、ステークホルダーから、いつ頃までにリリースできるか?といきなり聞かれたためです。 困りました。仕様も決まっていないのにリリース日が先なんです。

とりあえす「やるだろう」な項目を洗い出して、ガントチャートに起こしました。 また、困りました。

今回は、新卒のメンバーがいるため工数がとても出しにくいです。 作業スピードがどのくらいなのか、わかりません。まだ仕事にも慣れていない状態です。

出会い

これ読んで見たら?・・・紹介されました。

アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~

アジャイルなプロジェクト計画と見積もり

プロダクトバックログと見積もり(story points)とvelocity

これを元にこれから始まるプロジェクトのバックログを作成&見積もりをやって見ました。 プロダクトバックログは、プロダクトに必要な項目がまとまっている表のことです。

(この本では見積もりは、複数人でやることを推薦しておりますが、今回は一人でやりました。バックログの各項目はユーザーストーリという形でまとめたりするそうです。今回は機能(フィーチャー)という形式でまとめました。この時点であまり詳細化しない方が良いそうです。大きい単位はエピック、テーマなどと呼ぶそうです。)

バックログは着手すべき優先度の高い順序に並べます。(現状は、仕様が未定なのでとりあえず推測です)

見積もりは、基準の機能(だいたい何するか分かる機能)をピックアップして、ストーリーポイント=5としました。 あとは、相対と直感でどんどん見積もっていきます。見積もりは作業時間ではなく「規模」で見積もっていきます。 作業時間だと熟練度で差が出てしまうためです。

ストーリーポイントは1,2,3,5,8,13,21,... とフィボナッチ数で見積もっていきます。 5が基準です。

イテレーションを1週間と仮定した場合にストーリポイント=8が一人でクリアできそうなイメージです。

(書籍では、一人でこなせるストーリポイントは算出不可能な方が良いと語っております。ただし、今回はエンジニアが2名で1機能が一人ずつ一任して達成していくイメージで考えていたため、8 x 人数 --> velocity と考えられそうです。ベストプラクティスではなさそうですが・・。)

ところでvelocityは、実際に数イテレーションこなしてから平均化のようにしていくと良いようです。 将来的にどれくらいストーリポイントをこなせるか分かるためです。まだ一度もイテレーションを実施できていないので現状は推測です。

不確実性コーン

ところで、見積もりは不確実であるということを前提に行います。 不確実性コーンというものがあります。

要はプロジェクトの初期ほど不正確で後半になる程正確になることを表しています。 現状はプロジェクトの初期のため(まだ始まってもいない!)かなり不正確です。

http://itpro.nikkeibp.co.jp/article/COLUMN/20131001/508039/zu01_s.jpg

リリース計画

これで下記が分かりました

  • プロダクトバックログ
    • 合計のストーリポイント数.... (sp)
  • velocity .. 推測 ... (velocity)
  • リリース日
  • イテレーションの期間 ... (iteration)
    • 仮で1週間

この情報から下記の計算式により、リリース時期が見えてきます。

sp / velocity * iteration -- > 必要なイテレーション

この情報に、 * 年末年始、GW、メンバーの長期休暇、祝日の日数 * 不正確な見積もりのため、不確実性コーンを参考に最短、最長の予測をいれます。

これらを加味すればいつ頃にリリースできそうか見通しが立ちそうです。

もうガントチャートは不要です。

リリース計画ができました。

机上の空論にしてはなかなか良さそうです。

着手する「やること」、その順序も分かりました。ちょっと安心しました。 あとは、実際のvelocityが不明なのでイテレーションをやってみないと分かりません。 予定よりもできない可能性は十分あります。

今回は仮想のプロダクトバックログを相手にリリース計画を作りました。 予行演習ですね。

近々、プロダクトバックログをみんなでまとめる打ち合わせがあるので、そこでプロダクトバックログができそうです。

所感

リリース計画は、イテレーションが始まった後も絶えず更新し続けます。 初めに作って終わりではないそうです。

イテレーションのレビュー内容を元に新たなバックログが追加されるかもしれません。 このようにして積極的に変化を受け入れていくのだと思います。

イテレーションでは最優先の項目が順に消化させていきます。 MUSTの項目さえ終わっていればリリースできる状態にはなりそうです。

そのためには、ある程度カテゴリ付けして置いた方がよかったかもしれません。 書籍には下記の4つが紹介されてました

  • must have ... 必須
  • should have ... 重要
  • could have ... 有効
  • won't have ... 不要

イテレーション

まだ始まっていないので....

また後でモチベーションがあったら書くかも

キーワード

  • 不確実性コーン
  • ストーリーポイント(story points) / 理想日 / 理想時間
  • リリース計画
  • イテレーション

  • タイムボックス

  • ユーザーストーリー
  • フィーチャー
  • エピック、テーマ
  • プロダクトナレッジ、プロジェクトナレッジ
  • ベロシティ(velocity)
  • バッファ
    • フィーチャバッファ
    • スケジュールバッファ
  • バーンダウンチャート
  • ストーリーポイントの見積もりは10倍以内
  • ゆとりを持った計画 ... 75%くらいにしておくと良い。
    • 会議とか、割り込みとかを考慮

アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~

アジャイルな見積りと計画づくり ~価値あるソフトウェアを育てる概念と技法~

【感想】スモール・リーダーシップ

最近きになる書籍があって、読みました。

「スモール・リーダーシップ」という本です。

あとで内容を再確認できるように軽くまとめておく。

書籍のターゲット

著者はIT業界の人と思いますが、業界は特に関係なく全ての業界の小チームのリーダーの人、なったばかりの人がターゲットです。 またそこに属するメンバーにも読んでもらいたい良書だと思います。

と思われる。

小チームとは8人くらいまでのようだ。

結論から先に

平易な文章で書かれているため、読みやすかった。 良書だと思います。

ぜひ、みんなにオススメしたい

気になったキーワードをまとめてみる。

  • リーダーの振る舞い
    • サーバント型リーダー
    • 調停役
    • メンバーが自律的に行動。
  • リーダーの役割
    • チームとして成果を最大化 ... プロジェクト、スケジュール管理など
    • チームメンバーの成長を最大化する
  • 凡事徹底。規律の醸成。メンバへの敬意
  • 会議でホワイトボードは積極的に使う。 - > フレームワークの利用
  • 様々な場面で効果フレームワークを適用し、抜けなく漏れなくする。
  • 図解力
  • 議事録は残そう

フレームワーク

論理的思考

  • 網羅性、整合性

抽象 -- > 具体化

例示(for example) 対置(exclusion) 包含(inclusion) 等価(equation)

問題解決

その1

  • 現状 / 前提(制約条件など)
  • 目的・目標
  • 課題
  • 解決策

課題と解決策は分けて議論した方が良さそう。

その2

  • 仮説
  • 検証

図解

  • 静的構造
    • 家の間取り図のようなもの
    • ER図, クラス図、etc
  • 動的構造(時間軸に沿った変化)
    • 新聞の番組欄のようなもの
    • シーケンス図

自身に置き換えて考えてみる。

現状

  • 小チームのリーダーとなり1年近く経過しました。
  • 新規にプロジェクトが立ち上がろうとしており、今のチームを離れて新しいチームのリーダーとして活動が始まっております。

そこで、この一年間を振り返る、見直そうと思っていた矢先にこの本に出会いました。

私は、IT業界でエンジニアとして従事しており、開発チームのリーダーの立場です。 これまで従事していたプロジェクトのエンジニアチームは、私を含めて2-4名。企画も入れると最大8名程度のプロジェクトチームです。

どちらかと言うと支配型の要素が強いリーダーだったかも知れません。 上司からももう少しチームメンバーに自律性を育むような体制になればとても良さそうだと言われたことがあります。

目的・目標

サーバント型のリーダーになるにはどうしたら良いか?

課題

ある日から突然、完全サーバント型に切り替わって(人が変わったような)しまうときっと混乱を招くだろうと思います。 指示を出さない上司、指示待ちの部下と言う構図は悪循環になります。

解決策

焦らずにチームメンバーの自律性を時間をかけて育んで行くことを目標とする。

そのためには、仕事一つひとつに問題意識を持って自然と行動できるチームに少しずつ変えて行ければ自然と自律性は醸成されるのではないかと思う。 問題意識を持つためには、仕事の目的・意義などについて1件1件丁寧に考察を繰り返していくことが良いかも知れない。 また、チーム内で改善提案をより発言・受け入れられやすい態勢にして行くことが必要だろう。

そうすれば徐々に変わって行くと思う。 至極当たり前のことだけど、これを徹底することが必要なんだろう。

スモール・リーダーシップ チームを育てながらゴールに導く「協調型」リーダー

スモール・リーダーシップ チームを育てながらゴールに導く「協調型」リーダー