Kubernetesとは

k8sはコンテナのオーケストレーションツール
複数の物理マシンに複数のコンテナがあることが前提
1台1台の物理マシンの中に複数のコンテナがある
定義ファイル(マニュフェストファイル)を作成すれば、コンテナを作成管理してくる
 L etcd(データベース)に書き込まれる
docker-composeは作って終わりだが、k8sはその状態を維持する。監視も行う

### マスターノードとワーカーノード
クラスターは定義ファイルに基づいて自立して動く
k8sは仮想ネットワークドライバであるCNIをインストールする必要がある
マスターノードではコントロールプレーンでワーカーノードを管理

### 用語
Pod: コンテナとボリュームがセットになったもの
Service: Podをまとめて管理する
ReplicaSet: Podの数を管理

### 定義ファイル

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

apa000dep.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apa000dep
spec:
  selector:
    matchLabels:
      app: apa000kube
  replicas: 3
  template:
    metadata:
      labels:
        app: apa000kube
    spec:
      containers:
      - name: apa000ex91
        image: httpd
        ports:
        - containerPort: 80

service

apiVersion: v1
kind: Service
metadata:
  name: apa000ser
spec:
  type: NodePort
  ports:
  - port: 8099
    targetPort: 80
    protocol: TCP
    nodePort: 30080
  selector:
    app: apa000kube

### kubernetsコマンド
$ kubectl ${command} ${option}
create, edit, delete, get, set, apply, describe, diff, expose, scale, autoscale, rollout, exec, run, attach, cp, logs, cluster-info, top

$ kubectl apply -f *.yml
$ kubectl get pods
$ kubectl apply -f *.yml
$ kubectl get services

OK、さー仕事するぞー

[Docker] docker-compose基礎

コンテナ、ネットワーク、ボリュームなどのコマンドをまとめて定義ファイルを書く 、イメージはdockerfile
docker-compose up: 定義ファイルに書かれた内容に従ってイメージをダウンロードしたり、コンテナを作成起動したりする
docker-compose down: コンテナとネットワークを停止・削除、停止のみの場合はstopコマンド

version: "3"

services:
  apa000ex2:
    image: httpd
    ports:
      - 8080:80
    restart: always
version: "3"

services:
  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST=mysql000ex11
      WORDPRESS_DB_NAME=wordpress000db
      WORDPRESS_DB_USER=wordpress000kun
      WORDPRESS_DB_PASSWORD=wkunpass

services, networks, volumesについて定義する
servicesはコンテナのこと
restartはコンテナが停止した時の再試行ポリシー、no, always, on-failure, unless-stoppedがある
depend_onは作る順番、連動して作成したか

version: "3"

services:
  mysql000ex11:
    image: mysql:5.7
    networks:
      - wordpress000net1
    volumes:
      - mysql000vol11:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass
  wordpress000e12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    volumes:
      - wordpress000vol12:/var/www/html
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql000ex11
      WORDPRESS_DB_NAME: mysql000db
      WORDPRESS_DB_USER: mysql000kun
      WORDPRESS_DB_PASSWORD: wkunpass
networks:
  wordpress000net1:
volumes:
  mysql000vol11:
  wordpress000vol12:

ふむふむ やりながら慣れるしかないな

[Docker] Redmineのコンテナを作成してみよう

### 作成手順
ネットワークを作る -> MySQLコンテナを作る -> Redmineコンテナを作る -> 確認 -> 後始末
※WordPressとほぼ同じ構成だがオプションの名前が異なる

$ sudo docker network create redmine000net2
$ sudo docker run –name mysql000ex13 -dit –net=redmine000net2 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=redmine000db -e MYSQL_USER=redmine000kun -e MYSQL_PASSWORD=rkunpass mysql –character-set-server=utf8mb4 –collation-server=utf8mb4_unicode_ci –default-authentication-plugin=mysql_native_password
$ sudo docker run -dit –name redmine000ex14 –network redmine000net2 -p 8086:3000 -e REDMINE_DB_MYSQL=mysql000ex13 -e REDMINE_DB_DATABASE=redmine000db -e REDMINE_DB_USERNAME=redmine000kun -e REDMINE_DB_PASSWORD=rkunpass redmine

うおおおおおお
何これ?

[docker] 複数コンテナを動かしてみる

wordpress: wordpress, apache, php, mysql

$ sudo docker network create wordpress000net1
$ sudo docker run –name mysql000x11 -dit –net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql –character-set-server=utf8mb4 –collation-server=utf8mb4_unicode_ci –default-authentication-plugin=mysql_native_password
$ sudo docker run –name mysql000x12 -dit –net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress

うむ、Wordpressは少し慣れた感がある

[Docker基礎] 基本コマンド

$ sudo docker run –name apa000ex1 -d httpd
$ sudo docker ps
$ sudo docker stop apa000ex1
$ sudo docker rm apa000ex1

### apache
apacheは80ポートで待ち構えている
$ sudo docker run –name apa000ex2 -d -p 8080:80 httpd
$ sudo docker stop apa000ex2
$ sudo docker rm apa000ex2

うーん、apacheは少し慣れてきた。

AWS S3のデータ保護

### S3バケットのデータ保護
S3はデータセンターのディスクに書き込むときにデータをオブジェクトレベルで暗号化し、ユーザーがデータにアクセスするときに復号する。

### 暗号化の種類
### SSE-S3
S3が管理するキーによるサーバ側の暗号化
SSE-S3を使用すると、オブジェクトは一意のキーで暗号化される
AES-256を使用して暗号化する

### SSE-KMS
AWS KMSに保存されているカスタマーキー(CMK)によるサーバー側の暗号化

### SSE-C
ユーザが指定したキーによるサーバ側の暗号化(SSE-C)

### クライアント側の暗号化
S3に送る前にデータを暗号化
AWS Encryption SDKを使用すると暗号化を容易に実装可能

なるほど、少しずつ理解してきた

lambda入門

トリガーイベント: S3へのファイル投入 ※management console上で操作する

def lambda_handler(event, context):
    print("Lambdaが呼ばれました!")
    input_bucket = event['Records'][0]['s3']['bucket']['name']
    input_key = event['Records'][0]['s3']['object']['key']
    print("bucket =", input_bucket)
    print("key =", input_key)

testして、Deploy, cloudwatch logsで挙動を確認

import boto3

s3 = boto3.client('s3')

def read_file(bucket_name, file):
    response = s3.get_object(Bucket=bucket_name, Key=file_key)
    return response[u'Body'].read().decode('utf-8')

def upload_file(bucket_name, file_key, bytes):
    out_s3 = boto3.resource('s3')
    s3Obj = out_s3.Object(bucket_name, file_key)
    res = s3Obj.put(Body = bytes)
    return res

def lambda_handler(event, context):
    print("Lambdaが呼ばれました!")
    input_bucket = event['Records'][0]['s3']['bucket']['name']
    input_key = event['Records'][0]['s3']['object']['key']
    print("bucket =", input_bucket)
    print("key =", input_key)

text = read_file(input_bucket, input_key)
output_key = "outputs/" + input_key
upload_file(input_bucket, output_key, bytes(text, 'UTF-8'))

なるほど、lamdbaの基本機能はなんとなく理解した

Terraformを使ってみる

dockerを立てる

terraform {
	required_providers {
		docker = {
			source = "kreuzwerker/docker"
			version = "~> 2.15.0"
		}
	}
}

provider "docker" {}

resource "docker_image" "nginx" {
	name = "nginx:lastest"
	keep_locally = false
}

resource "docker_container" "nginx" {
	image = docker_image.nginx.latest
	name = "tutorial"
	ports {
		internal = 80
		external = 8080
	}
}
terraform {
	required_providers {
		aws = {
			source = "hashicorp/aws"
			version = "~> 3.0"
		}
	}
}

provider "aws" {
	profile = "default"
	region = "ap-northeast-1"
}

resource "aws_instance" "app_server" {
	ami = "ami-0e60b6d05dc38ff11"
	instance_type = "t2.micro"
	tags = {
		"Name" = "ec2-1115"
	}
}

なるほどー lambdaを勉強しないと駄目だなー