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/
準備
- vurtualbox
- kubectl https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-with-chocolatey-on-windows choco install kubernetes-cli
- minikube choco install minikube
- docker for windows
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 で virtualbox の vm:minikube が停止する
> minikube stop Stopping local Kubernetes cluster... Machine stopped.
minikube delete で virtualbox のお掃除。virtualbox の vm を直接削除した時もこれやれば大丈夫。
> 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
こうなった
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)で。
Knative Install on a Kubernetes Cluster
https://github.com/knative/docs/blob/master/install/Knative-with-any-k8s.md
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がこうなった。
やっぱりテキトーはよくないか
3ノード(cpu:2core mem:4gb) でもダメ。やっぱりテキトーはよくないか
jjug_ccc fall メモに行ってきたメモ
■ ドメイン駆動設計とSpring Bootを活用したアプリケーション開発
- zhanponさん
- https://speakerdeck.com/zhanpon/ddd-and-spring-boot
- #ccc_l1b
■ モジュールグラフが作られる様子を学ぼう
- opengl-8080さん
- https://qiita.com/opengl-8080/items/bcac846ba604a86fc4d4
- #ccc_a2a
モジュールシステムの分かり易い解説
- モジュールの解決
- モジュールグラフ
- 対象のクラスが存在するモジュールを直接 requires している
- 対象のクラスが存在するパッケージが exports されている
- ルートモジュールから↑をたどってできるのがモジュールグラフ
■ LINE で広告プラットフォームを Java + Golang で立ち上げた話
- Tokuhiro Matsunoさん
- #ccc_a2b
- java 書きたくないでござる
- 一般的なテクノロジを選択しないと属人化
- チームでサービス分離
- サービス間連携
■ 思考停止しないアーキテクチャ設計
- 川島義隆さん
- https://www.slideshare.net/kawasima/jjug-ccc-2018-fall
- #ccc_e3
アーキテクチャ設計は慣れや勘でなく要件からの分析に基づこう。トレードオフも考慮。
- 起業クエストw
https://kigyo-quest.netlify.com/
■ 複雑なドメインに泥臭く立ち向かう
- 株式会社エスエムエス @su_kun_1899 さん
- ccc_e4
- https://speakerdeck.com/sukun1899/fu-za-nadomeinnini-chou-kuli-tixiang-kau
- 一本道をみつける
- やり直しできるようにする
■ Java を活用したマイクロサービスのための Kubernetes 活用
- 日本マイクロソフト株式会社 寺田さん
- #ccc_e5
- Japan Container Day 2018
https://www.slideshare.net/tyoshio2002/japan-container-day-2018
- Kubernetes でやりすぎ注意って話
- azure だと簡単ですよって話し
- https://yoshio3.com/
- https://github.com/yoshioterada
■ コードをどまんなかに据えた設計アプローチ
- 設計の話かなと思ったらドキュメントの話だった
- ドキュメントの話かと思ったらいかにドキュメントを書かずコードだけ書くかという話だった
- いかにコードだけ書くかって話かと思ったらコード込められた意図を抽出するビューワーの話だった
- コードに意図を込めよう
- ドキュメントにはどうしたいかがある
- コードにはどう動くかがある
- コードに意図を込める
- java なんだから意図を込めた型にしよう
- String str が現れた
- String とかそのまんま使うな
- orderid, stockid こういうの別の型にする
■ 「マイクロソフト牛尾さん渡米直前記念」 外資系企業で働くエンジニアの生産性向上物語
- 日本マイクロソフト株式会社 寺田さん 牛尾さん
- #ccc_g7
- 上司にお伺い立てない
- 上司が技術を知っている
- 渡米の目的は修行
- 師匠のレビューの話
- 他人に説明するようにアウトプットする
- アウトプットを積み重ねる
- 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でリクエストを確認
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
PHP で Amazon S3 の REST 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)); }
参考
さくらのオブジェクトストレージを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じゃないのか。
左クリックでフォルダ名変更は軽々しくないか。