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:の値をそれぞれ変数CRTFILEAPISERVERに格納します。(今回は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にSAdefault-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リソースの作成が可能となり、他のネームスペースでは不可になります。(なるはず。。)