tjtjtjのメモ

自分のためのメモです

minikube いらんかった

長いことwindows+hyprevにminikube入れようと格闘していた。思い出した。やりたいのは minikube のインストールでなく Kubernetes だった。

そういえば、前に rancher で環境構築とか、素でk8s 構築とかやってたんだった。そこで勉強したらええやn。
https://qiita.com/zembutsu/items/41837d953a518c0b7f9e

とりあえずなら Interactive Tutorial の環境で試せる。
https://kubernetes.io/docs/tutorials/kubernetes-basics/

ここでもいい

Overview of Kubernetes Online Training
https://kubernetes.io/docs/tutorials/online-training/overview/

さくらのナレッジ minikube

さくらのナレッジをやってみるシリーズ。今回は minikube

簡単にローカルKubernetes環境を構築できるツール「Minikube」 https://knowledge.sakura.ad.jp/15320/

準備

minikube はじめる

version 確認

> minikube version
minikube version: v0.31.0

minikube start でクラスタ作成。なんかエラー出てるが、please enjoy minikube! だそうです。

> minikube start
C:\Users\zun\.kube>minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Downloading Minikube ISO
 178.87 MB / 178.87 MB [============================================] 100.00% 0s
Getting VM IP address...
E1222 11:17:41.088917   11420 start.go:210] Error parsing version semver:  Version string empty
Moving files into cluster...
Downloading kubeadm v1.10.0
Downloading kubelet v1.10.0
Finished Downloading kubelet v1.10.0
Finished Downloading kubeadm v1.10.0
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Stopping extra container runtimes...
Starting cluster components...
Verifying kubelet health ...
Verifying apiserver health ...Kubectl is now configured to use the cluster.
Loading cached images from config file.


Everything looks great. Please enjoy minikube!

クラスタ確認。これは kubectl

> kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
> kubectl get node
NAME       STATUS   ROLES    AGE   VERSION
minikube   Ready    master   12m   v1.10.0

kubectl cluster-info で表示された url を curl してみる。403 forbidden

> curl -k https://192.168.99.100:8443
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
  "reason": "Forbidden",
  "details": {

  },
  "code": 403
}

こっちも 403 forbidden

> curl -k https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "services \"kube-dns:dns\" is forbidden: User \"system:anonymous\" cannot get services/proxy in the namespace \"kube-system\"",
  "reason": "Forbidden",
  "details": {
    "name": "kube-dns:dns",
    "kind": "services"
  },
  "code": 403
}

kubectl cluster-info dump で大量の情報が得られるようだ。

}

kubectl cluster-info dump { "kind": "NodeList", "apiVersion": "v1", "metadata": { "selfLink": "/api/v1/nodes", "resourceVersion": "1367" }, : "items": [] } Cluster info dumped to standard output

> kubectl cluster-info dump

minikube dashboard でブラウザにダッシュボードが表示された

> minikube dashboard
Opening http://127.0.0.1:52124/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/ in your default browser...

kubectl get でいろいろみる

>kubectl get nodes
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     master    3m        v1.10.0

> kubectl get service
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   1m

>kubectl get deploy
No resources found.

> kubectl get pod
No resources found.

> kubectl get namespace
NAME          STATUS    AGE
default       Active    2m
kube-public   Active    2m
kube-system   Active    2m

minikube stop で virtualboxvm:minikube が停止する

> minikube stop
Stopping local Kubernetes cluster...
Machine stopped.

minikube delete で virtualbox のお掃除。virtualboxvm を直接削除した時もこれやれば大丈夫。

> minikube delete
Deleting local Kubernetes cluster...
Machine deleted.

クラスタ内のDockerにアクセスする

virtualbox と docker for windows といえば hyper-v 問題。ここはパスして次に進む。

Minikube環境内でコンテナを実行する

httpd.yml

apiVersion: v1
kind: Pod
metadata:
  name: httpd
  labels:
    app: httpd
spec:
  containers:
  - name: httpd
    image: httpd
    ports:
    - containerPort: 80 

create 前

> kubectl get pod
No resources found.

create

> kubectl create -f httpd.yml
pod "httpd" created

create 後

> kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
httpd     1/1       Running   0          29s

Minikube環境内のコンテナにアクセスする

ここは自前yaml作ってみた。

httpd-deployment.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 2                # レプリカ数の指定
  template:                  # Podのテンプレート(PodTemplate)
    metadata:
      labels:                # ラベル指定は必須
        app: httpd-deployment
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80

create と delete を繰り返した。

kubectl create -f httpd-deployment.yml
kubectl delete deployment httpd-deployment

httpd-service.yml

apiVersion: v1
kind: Service
metadata:
  name: httpd-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
  selector:
    app: httpd-deployment

create と delete を繰り返した。

kubectl create -f httpd-service.yml
kubectl delete service httpd-service
> kubectl get deployment
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
httpd-deployment   2         2         2            2           16m

> kubectl get service
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
httpd-service   LoadBalancer   10.109.139.219   <pending>     80:31873/TCP   13m
kubernetes      ClusterIP      10.96.0.1        <none>        443/TCP        1h

minikube で確認

minikube service httpd-service 

こうなった

f:id:tjtjtjofthedead:20181222174336p:plain
itworks!

knative のインストール 失敗

どのクラウドでも使えるサーバレス「GitLab Serverless」をGitLabが発表。KubernetesとKnativeがベース
https://www.publickey1.jp/blog/18/gitlab_serverlessgitlabkubernetesknative.html

Knativeをベースにしたサーバレス環境「Pivotal Function Service」、Pivotalがアルファ版発表
https://www.publickey1.jp/blog/18/knativepivotal_function_servicepivotal.html

Knative っすかー。やってみる。まずは1ノード(cpu:2core mem:4gb)で。

Installing Istio

```
> kubectl apply --filename https://raw.githubusercontent.com/knative/serving/v0.2.2/third_party/istio-1.0.2/istio.yaml
namespace "istio-system" created
configmap "istio-galley-configuration" created
configmap "istio-statsd-prom-bridge" created
configmap "istio-security-custom-resources" created
configmap "istio" created
:
unable to recognize "https://raw.githubusercontent.com/knative/serving/v0.2.2/third_party/istio-1.0.2/istio.yaml": no matches for kind "rule" in version "config.istio.io/v1alpha2"
unable to recognize "https://raw.githubusercontent.com/knative/serving/v0.2.2/third_party/istio-1.0.2/istio.yaml": no matches for kind "rule" in version "config.istio.io/v1alpha2"
unable to recognize "https://raw.githubusercontent.com/knative/serving/v0.2.2/third_party/istio-1.0.2/istio.yaml": no matches for kind "kubernetes" in version "config.istio.io/v1alpha2"
unable to recognize "https://raw.githubusercontent.com/knative/serving/v0.2.2/third_party/istio-1.0.2/istio.yaml": no matches for kind "DestinationRule" in version "networking.istio.io/v1alpha3"
unable to recognize "https://raw.githubusercontent.com/knative/serving/v0.2.2/third_party/istio-1.0.2/istio.yaml": no matches for kind "DestinationRule" in version "networking.istio.io/v1alpha3"
```

```
> kubectl label namespace default istio-injection=enabled
namespace "default" labeled
```

Running, Completed になるまで待つ

```
> kubectl get pods --namespace istio-system
NAME READY STATUS RESTARTS AGE
istio-citadel-746c765786-6g9vw 1/1 Running 0 1m
istio-cleanup-secrets-t8twg 0/1 Completed 0 1m
istio-egressgateway-7b46794587-jzccr 1/1 Running 0 1m
istio-galley-75c6976d79-hl5j9 0/1 ContainerCreating 0 1m
istio-ingressgateway-57f76dc4db-sgktx 1/1 Running 0 1m
istio-pilot-6495978c49-jstwr 2/2 Running 0 1m
istio-policy-6677c87b9f-7t8pb 2/2 Running 0 1m
istio-sidecar-injector-879fd9dfc-24p9j 0/1 ContainerCreating 0 1m
istio-statsd-prom-bridge-549d687fd9-dd4zf 1/1 Running 0 1m
istio-telemetry-7d46d668db-dz2d7 2/2 Running 0 1m
> kubectl get pods --namespace istio-system
NAME READY STATUS RESTARTS AGE
istio-citadel-746c765786-6g9vw 1/1 Running 0 2m
istio-cleanup-secrets-t8twg 0/1 Completed 0 2m
istio-egressgateway-7b46794587-jzccr 1/1 Running 0 2m
istio-galley-75c6976d79-hl5j9 1/1 Running 0 2m
istio-ingressgateway-57f76dc4db-sgktx 1/1 Running 0 2m
istio-pilot-6495978c49-jstwr 2/2 Running 0 2m
istio-policy-6677c87b9f-7t8pb 2/2 Running 0 2m
istio-sidecar-injector-879fd9dfc-24p9j 1/1 Running 0 2m
istio-statsd-prom-bridge-549d687fd9-dd4zf 1/1 Running 0 2m
istio-telemetry-7d46d668db-dz2d7 2/2 Running 0 2m
```

Installing Knative components

ネイティブサービングコンポーネントとビルドコンポーネントのインストール

```
> kubectl apply --filename https://github.com/knative/serving/releases/download/v0.2.2/release.yaml
namespace "knative-build" created
clusterrole.rbac.authorization.k8s.io "knative-build-admin" created
serviceaccount "build-controller" created
clusterrolebinding.rbac.authorization.k8s.io "build-controller-admin" created
customresourcedefinition.apiextensions.k8s.io "builds.build.knative.dev" created
:
clusterrolebinding.rbac.authorization.k8s.io "prometheus-system" created
service "prometheus-system-np" created
statefulset.apps "prometheus-system" created
service "zipkin" created
deployment.apps "zipkin" created
```

kubectl get pods とここで、反応しなくなった。

```
> kubectl get pods --namespace knative-serving
```

rancherがこうなった。

f:id:tjtjtjofthedead:20181220200527p:plain

やっぱりテキトーはよくないか

3ノード(cpu:2core mem:4gb) でもダメ。やっぱりテキトーはよくないか

jjug_ccc fall メモに行ってきたメモ

ドメイン駆動設計とSpring Bootを活用したアプリケーション開発


■ モジュールグラフが作られる様子を学ぼう

モジュールシステムの分かり易い解説

  • モジュールの解決
  • モジュールグラフ
  • 対象のクラスが存在するモジュールを直接 requires している
  • 対象のクラスが存在するパッケージが exports されている
  • ルートモジュールから↑をたどってできるのがモジュールグラフ


■ LINE で広告プラットフォームを Java + Golang で立ち上げた話

  • Tokuhiro Matsunoさん
  • #ccc_a2b
  • 多拠点、多国籍に点在するチーム間の開発
  • 国や地域でトレンドが異なる
  • チームによって取り組みたいテクノロジ、得意なテクノロジがが異なる

- java 書きたくないでござる

  • 一般的なテクノロジを選択しないと属人化
  • チームでサービス分離
  • サービス間連携

- apache kafka
- apache avro


■ 思考停止しないアーキテクチャ設計

アーキテクチャ設計は慣れや勘でなく要件からの分析に基づこう。トレードオフも考慮。

https://kigyo-quest.netlify.com/


■ 複雑なドメインに泥臭く立ち向かう

  • 一本道をみつける
  • やり直しできるようにする


Java を活用したマイクロサービスのための Kubernetes 活用

https://www.slideshare.net/tyoshio2002/japan-container-day-2018


■ コードをどまんなかに据えた設計アプローチ

  • 設計の話かなと思ったらドキュメントの話だった
  • ドキュメントの話かと思ったらいかにドキュメントを書かずコードだけ書くかという話だった
  • いかにコードだけ書くかって話かと思ったらコード込められた意図を抽出するビューワーの話だった
  • コードに意図を込めよう
  • ドキュメントにはどうしたいかがある
  • コードにはどう動くかがある
  • コードに意図を込める
  • java なんだから意図を込めた型にしよう
  • String str が現れた
  • String とかそのまんま使うな
  • orderid, stockid こういうの別の型にする


■ 「マイクロソフト牛尾さん渡米直前記念」  外資系企業で働くエンジニアの生産性向上物語

  • 12/26 に渡米
  • 牛尾さんの経歴
  • 寺田さんの経歴
  • 辛かったら止めたらええねんw
  • 外資系は楽、外資系はスピード早い

- 上司にお伺い立てない
- 上司が技術を知っている

  • 渡米の目的は修行
  • 師匠のレビューの話
  • 他人に説明するようにアウトプットする
  • アウトプットを積み重ねる
  • hello world から
  • 他人の評価を気にしないでやっている
  • 英語学習メソッド
  • 英語と日本語の情報量の差が圧倒的
  • ITエンジニアやるなら英語もやろう!やるべき!やってください!
  • この辺の話もあった

- かずき師匠にクソコードをレビューしてもらった学び
https://qiita.com/TsuyoshiUshio@github/items/dde4950ad3d2cb3e5922
- しばやんの研究 (Study of Shibayan)
https://qiita.com/TsuyoshiUshio@github/items/a347fb61e5ee6756792b


■ まとめ
JJUG CCC Fall 2018 資料まとめ
https://qiita.com/ryuichi1208/items/1ed16c162c0205d1514e

slides-articles-2018Fall
https://github.com/jjug-ccc/slides-articles-2018Fall


■ おわり
2018-12-15 は phpconf とか被っていてどこに行くか悩んだ。学びや気づきがあり jjug で良かった。が、phpconf に行ったら行ったで良かった良かった言うのだろう

PHP-FIGのHTTP処理標準の設計はなぜPSR-7/15/17になったのか
https://speakerdeck.com/tanakahisateru/17ninatutafalseka

PHPカンファレンス2018 講演資料まとめ
https://qiita.com/basaltan9999/items/79f87a1a8d53c06a056b

素のPHPでさくらのオブジェクトストレージをlistobject

前回AWS-SDKを使ったが、素のPHPだとどうなるか試した。

やったこと

  • Fiddlerでリクエストを確認
  • AWS 署名V2を調べた
  • 素のPHPでListObject

Fiddlerでリクエストを確認

FiddlerでCloudBerryのリクエストをとった。

GET /<<バケット>>?prefix=&max-keys=1000&delimiter=%2F HTTP/1.1
User-Agent: CloudBerryLab.Base.HttpUtil.Client 4.3.0 (
http://www.cloudberrylab.com/)
x-amz-date: Fri, 20 Nov 2015 12:21:06 GMT
Authorization: AWS <<アクセスキー>>:xxxxxxxxxxxxxxxxxxxxxxxxxxx=
Host: b.sakurastorage.jp
Connection: Keep-Alive

アクセスキーの右ブロックは

  • 同じリクエストでも毎回変わることから時間が関係してるっぽい
  • 最後が「=(イコール)」で終わるのでBASE64っぽい

ってことが分かった。

AWS 署名V2を調べた

アクセスキーの右ブロックの文字列は「AWS 署名バージョン 2」と呼ぶようだ。 さくらのオブジェクトストレージは、AWSSDKv2は成功するがv3は失敗するので、 v2をつかうといいようだ。

V2署名文字列生成は↓が分かり易かったです。

付録 B: リクエストの認証(AWS 署名バージョン 2) https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/auth-request-sig-v2.html

PHPAmazon S3REST API を使用 #1 http://www.applelife100.com/2012/06/23/using-rest-api-of-amazon-s3-in-php-1/

素のPHPでListObject

こんな感じになりました。

<?php
$config = [
  'bucket' => '<<バケット>>',
  'accessKey' => '<<アクセスキー>>',
  'secretAccessKey' => '<<シークレットアクセスキー>>',
  'endpoint' => 'b.sakurastorage.jp',
];
$resource = "/{$config['bucket']}";

$req = makeRequest($config, $resource);
$res = file_get_contents($req['url'], false, $req['context']);
echo $res;

function makeRequest($config, $resource)
{
  $datetime = new DateTime('now', new DateTimeZone('UTC'));
  $date = $datetime->format(DateTime::RFC1123);
  $signature = v2signature($config, "GET", '', '', $datetime, '',
$resource);
  return [
    'context' => stream_context_create([
      "http" => [
        'method' => 'GET',
        'header' => implode("\r\n", [
          "Authorization: AWS {$config['accessKey']}:{$signature}",
          "Date: {$date}",
        ]),
      ],
    ]),
    'url' => "https://{$config['endpoint']}{$resource}",
  ];
}

function v2signature($config, $httpVerb, $contentMd5, $contentType,
$datetime, $canonicalizedAmzHeaders, $resource)
{
  $stringToSign =
    $httpVerb ."\n"
    . $contentMd5 ."\n"
    . $contentType ."\n"
    . $datetime->format(DateTime::RFC1123) ."\n"
    . $canonicalizedAmzHeaders
    . $resource;
  return base64_encode(hash_hmac('sha1', $stringToSign,
$config['secretAccessKey'], true));
}

参考

www.applelife100.com

docs.aws.amazon.com

さくらのオブジェクトストレージをAWS SDK for PHP 2で

PHPからさくらのオブジェクトストレージを利用したくなり、AWS SDKを使えるか試したときのメモ。 AWS SDK for PHP v2 を使った。

list objects

composer.json

{
    "require": {
        "aws/aws-sdk-php": "2.*"
    }
}

list_objects.php

<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;

$client = S3Client::factory([
    'key'    => '<<アクセスキー>>',
    'secret' => '<<シークレットキー>>',
    'base_url'=> 'https://b.sakurastorage.jp/', //コンパネに表示されるURLからバケット名を除いたもの
]);

$iterator = $client->getIterator('ListObjects', [
    'Bucket' => '<<バケット名>>',
]);

foreach ($iterator as $object) {
    echo $object['Key'] . "\n";
}

put object

put_object.php

<?php
require 'vendor/autoload.php';
use Aws\S3\S3Client;

$client = S3Client::factory([
    'key'    => '<<アクセスキー>>',
    'secret' => '<<シークレットキー>>',
    'base_url'=> 'https://b.sakurastorage.jp/', //コンパネに表示されるURLからバケット名を除いたもの
]);

$iterator = $client->getIterator('ListObjects', [
    'Bucket' => '<<バケット名>>',
]);

foreach ($iterator as $object) {
    echo $object['Key'] . "\n";
}
</pre>

get object

get_object.php

<?php
require 'vendor/autoload.php';

use Aws\S3\S3Client;

$client = S3Client::factory([
    'key'    => '<<アクセスキー>>',
    'secret' => '<<シークレットキー>>',
    'base_url'=> 'https://b.sakurastorage.jp/', //コンパネに表示されるURLからバケット名を除いたもの
]);

$result = $client->getObject([
    'Bucket' => '<<バケット名>>',
    'Key'    => 'data.txt'
]);

echo get_class($result['Body']) . "\n";
echo $result['Body'] . "\n";

delete object

delete_object.php

<?php
require 'vendor/autoload.php';

use Aws\S3\S3Client;

$client = S3Client::factory([
    'key'    => '<<アクセスキー>>',
    'secret' => '<<シークレットキー>>',
    'base_url'=> 'https://b.sakurastorage.jp/', //コンパネに表示されるURLからバケット名を除いたもの
]);

$result = $client->deleteObject([
    'Bucket' => '<<バケット名>>',
    'Key'    => 'data.txt',
]);

var_dump($result);

参考

http://aws.amazon.com/jp/developers/getting-started/php/ http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.S3.S3Client.html http://cloud-news.sakura.ad.jp/wp-content/uploads/2015/01/ObjectStorage_API.pdf

Beckyのフォルダ名変更はどうなんだろう

Beckyでアクティブフォルダをクリックすると、フォルダ名変更になる。
気付かずスペース(未読メール読み)をタイプすると、フォルダ名を喪失してしまい、アンインストールを考える。

ちげーよ変更したいんじゃない、選択中のフォルダを再クリックしただけなんだ。

イライラしつつ、ふと思った。これ AutoHotkey でキャンセルできないか。

;; ### Becky ###
;; マウス左クリックによるフォルダ名変更をキャンセルする - とりあえずver
#IfWinActive, ahk_class Becky2MainFrame
~LButton::
  Sleep 700
  MouseGetPos, ,,, contrl
  IfEqual, contrl, Edit1
    Send, {Esc}
  return
#IfWinActive

これで改善するか様子を見ます。

しかし、いまどきツリー上でのフォルダ名変更はF2じゃないのか。
左クリックでフォルダ名変更は軽々しくないか。