コピペコードで快適生活

明日使えるソースを自分のために

GithubActionsの設定

忘れる自信があるので、ymlの書き方をメモしておく。

# ファイルパス: .github/workflows/xxx.yml

name: CI
on:
  push:
    branches:
      master    # masterブランチへのpush,merge時に発火
  pull_request: # PR作成,更新時に発火

jobs:
  test:                   # 実行するJOBの識別子
    name: Test            # JOBの名前
    runs-on: self-hosted  # 指定の環境で実行する
    container: ruby:3.0.0 # JOBを動かすコンテナ
    env:
      RAILS_ENV: test
      MYSQL_HOST: mysql
    services: # メインコンテナとは別でコンテナを立ち上げる場合
      mysql:
        image: mysql:5.7.33
        env:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
    steps:                        # ここで実行する処理やコマンドを指定する
      - uses: actions/checkout@v2 # リポジトリからのチェックアウトを行う「actions/checkout」アクションを実行する
        with:
          token: ${{ secrets.XXX_TOKEN }}
          submodules: true
      - name: Build               # ステップの1つ run の中で実際に実行するコマンドを指定する
        run: |
          bundle install --quiet --path vendor/bundle --without production
          bundle exec rake db:migrate
      - name: Rubocop
        run: |
          bundle exec rubocop -D
      - name: Rspec
        run: |
          bundle exec rspec spec
  deploy:
    name: Deploy
    runs-on: self-hosted
    container: ruby:3.0.0
    needs: [test]                         # 「test」のJOBが成功した場合のみ実行
    if: github.ref == 'refs/heads/master' # 指定ブランチの更新時のみ発火
    steps:
      - uses: actions/checkout@v2
        with:
          token: ${{ secrets.XXX_TOKEN }}
      - name: Deploy
        env:
          GITHUB_PERSONAL_ACCESS_TOKEN: ${{ secrets.XXX_TOKEN }}
        run: |
          mkdir ~/.ssh
          echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_rsa
          chmod 400 ~/.ssh/id_rsa
          eval `ssh-agent`
          ssh-add ~/.ssh/id_rsa
          bundle install --quiet --path vendor/bundle
          bundle exec cap production deploy

chefでencrypted data bagsを使うメモ

作る

.chef/knife.rbに追加 knife[:editor] = "/usr/bin/vim"

bundle exec knife data bag create users app_user --secret-file .chef/secret_data_bag_key --local
# で editorが開くので編集して保存する。
# で、自動で暗号化されたjsonファイルが生成される。

usersがdata_bags配下にできるディレクトリ。
app_userがその下にできるjsonファイル。

編集する

bundle exec knife data bag edit users app_user --secret-file .chef/secret_data_bag_key --local

見る

bundle exec knife data bag show users app_user --secret-file .chef/secret_data_bag_key --local

参考

https://cross-black777.hatenablog.com/entry/2016/04/27/090000

Kubernetes覚え書き

Kubernetes チュートリアル で雰囲気を掴むメモ。

概念

  • kubernetesCluster
    • 構成
      • Master
      • Node
        • ワーカーマシン(物理サーバorVM)
        • マスターが公開しているKubernetes APIを使用してマスターと通信
        • 内部でコンテナを動かすためのコンテナランタイムを持つ
    • 抽象概念
      • Deployment
        • アプリケーションのインスタンスを作成し、更新する方法を指示する。
        • Deploymentコントローラーは、それらのインスタンスを継続的に監視。
      • Pod
        • 1つ以上のアプリケーションコンテナのグループとそれらのコンテナの共有リソース
        • ノードに障害が発生した場合、同じPodがクラスター内の他の使用可能なノードにスケジュールされます。
      • Kubernetes Service
        • Podの論理セットを定義し、それらのPodに対する外部トラフィックの公開、負荷分散、およびサービス検出を可能にする抽象化層。
      • レプリカ
        • 1つのDeploymentから作られる同じ機能を持つ複数のPod
  • Minikube

minikubeのインストールと起動&停止

# https://kubernetes.io/ja/docs/tasks/tools/install-minikube/
# 事前インストール
# - kubectl (k8sのcli)
# - VirtualBox (ハイパーバイザー)

# インストール
brew install minikube

# 起動
minikube start --driver=virtualbox

# 状態確認
minikube status

# 停止
minikube stop

kubectlコマンド

# バージョン確認
kubectl version

# ノード確認
kubectl get nodes

# deploymentの作成
# kubectl create deployment [名前] --image=[コンテナイメージ]
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

# deploymentの確認
kubectl get deployments

#
curl http://localhost:8001/version
kubectl proxy

PODの走査

# podsの一覧を表示
kubectl get pods

# podsの詳細情報を表示
kubectl describe pods

# podnameの取得
export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME

# 単一Pod上の単一コンテナ内のログを表示
kubectl logs $POD_NAME

# 単一Pod上の単一コンテナ内でコマンドを実行
kubectl exec $POD_NAME env
kubectl exec -ti $POD_NAME bash

Serviceの走査

# サービスの作成 (expose=晒す)
# typeにはClusterIP(Default), NodePort, LoadBalancer, ExternalNameが指定できる
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

# サービス一覧の確認
kubectl get services

# サービスの詳細表示
kubectl describe services/kubernetes-bootcamp

Scaling

# Deploymentsの確認
kubectl get deployments

# デプロイされた現在のReplicaSetの情報
kubectl get rs

# Deployments名を指定してレプリカを4に増やす
kubectl scale deployments/kubernetes-bootcamp --replicas=4

# Podが増えていることを確認できる
kubectl get pods -o wide

kubectl describe deployments/kubernetes-bootcamp

# nodeのポート番号取得
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
echo NODE_PORT=$NODE_PORT

# curlで接続確認
curl $(minikube ip):$NODE_PORT

ローリングアップデート

# 設定確認
kubectl get deployments
kubectl get pods
kubectl describe pods

# deploymentsのコンテナイメージを差し替え
# デプロイされる
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2

# Deploymentの進捗状況を確認
kubectl rollout status deployments/kubernetes-bootcamp

# ロールバック
# Deploymentはバージョン管理されているので、前の状態に戻すことができる。
kubectl rollout undo deployments/kubernetes-bootcamp

DNS関連メモ

リンク集

逆引き

# 逆引きオプション
dig -x 192.0.0.1

# PTRレコード引き
dig 1.0.0.192.in-addr.arpa PTR

## publicDNSから、問い合わせ順ごとに表示する
dig -x 192.0.0.1 @8.8.8.8 +trace

PTRレコード(逆引きレコード)
https://jprs.jp/glossary/index.php?ID=0210

swap領域の作成

やったことなかったので、やり方をメモしておく。
メモリ不足でやばいときの応急処置の1つとして使えるように。

確認

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.6G        2.3G        163M        472M        5.2G        4.5G
Swap:            0B          0B          0B

ファイルの準備

sudo mkdir /var/swap/

# swapfileを作成して2GBを割り当てる。
sudo dd if=/dev/zero of=/var/swap/swapfile bs=1M count=2048

パーミッションの変更

sudo chmod 600 /var/swap/swapfile

swap領域に変換する

# 変換する
sudo mkswap /var/swap/swapfile

# 有効にする
sudo swapon /var/swap/swapfile

確認

# 割当を確認できた
free -h
              total        used        free      shared  buff/cache   available
Mem:           7.6G        2.3G        211M        472M        5.1G        4.5G
Swap:          2.0G          0B        2.0G

swapをやめる

# 無効にする
sudo swapoff -v /var/swap/swapfile

# ファイルを削除する
sudo rm /var/swap/swapfile

参考

https://blog.katsubemakito.net/linux/make-swap https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/storage_administration_guide/swap-removing-file