curlでdeploymentを登録

#curlでdeploymentを登録

curlでデプロイメントを登録します。
(Kubernetes APIを叩くだけの手順になります。)
※ 手順中でyqコマンドを利用します。無くても実行可能ですがあったほうが便利です。

##クラスター情報取得

kubectlコマンドを構成した後、以下のコマンドを実行します。
yqコマンドを利用しない場合は`kubectl config view`のみ実行してください。

```
kubectl config view | yq read - 'clusters[*]'
```

クラスター情報が出力されます。(以下の場合minikubeともう一つmyclusterという名前のクラスタ情報が出力されています)
Deploymentを登録したいクラスターの`certificate-authority:`と`server:`の値を控えます。

```
- cluster:
    certificate-authority: /Users/sota-n/.minikube/ca.crt
    server: https://192.168.99.100:8443
  name: minikube
- cluster:
    certificate-authority: mycluster/ca.pem
    server: https://10.168.94.102:8001
  name: mycluster
```

`certificate-authority:`と`server:`の値をそれぞれ変数`CRTFILE`と`APISERVER`に格納します。(今回はminikubeを利用します)

```
export CRTFILE=/Users/sota-n/.minikube/ca.crt
export APISERVER=https://192.168.99.100:8443
```

認証はService Account(以降SA)で行います。
利用するSAは、極端な権限になりますがkube-systemネームスペースのdefault-token.*を利用します。
(defaultや特定のネームスペースのSAを利用する方法は後半に記述します)

```
#yqコマンドがある場合
TOKEN=$(kubectl get secret -n kube-system default-token-g9p2c -o yaml | yq read - "data.token" | base64 -D)

#yqコマンドが無い場合
kubectl get secret -n kube-system default-token-g9p2c -o yaml | grep "token:"
token: xxx...
#xxx...を変数TOKENに格納します
```


##Deployment用意

Deploymentを用意します。

```deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
```

deploymentのyamlファイルをjsonに変換して変数に格納します。
ここではyqコマンドを利用していますが、他のツールでも構いません。
(yamlのままでも適用可能のようですが、上手くいかず。。)

```
export DEPLOYMENT=$(yq read -j ./deployment.yaml)
```

##curl実行

curlでAPIを実行します。

```
curl -X POST -d ${DEPLOYMENT} \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer ${TOKEN}" \
"${APISERVER}/apis/apps/v1/namespaces/default/deployments" --cacert ${CRTFILE}
```

kubectlコマンドで確認してみます。

```
kubectl get deploy -n default                                                               
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           15s

kubectl get po -n default 
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-54f57cf6bf-f62kf   1/1     Running   0          4s
```




#defaultや特定のネームスペースのSAを利用する

対象ネームスペースにSAがない、もしくは存在するが他のSAを作ってそちらを利用する場合の手順を記します。
(既に対象ネームスペースにSAとそのSAに紐づくrolebindingが存在し、rolebindingに紐づくroleが適切に構成されている場合はこの手順を省略してください)

以下の関係を確認します。

```
+--------------+   
|ServiceAccount|   #リソースに付与するアカウント(備考：トークンはsecretとして保存)
+--------------+
       |
+--------------+
| RoleBindings |   #：SAとroleの紐付け
+--------------+
       |
+--------------+
|     Role     |   #備考：実行可能なルールを規定
+--------------+
```
SA→Role→RoleBindingsの順番に作成します。


以下のコマンドを実行します。
(ネームスペース`default`にSA`default-sa`を作成する場合の例です。)

```
export NAMESPACE=default    #任意のネームスペースを設定

kubectl create sa "${NAMESPACE}-sa" -n ${NAMESPACE}   #SA作成
serviceaccount/default-sa created

kubectl get sa -n ${NAMESPACE}   #作成したSAを確認
NAME          SECRETS   AGE
default       1         288d     #既存のSA
default-sa   1         8s       #作成したSA
```

作成したSAに付与する操作権限をroleとして定義します。
今回SAには特に制限を設けません。

```default-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: default-role
  namespace: default
rules:
- apiGroups: ["*"]
  resources: ["*"]
  verbs: ["*"]
```

roleをクラスタに適用します

```
kubectl apply -f default-role.yaml -n default
role.rbac.authorization.k8s.io/default-role created

kubectl get role -n default
NAME           AGE
default-role   9s
```
最後にrolebindingです。

```default-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: default-api-rb
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: default-role  #roleを指定
subjects:
- apiGroup: ""       
  kind: ServiceAccount  #SAを指定
  name: default-sa
  namespace: default
```

作成したrolebindingsを適用します。

```
kubectl apply -f default-rolebindings.yaml
rolebinding.rbac.authorization.k8s.io/default-api-rb created
```

以上で構成は完了です。
このポストの"クラスター情報取得"から手順を実行してください。
指定のnamespaceにはdeploymentリソースの作成が可能となり、他のネームスペースでは不可になります。(なるはず。。)