Kubernetes Tips コマンド編

![kuberneteslogo.eabc6359f48c8e30b7a138c18177f3fd39338e05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/730f8e7a-68e3-5e0c-1138-396ee74076ee.png)

## GitHub

■ [moby/moby](https://github.com/moby/moby)
■ [kubernetes/kubernetes](https://github.com/kubernetes/kubernetes)

## 概要

Kubernetesについて学んだTips的な記事です。
2つに分けて書く予定で1本目となります。

1. Kubernetes Tips コマンド編
2. Kubernetes Tips yaml編

## 特徴

* Immutable Infrastructure
* 宣言的設定 (⇔ Imperative)
* Auto Healing

[参考] [Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー](https://www.slideshare.net/ToruMakabe/kubernetes-120907020)

## インストール手順

<details><summary>2019/07現在の手順です(CentOS7を対象)</summary>
<div>

#### Master / Worker 共通

``` bash
# hostsファイルの編集
$ vi /etc/hosts

# swap無効化
$ vi /etc/fstab
#UUID=07fc8b7b-40bc-4adb-b7fd-4c6c9973c021 /boot                   xfs     defaults        0 0
$ swapoff -a

$ echo net.bridge.bridge-nf-call-iptables = 1 > /etc/sysctl.d/99-bridge-nf-call-iptables

# SELinux OFF
$ setenforce 0
$ sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# ファイアウォール停止/無効化
$ systemctl stop firewalld && systemctl disable firewalld

# dockerに必要なツールインストール
$ systemctl stop firewalld && systemctl disable firewalld

# dockerインストール
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum install -y docker-ce
$ systemctl enable docker && sudo systemctl start docker

# kubernetesインストール前準備
$ sudo sh -c "cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
"

$ sudo sysctl --system
$ sudo sh -c "cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
"

# kubernetesインストール前準備
$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
$ systemctl enable --now kubelet
```

#### Master

``` bash
# 初期化処理
$ kubeadm init --apiserver-advertise-address '192.168.1.210' --service-cidr '10.0.0.0/24' --pod-network-cidr '172.16.0.0/24'
# --kubernetes-version : kubeadmのバージョン指定
# --apiserver-advertise-address : MasterのIPアドレス
# --service-cidr : VIP用を払い出す為にキープされるセグメント

# 初期化処理後の実行
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
``` 
#### Worker

``` bash

```

</div></details>

## コマンド

#### 設定関連

##### config

contextはクラスタの情報、ユーザ、ネームスペースを組み合わせたものです。
この組み合わせで、どのKubernetesクラスタに接続するかが決まります

``` bash
# 現在のコンテキスト
$ kubectl config current-context

# コンテキストの一覧
$ kubectl config get-contexts

# コンテキストの切り替え
$ kubectl config use-context [context]

# コンテキストの削除
kubectl config delete-cluster [context]
```

#### 基本コマンド

|用語|概要|
----|----
Pod|1つ以上のコンテナと共有されたボリュームで構成
ReplicaSet|Podのレプリカ数を管理
Deployment|ReplicaSetを生成。デプロイの管理
Service|Podeへの接続を解決してくれる抽象的なオブジェクト

##### 情報取得

``` bash
$ kubectl get all
# Deployment
# ReplicaSet
# Pod
# Service
# 上記4つをそれぞれ取得できる
```

##### Pod

``` bash
# podを作成
$ kubectl create -f [pod.yml]

# pod一覧表示
$ kubectl get pod
## -o wide 詳細表示
## -A 全namespaceの結果を取得
## --show-labels ラベルも表示

# podを削除
$ kubectrl delete pod [Pod名]
$ kubectl delete -f [作成時のPod定義ファイル]<Paste>

# Podを強制削除
$ kubectl get pod -grace-period 0 -force

# podの起動
$ kubectl run testnginx --image nginx
## --image= イメージを指定
## --replicas= 起動するPod数を指定
## --env= 環境変数を渡す
## --labels= ラベルをつけて起動
## --namespace= namespaceを指定して起動

# Podでコマンドを実行する
$ kubectl exec [Pod名] -it /bin/bash

# Podの詳細情報を取得
$ kubectl describe pod [Pod名]
```

##### NameSpace

デフォルトで作成されるNamespaceは下記

* default Namespaceを持たないオブジェクトのデフォルト
* kube-system Kubernetesによって作成されたオブジェクのためのNamespace
* kube-public 全ユーザが読み込めるNamespace

``` bash
# NameSpace作成
$ kubectl create namespace [namespace]

# NameSpace確認
$ kubectl get namespace

# NameSpace削除
$ kubectl delete namespace [namespace]
$ kubectl delete -f namespace.yml

## createのサブコマンド
### clusterrole
### clusterrolebinding
### configmap
### deployment
### job
### namespace
### poddisruptionbudget
### priorityclass
### quota
### role
### rolebinding
### secret
### service
### serviceaccount
```

##### ReplicaSet

Pod のレプリカ(複製)数を維持するための機能

``` bash
# ReplicaSetを作成
$ kubectl create -f [rc.yml]

# rc一覧表示
$ kubectl get replicasets
```

##### Service

``` bash
# サービスの作成
$ kubectl expose deployment [Pod名]
## --port 
## --type
### サービスの種類
###   clusterIP : Kubernetes クラスタ内からのみアクセス可能なVIPを割り振る
###   nodePort : NodeのグローバルIP:Portで受付を行い、トラフィックを転送
###   loadBalancer : 
###   externalName : 外部のサービスに対してのエイリアスを作成
```

## Jenkinsで遊ぶ

``` yaml:jenkins_pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: jenkins-pod
  labels:
    app: jenkins
spec:
  containers:
  - name: jenkins
    image: jenkins:latest
    ports:
    - containerPort: 8080
```

``` yaml:jenkins_service.yml
apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  type: NodePort
  selector:
    app: jenkins
  ports:
  - name: http
    port: 8080
```

``` bash
# Podを作成
$ kubectl apply -f jenkins_pod.yml
$ kubectl get pods -o wide | grep jenkins
jenkins-pod                           1/1       Running   0          6m        10.1.0.22   docker-for-desktop

# Serviceを作成
$ kubectl apply -f jenkins_service.yml
$ kubectl get svc -o wide | grep jenkins
jenkins      NodePort    10.100.58.177    <none>        8080:31854/TCP   7m        app=jenkins

# Jenkinsのログイン情報を取得
$ kubectl exec -it jenkins-pod /bin/bash
$ jenkins@jenkins-pod:/$ cat /var/jenkins_home/secrets/initialAdminPassword
XXXXXXXXXXXXXXXXXX
```

![スクリーンショット 2019-07-26 10.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/7d8ae8a3-1389-0d8f-90a5-26225c2f9b79.png)


## 参考記事

■ [[k8s] Pod < ReplicaSet < Deployment](https://qiita.com/sky0621/items/beb12145f1b674fe7904)
■ [実践 Kubernetes　～コンテナ管理のスタンダードツールを使いこなす](https://www.imagazine.co.jp/%E5%AE%9F%E8%B7%B5-kubernetes%E3%80%80%E3%80%80%EF%BD%9E%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E7%AE%A1%E7%90%86%E3%81%AE%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%80%E3%83%BC%E3%83%89%E3%83%84%E3%83%BC%E3%83%AB/)
■ [Dockerfileを書くためのベストプラクティス【参考訳】v18.09](https://qiita.com/zembutsu/items/a96b68277d699f79418d)

## 参考スライド

■ [Docker Compose利用者から見た Kubernetes 開発環境構築入門](https://speakerdeck.com/kkoudev/introduction-to-kubernetes-for-docker-compose-user)
■ [そのコンテナ、もっと「賢く」置けますよ？](https://speakerdeck.com/ytaka23/cloudnative-days-tokyo-2019)
■ [Dockerfileを改善するためのBest Practice 2019年版](https://www.slideshare.net/zembutsu/dockerfile-bestpractices-19-and-advice)

## 参考書籍

■ [Docker/Kubernetes 実践コンテナ開発入門](https://gihyo.jp/book/2018/978-4-297-10033-9)
■ [入門 Kubernetes](https://www.oreilly.co.jp/books/9784873118406/)
■ [Kubernetes完全ガイド](https://book.impress.co.jp/books/1118101055)
■ [Kubernetes実践ガイド クラウドネイティブアプリケーションを支える技術](https://book.impress.co.jp/books/1118101053)