#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を用意します。
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には特に制限を設けません。
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です。
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リソースの作成が可能となり、他のネームスペースでは不可になります。(なるはず。。)