iii threetreeslight

June 30, 2018

blog availability monitoring by blackbox exporter

prometheus + grafanaでのmetric収集とvisualizeが大分馴染んできたので、次に prometheus/blackbox_exporter を利用した死活監視を行います。 What is blackbox expoter? The blackbox exporter allows blackbox probing of endpoints over HTTP, HTTPS, DNS, TCP and ICMP. probing という表現なかなかいいですね。 各種プロトコルを用いて様々なendpointの探査をできるめちゃめちゃ便利です。 どのようなprobe outputが得られるのか? 存在するエンドポイントと存在しないエンドポイントの両方に通知を送るとどのような結果が得られるのか見てみます。 blackbox-exporter を立ち上げる。 docker run --rm -p 9115:9115 prom/blackbox-exporter:latest 存在するエンドポイント curl -H 'Accept: application/json' 'http://localhost:9115/probe?module=http_2xx&target=threetreeslight.com' # HELP probe_dns_lookup_time_seconds Returns the time taken for probe dns lookup in seconds # TYPE probe_dns_lookup_time_seconds gauge probe_dns_lookup_time_seconds 0.0028015 # HELP probe_duration_seconds Returns how long the probe took to complete in seconds # TYPE probe_duration_seconds gauge probe_duration_seconds 0. ... Read more

June 17, 2018

Monitor blog on kubernates by Prometheus and grafana

kubernates上でblogを運用していることから、kubernatesや各contaienr, nodeのmetricをkubernates上で動かしたprometheusで収集し、grafanaで描写するようにしました。 Overview 以下のような方針で構成する ingress <-> monitor service <-> monitor deployments - grafana -> prometheus GKEを利用している node, containerのmetricを収集する grafanaはpublic urlからアクセスできる prometheusはアクセス制御ができないので、port forwardingでアクセスする grafana, prometheusのデータは永続化しておく monitorというdeploymentを用意し、grafana, prometheusを同居させる monitor podsはdowntimeを許容する Prometheus kubernatesから各contaienrおよびnodeのmetricをkubernates apiserverを通して取得する。 以下のprometheusにrepoに同梱されているexpampleを参考にすることでイメージが付くと思います https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus-kubernetes.yml nodeのmetric収集 # Scrape config for nodes (kubelet).-job_name:'kubernetes-nodes'kubernetes_sd_configs:-role:nodescheme:httpstls_config:ca_file:/var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file:/var/run/secrets/kubernetes.io/serviceaccount/tokenrelabel_configs:-action:labelmapregex:__meta_kubernetes_node_label_(.+)-target_label:__address__replacement:kubernetes.default.svc:443-source_labels:[__meta_kubernetes_node_name]regex:(.+)target_label:__metrics_path__replacement:/api/v1/nodes/${1}/proxy/metrics container metrics # Scrape config for Kubelet cAdvisor.-job_name:'kubernetes-cadvisor'kubernetes_sd_configs:-role:nodescheme:httpstls_config:ca_file:/var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file:/var/run/secrets/kubernetes.io/serviceaccount/tokenrelabel_configs:-action:labelmapregex:__meta_kubernetes_node_label_(.+)-target_label:__address__replacement:kubernetes.default.svc:443-source_labels:[__meta_kubernetes_node_name]regex:(.+)target_label:__metrics_path__replacement:/api/v1/nodes/${1}/proxy/metrics/cadvisor node, container以外にも、pod, service, endpoint, ingress, kubernates api-serverの状態を監視することも可能です。 今回は、pod, endpoint, apiserverのmetricを収集します。 # Scrape config for API servers.-job_name:'kubernetes-apiservers'kubernetes_sd_configs:-role:endpointsscheme:httpstls_config:ca_file:/var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file:/var/run/secrets/kubernetes.io/serviceaccount/tokenrelabel_configs:-source_labels:[__meta_kubernetes_namespace,__meta_kubernetes_service_name,__meta_kubernetes_endpoint_port_name]action:keepregex:default;kubernetes;https# scrape config for service endpoints. ... Read more

June 17, 2018

How to monitor node and container metrics on kubernates

kubernatesそのものや、kubernates上で稼働するnodeやcontainerを監視するのにとりあえずprometheusとやってしまっていたが、どのようなmetricを取得できるのか?ちゃんと知ったほうが良さそう。 そのためにも、 kubernates - Tools for Monitoring Compute, Storage, and Network Resources を読み進めていく。 Heapster Kubernatesは Heapsterを使ってログや各イベントの収集を行っているようだ。 ただ、当のHeapsterは以下の通りDeprecatedとなっている。 DEPRECATED: Heapster is deprecated. Consider using metrics-server and a third party metrics pipeline to gather Prometheus-format metrics instead. See the deprecation timeline for more information on support. We will not be adding any new features to Heapster. どうやらheapsterは廃止となり、prometheus formatのeventを処理するthird partyのメトリクス収集パイプラインを使うことを推奨しているようだ。 とはいえ、本ドキュメントを読んでどのような機構でmetric収集すべきか理解することは意味があるので読み進める。 Heapsterは各nodeに配置されたkubeletとcadvisorからデータを収集している。 イメージとしてはこんな感じ Heapster <- kubelet <- cadvisor これは、node_exporterやcAdvisorをdeamonsetとして各コンテナに配置する必要はすでにないことを意味する。 ... Read more

June 16, 2018

What is RBAC on Kubernates

blogをオーバーキルするyaml職人です。そしてkubernates入門はまじで入門すぎて全然役に立たない日々です。 今日はkubernatesのRBACとGCP IAMを正しく理解していない結果、これどっちの権限の問題やねん?と詰まることが多かったので、そこらへんの理解を軽く深めます。 GCPはquota limitでだめだったり権限だめだったり辛い。機能はめっちゃイケてるんだけど、慣れていないのが辛い。 kubernatesにおける認可とは? Kubernatesの Authorization Overview を見てみる Kubernetes authorizes API requests using the API server. It evaluates all of the request attributes against all policies and allows or denies the request. All parts of an API request must be allowed by some policy in order to proceed. This means that permissions are denied by default. すべての操作はkubernates API server を通して行われ、基本的には拒否るよ。 Review Your Request Attributes を見ると、ざっとこれだけのきめ細やかな制御がきる。 ... Read more

May 29, 2018

Develop GAS on local

業務改善のためにGAS (Google Apps Script) は書かせません ただ、script editorを使ってweb上でデバッグするのは少し効率の悪い作業です。 また、テストを記述することもできません。 そのため、localで如何にgoogle apps scriptを開発するべきか考えをまとめました。 manage and deploy google apps script by clasp Collaborating with Other Developers は必読。 localでgoogle apps scriptを管理するために google/clasp を利用します。 Claspはgasをgitのようにgasのversioning、push/pullなどをサポートします。 Prepare to use clasp Then enable Apps Script API: script.google.com/home/usersettings install clasp sudo npm i @google/clasp -g OAuth loginする。このとき、以下の通りownkey optionをつけて手元に持ってくる必要がある https://github.com/google/clasp/blob/4bc1e32d742e686532d4d51633b59e7c091dba53/index.ts#L766 * Note: to use this command, you must have used clasp login --ownkey clasp login --ownkey 既存projectを管理するための準備をする ... Read more

May 27, 2018

Study to collect container metrics with grafana and prometheus

kubernates環境下へのrolling updateまで自動化なんとなできました。 続いては監視です。 監視するに置いて何が良いのか、何がdefactとなっていくのかを見据えて選定。 Cloud Native Computing Foundation CNCFにはデファクトになるというロジックに則って、どのプロジェクトを採用するか考えてみる そもそもCNCFとは? The Cloud Native Computing Foundation builds sustainable ecosystems and fosters a community around a constellation of high-quality projects that orchestrate containers as part of a microservices architecture. うん。よくわからない。 個人的にはcontainerを利用したサービス運用に関わる様々なものの標準化の流れを作っている理解です。 その中でmonitoring toolとなるとprometheus。 というわけで、prometheusをmonitoring toolとして利用します。 また、prometheusのweb uiはchart表現力が貧弱なので、chartの表示にはgrafanaを利用していきます。 What is prometheus Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud. Since its inception in 2012, many companies and organizations have adopted Prometheus, and the project has a very active developer and user community. ... Read more

May 26, 2018

Automate build image and rolling update on kubernates

もろもろ環境が整ったところで、ciでのimage build and push と kubernates上で稼働するcotainerのrolling updateを行う。 Automate image build and push multi-stage buildを使いたかったので組み込みつつ、ci上でbuildを通すようにした。 dockerfileはこんな感じ。 FROMalpine:latest AS buildLABEL maintainer "threetreeslight"LABEL Description="hugo docker image" Vendor="threetreeslight" Version="0.1"ENVHUGO_VERSION 0.40.1RUN apk update \ && apk upgrade \ && apk add --no-cache ca-certificates curl \ && update-ca-certificates \ && cd /tmp \ && curl -L https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-64bit.tar.gz -o ./hugo_${HUGO_VERSION}_Linux-64bit.tar.gz \ && tar xvzf ./hugo_${HUGO_VERSION}_Linux-64bit.tar.gz \ && mv /tmp/hugo /usr/local/bin \ && rm -rf /var/cache/apk/* \ && rm -rf /tmp/* /var/tmp/*COPY . ... Read more

May 19, 2018

publish blog on kubernetes with ingress

gcs上での展開が完了したのと、gcpでのloadbalancingも含めて大体わかってきたので、このblogをgkeを利用してcotnainer運用してみようと思う 構成 多分こんな感じになるだろうと考えて作業 forwarding rule <-> target proxy <-> url-map <-> backend-service <-> node ip <-> pod Create blog image 展開するためのcontaienrを作成する。 まずはnginxまわりを設定 nginx.conf volumeを圧迫しないように、error_log, access_logを /dev つなぎこむ user nginx; worker_processes 1; error_log stderr info; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /dev/stdout; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; } blog. ... Read more

May 13, 2018

support https access to blog with loadbalancer

GCPを触れば触るほどmodule化されているんだなぁと関心。 GCS単体ではhttpsアクセス出来ないので、前段にloadbalancerを噛ませてhttpsアクセスできるようにしてみる。 構成 GCPのloadbalancerはawsとだいぶ違う。 そのため、全体像を事前に理解しておくために コンテンツ ベースの負荷分散の作成 をやっておくと良い。 出典: コンテンツ ベースの負荷分散の作成 今回はGCSへ転送するので、backend-serviceではなくbackend bucketを利用します。 IP <-> forwarding rule <-> target proxy <-> url-map <-> backend-buckets <-> gcs AWSとだいぶ異なるため、それぞれの構成要素がawsでいうと何に当たるのかをマッピングして説明します。 IP entrypointとなるIP address. gcpから払い出しておく必要がある AWSのように作成されたloadbalancerに勝手にentrypointが出来るものではなく、IPを払い出し明示的に割り当てる必要がある forwarding rule 指定されたip, portへのrequestを何処に転送 (target proxy) するか決まったルール 特定のloadbalancerに必ず紐づくものではない。 AWSでいうとalbのlistenerあたりが近い。また、security groupが無いということ。 target proxy URL マップにリクエストの経路を指定するターゲット HTTP プロキシ。そのため、https access時の認証を行うssl証明書はtarget proxyが保持する AWSでいうlistenerが近い。 url-map リクエストの URL を解析し、リクエスト URL のホストとパスに基づいて、特定のバックエンド サービスに特定のリクエストを転送。 AWSでいうとtaget groupが近い backend-bucket url-mapをもとに決定された転送先。 backend-serviceを利用するとインスタンスのhealthcheckまでを責務を持つものに成る。 url-mapとbackend-bucketをあわせることで、awsでいうtarget groupになる。 Creating Content-Based Load Balancing gcs bucketにアクセスをつなぐbackend bucketを作成します。 事前に blog. ... Read more

May 13, 2018

Generate SSL/TLS certificate with let's encrypt

gcpにはaws acmに該当するサービスがないので、証明書を作成しなければいけない。 そのため、Let’s encryptを利用した証明書発行を行う。 Let’s encryptとは https://letsencrypt.org/about/ Let’s Encrypt is a free, automated, and open certificate authority (CA), run for the public’s benefit. It is a service provided by the Internet Security Research Group (ISRG). 通信の安全を担保するためにも全ての通信がssl/tls ptorocolでの通信する必要がある。 そのためにも、free and automatedなCAっていうのが大事。それを提供しているのがlet’s encryptedという認識です。 let’s encryptによる証明書の発行にはshell accessとそうでない方法ががあり、shell accessを前提としたcertbot ACME clinetを使うと良いよということのようだ。 https://letsencrypt.org/getting-started/ We recommend that most people with shell access use the Certbot ACME client. It can automate certificate issuance and installation with no downtime. ... Read more