Kubernetesクラスタでは、APIサーバは、入り口のクラスタ管理APIのKUBE-apiserverという名前のマスターノード上で実行中のプロセスが提供するサービスです。ユーザーがAPIを入力することを許可することができるkubectl、クライアントライブラリまたはHTTP残り、ユーザーまたはサービスアカウントでAPIを入力することができます。リクエストがAPIを到着すると、多くの場合、一般的なアプリケーション・クラスターでは、セキュリティコントロールのいくつかの段階を経る、API Serverは、多くの場合、自己署名証明書を使用するHTTPSサービス、オープン認証と承認のセキュリティメカニズムを提供します。
一般的に、Kubernetesクラスタ構造の後、公式kubectlツールやAPIサーバーの相互作用を使用することに加えて、我々はまた、ポストマンやカールを使用することができ、そして時には直接、適切なアクセス許可を作成するには、通常の必要性と対話するために、より強力な、APIサーバーをカールServiceAccountなどの関連リソースClusterRole /役割、ClusterRoleBinding / RoleBindingに与えられたその操作権限によって、このServiceAccount、および対応するトークンサービスアカウントのAPI Serverは、基本的な認証のために使用されます。その自己署名証明書によって要求されたときAPI Serverとの相互作用がTLSに基づいており、また、もちろん、あなたはまた、非セキュアAPIサーバーを接続することができ、必要ですが、お勧めしません。
作成ServiceAccount
以前の私たちは、後でServiceAccountを作成し、自動的にその秘密(鍵)の関連付けを作成したユーザに上陸した伝統的に似ているServiceAccount、上の話しました
私たちは、というファイルを作成apiviewer
ServiceAccountを
[centos@k8s-master ~]$ kubectl create sa apiviewer
serviceaccount/apiviewer created
私たちは、このSAが秘密の名前を対応する見ることができます
[centos@k8s-master ~]$ kubectl get sa apiviewer -ojson
{
"apiVersion": "v1",
"kind": "ServiceAccount",
"metadata": {
"creationTimestamp": "2019-05-27T08:09:56Z",
"name": "apiviewer",
"namespace": "default",
"resourceVersion": "16750207",
"selfLink": "/api/v1/namespaces/default/serviceaccounts/apiviewer",
"uid": "d078f034-8056-11e9-99bc-0050568417a2"
},
"secrets": [
{
"name": "apiviewer-token-z5bpq"
}
]
}
私たちは、使用できるsecretes
内部をname
分泌するの値を参照してください
apiviewer-token-z5bpq[centos@k8s-master ~]$ kubectl describe secret apiviewer-token-z5bpq
Name: apiviewer-token-z5bpq
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: apiviewer
kubernetes.io/service-account.uid: d078f034-8056-11e9-99bc-0050568417a2
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFwaXZpZXdlci10b2tlbi16NWJwcSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhcGl2aWV3ZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkMDc4ZjAzNC04MDU2LTExZTktOTliYy0wMDUwNTY4NDE3YTIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDphcGl2aWV3ZXIifQ.GUd7uCwTntMXhwXEGFvo62tJBTVdI_SNATDIbuxINmbmBI2bjHuQ-whRE5183AXqWiifoM0HjOGoams11f_R2Dtak3fRxPLNRGGFTMyUN1uHmwedPmsAK0GTW0xPgInyIy4SF-uI7lghrpsRzBQ4AmA2AuctwCGdXUC3YuqrZPEnla3HeF6Tz72KpddlgiA3N1T5yvoOHPL4AgQRDPGKJ6L-nEdXumg3BlTWR0ENBNgzAz2eh6RZLRSsKlG0zQ8vhApkMGru7k5a_PKkU3Z3b0ZhKBKmE_LsMJ7bAunr9J9bbG--Id4rnuPpcj1DoJ0ZlJ3G1IP3xTUVncxO_gV4VQ
私たちは、熟練したコマンドを使用することができます
apiviewer-token-z5bpq[centos@k8s-master ~]$ kubectl describe secret `kubectl get sa apiviewer -ojsonpath='{.secrets[0].name}'`
Name: apiviewer-token-z5bpq
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: apiviewer
kubernetes.io/service-account.uid: d078f034-8056-11e9-99bc-0050568417a2
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFwaXZpZXdlci10b2tlbi16NWJwcSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhcGl2aWV3ZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkMDc4ZjAzNC04MDU2LTExZTktOTliYy0wMDUwNTY4NDE3YTIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDphcGl2aWV3ZXIifQ.GUd7uCwTntMXhwXEGFvo62tJBTVdI_SNATDIbuxINmbmBI2bjHuQ-whRE5183AXqWiifoM0HjOGoams11f_R2Dtak3fRxPLNRGGFTMyUN1uHmwedPmsAK0GTW0xPgInyIy4SF-uI7lghrpsRzBQ4AmA2AuctwCGdXUC3YuqrZPEnla3HeF6Tz72KpddlgiA3N1T5yvoOHPL4AgQRDPGKJ6L-nEdXumg3BlTWR0ENBNgzAz2eh6RZLRSsKlG0zQ8vhApkMGru7k5a_PKkU3Z3b0ZhKBKmE_LsMJ7bAunr9J9bbG--Id4rnuPpcj1DoJ0ZlJ3G1IP3xTUVncxO_gV4VQ
もちろん、あなたはまた、ツールJQを使用することができます
[centos@k8s-master ~]$ kubectl describe secret `kubectl get sa apiviewer -ojson|jq -r .secrets[].name`
Name: apiviewer-token-z5bpq
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: apiviewer
kubernetes.io/service-account.uid: d078f034-8056-11e9-99bc-0050568417a2
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImFwaXZpZXdlci10b2tlbi16NWJwcSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhcGl2aWV3ZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJkMDc4ZjAzNC04MDU2LTExZTktOTliYy0wMDUwNTY4NDE3YTIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDphcGl2aWV3ZXIifQ.GUd7uCwTntMXhwXEGFvo62tJBTVdI_SNATDIbuxINmbmBI2bjHuQ-whRE5183AXqWiifoM0HjOGoams11f_R2Dtak3fRxPLNRGGFTMyUN1uHmwedPmsAK0GTW0xPgInyIy4SF-uI7lghrpsRzBQ4AmA2AuctwCGdXUC3YuqrZPEnla3HeF6Tz72KpddlgiA3N1T5yvoOHPL4AgQRDPGKJ6L-nEdXumg3BlTWR0ENBNgzAz2eh6RZLRSsKlG0zQ8vhApkMGru7k5a_PKkU3Z3b0ZhKBKmE_LsMJ7bAunr9J9bbG--Id4rnuPpcj1DoJ0ZlJ3G1IP3xTUVncxO_gV4VQ
ClusterRole、RoleBindingの作成
で我々はできる、我々は最初からClusterRoleを作成することができますが、K8Sのデフォルトのクラスタは、いくつかのClusterRoleがありkubectl get clusterrole
、ここで、我々はと呼ばれるプログラムを使用し、参照する必要がclusterrole何をcluster-admin
、新たに作成され、それがバインドされているServiceAccountを
RoleBinding作成し、次のコマンド
[centos@k8s-master ~]$ kubectl create rolebinding apiadmin --clusterrole cluster-admin --serviceaccount default:apiviewer
rolebinding.rbac.authorization.k8s.io/apiadmin created
获取ベアラートークン、証明書、APIサーバのURL
[centos@k8s-master ~]$ SECRET=$(kubectl get serviceaccount ${SERVICE_ACCOUNT} -ojsonpath='{.secrets[0].name}')
このコマンドは、上記の私たちが持っていた言及したSECRETの名前を取得するために使用されます。
その後、我々は持っていたにも先に述べたように、トークンを取得するための名前の秘密を使用することができます
TOKEN=$(kubectl get secret ${SECRET} -ojsonpath='{.data.token}'|base64 -d)
jsonpathを使用している場合、私たちは事前にJSONの構造を知っておく必要があり、愚かしばしば非常に効果的なアプローチは、すべての出力全体のJSONうちの最初の、そして構造の後、傍受にあります。
トークンは、このようにBASE64のデコードを必要とする、base64エンコードした後であるので
証明書でアウト秘密から、次の抜粋
kubectl get secret ${SECRET} -o jsonpath="{.data['ca\.crt']}" | base64 -d > /tmp/ca.crt
APIサーバのURLを取得し、APIサーバーが複数のマスターに配備されている場合、ちょうどそれらのいずれかになりますをご覧ください。
APISERVER = https://で$(kubectl -nデフォルトのgetエンドポイントkubernetes --no-ヘッダ| awkは'{$ 2印刷}' |カット-d "" 1 -f)
ポッドは、JQの-rですべての名前を抽出します
curl -s $APISERVER/api/v1/namespaces/default/pods/ --header "Authorization: Bearer $TOKEN" \
> --cacert /tmp/ca.crt | jq -r '.items[].metadata.name'
このコマンドをkubectlされていないので、それはもはやjsonpath結果から直接フィルタすることはできない、ここで我々はまた、記載されているこの章の前部にJQ。JQツールをフィルタリングするためのツールを使用しています。を参照することができ、子供の靴の詳細については。