0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

curlでdeploymentを登録

Last updated at Posted at 2019-12-05

#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リソースの作成が可能となり、他のネームスペースでは不可になります。(なるはず。。)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?