--kubelet-certificate-orcurtiver apiserverパラメータを正しく設定する方法 -- kubernetes フィールド と kubernetes-apiserver フィールド と kube-apiserver フィールド 関連 問題

How Do I Properly Set --kubelet-certificate-authority apiserver parameter?












1
vote

問題

日本語

kubespray を使ってAWSに2つのノードクラスタをプロビジョニングしています。デフォルトでは、 --kubelet-certificate-authority パラメータは使用されません。しかし、私はそれを設定したいです。

--kubelet-certificate-authority の正しい設定はわかりません。 /etc/kubernetes/pki/ca.crt に設定すると、私のログで次のようなメッセージが表示されます。

<事前> <コード> TLS handshake error from 10.245.207.223:59278: remote error: tls: unknown certificate authority

テストのための絶縁環境を作成するために、 4667 の非標準ポートでApiserverを実行するこのコマンドを実行するようにコントローラノードにSSHしました。これらの値を /etc/kubernetes/manifests/kube-apiserver.yaml から直接コピーしました。自分のクラスタと一致するように値を調整する必要があります。ログメッセージが表示されるように、意図的にインタラクティブモードでコンテナを実行しています。

 <コード> sudo docker run    --name api-server-playground    -it    --rm    --network host    --volume /etc/kubernetes:/etc/kubernetes:ro    --volume /etc/pki:/etc/pki:ro    --volume /etc/ssl:/etc/ssl/:ro    k8s.gcr.io/kube-apiserver:v1.18.9    kube-apiserver      --advertise-address=10.245.207.223      --allow-privileged=true      --anonymous-auth=True      --apiserver-count=1      --authorization-mode=Node,RBAC      --bind-address=0.0.0.0      --client-ca-file=/etc/kubernetes/ssl/ca.crt      --cloud-config=/etc/kubernetes/cloud_config      --cloud-provider=aws      --enable-admission-plugins=NodeRestriction      --enable-aggregator-routing=False      --enable-bootstrap-token-auth=true      --endpoint-reconciler-type=lease      --etcd-cafile=/etc/ssl/etcd/ssl/ca.pem      --etcd-certfile=/etc/ssl/etcd/ssl/node-ip-10-245-207-223.ec2.internal.pem      --etcd-keyfile=/etc/ssl/etcd/ssl/node-ip-10-245-207-223.ec2.internal-key.pem      --etcd-servers=https://10.245.207.119:2379      --event-ttl=1h0m0s      --insecure-port=0      --kubelet-client-certificate=/etc/kubernetes/ssl/apiserver-kubelet-client.crt      --kubelet-client-key=/etc/kubernetes/ssl/apiserver-kubelet-client.key      --kubelet-preferred-address-types=InternalDNS,InternalIP,Hostname,ExternalDNS,ExternalIP      --profiling=False      --proxy-client-cert-file=/etc/kubernetes/ssl/front-proxy-client.crt      --proxy-client-key-file=/etc/kubernetes/ssl/front-proxy-client.key      --request-timeout=1m0s      --requestheader-allowed-names=front-proxy-client      --requestheader-client-ca-file=/etc/kubernetes/ssl/front-proxy-ca.crt      --requestheader-extra-headers-prefix=X-Remote-Extra-      --requestheader-group-headers=X-Remote-Group      --requestheader-username-headers=X-Remote-User      --secure-port=6447      --service-account-key-file=/etc/kubernetes/ssl/sa.pub      --service-cluster-ip-range=10.233.0.0/18      --service-node-port-range=30000-32767      --storage-backend=etcd3      --tls-cert-file=/etc/kubernetes/ssl/apiserver.crt      --tls-private-key-file=/etc/kubernetes/ssl/apiserver.key   

今度はコントローラにSSHすることができ、 curl を使用してカスタムApiserverコンテナと対話します。

  • コントローラノードを指すようにApiserver変数を設定します。上記の advertise-address パラメータの値を使用しています。
<事前> <コード> APISERVER=https://10.245.207.223:6447
  • トークンを入手してください。
 <コード> --kubelet-certificate-authority0  
  • APIリクエストを作成します。 「ピアの証明書発行者が認識されていない」というため、このリクエストは失敗します。
 <コード> --kubelet-certificate-authority1  

Dockerログにエラーメッセージが表示されます。それはこのように見えます:

<事前> <コード> --kubelet-certificate-authority2
  • 現在の 998877613 curlパラメータを使用して、認識の問題を回避します。
<事前> <コード> --kubelet-certificate-authority4

リクエストが正しく機能するのがわかります。ただし、 --kubelet-certificate-authority5 パラメータを使用したくありません。だから私はApiserverから認証局を使用しようとしました。

  • Apiserverから認証局を取得します。
 <コード> --kubelet-certificate-authority6  
  • APIリクエストの認証局ファイルを使用してください。
<プリクラス= "LANG-SH Prettyprint-Override"> <コード> --kubelet-certificate-authority7

更新

Wiktorの対応のプロンプトにフォローして、私は/etc/kubernetes/ssl/ca.crtを認証局として追加しました。そして私の --kubelet-certificate-authority8 コマンドでそのファイルを使用しました。

<プレクラス= "LANG-SH Prettyprint-Override"> <コード> --kubelet-certificate-authority9

これは働いた。

英語

I am using KubeSpray to provision a two node cluster on AWS. By default, the --kubelet-certificate-authority parameter is not used. However, I would like to set it.

I do not know the correct setting for --kubelet-certificate-authority. When I set it to /etc/kubernetes/pki/ca.crt I see messages like the following in my logs:

TLS handshake error from 10.245.207.223:59278: remote error: tls: unknown certificate authority 

In order to create an isolated environment for testing, I SSH'ed to my controller node to run this command which runs apiserver on the non-standard port of 4667. I copied these values directly from /etc/kubernetes/manifests/kube-apiserver.yaml. You'll need to adjust the value to match your own cluster. I purposely am running the container in interactive mode so that I can see the log messages.

sudo docker run    --name api-server-playground    -it    --rm    --network host    --volume /etc/kubernetes:/etc/kubernetes:ro    --volume /etc/pki:/etc/pki:ro    --volume /etc/ssl:/etc/ssl/:ro    k8s.gcr.io/kube-apiserver:v1.18.9    kube-apiserver      --advertise-address=10.245.207.223      --allow-privileged=true      --anonymous-auth=True      --apiserver-count=1      --authorization-mode=Node,RBAC      --bind-address=0.0.0.0      --client-ca-file=/etc/kubernetes/ssl/ca.crt      --cloud-config=/etc/kubernetes/cloud_config      --cloud-provider=aws      --enable-admission-plugins=NodeRestriction      --enable-aggregator-routing=False      --enable-bootstrap-token-auth=true      --endpoint-reconciler-type=lease      --etcd-cafile=/etc/ssl/etcd/ssl/ca.pem      --etcd-certfile=/etc/ssl/etcd/ssl/node-ip-10-245-207-223.ec2.internal.pem      --etcd-keyfile=/etc/ssl/etcd/ssl/node-ip-10-245-207-223.ec2.internal-key.pem      --etcd-servers=https://10.245.207.119:2379      --event-ttl=1h0m0s      --insecure-port=0      --kubelet-client-certificate=/etc/kubernetes/ssl/apiserver-kubelet-client.crt      --kubelet-client-key=/etc/kubernetes/ssl/apiserver-kubelet-client.key      --kubelet-preferred-address-types=InternalDNS,InternalIP,Hostname,ExternalDNS,ExternalIP      --profiling=False      --proxy-client-cert-file=/etc/kubernetes/ssl/front-proxy-client.crt      --proxy-client-key-file=/etc/kubernetes/ssl/front-proxy-client.key      --request-timeout=1m0s      --requestheader-allowed-names=front-proxy-client      --requestheader-client-ca-file=/etc/kubernetes/ssl/front-proxy-ca.crt      --requestheader-extra-headers-prefix=X-Remote-Extra-      --requestheader-group-headers=X-Remote-Group      --requestheader-username-headers=X-Remote-User      --secure-port=6447      --service-account-key-file=/etc/kubernetes/ssl/sa.pub      --service-cluster-ip-range=10.233.0.0/18      --service-node-port-range=30000-32767      --storage-backend=etcd3      --tls-cert-file=/etc/kubernetes/ssl/apiserver.crt      --tls-private-key-file=/etc/kubernetes/ssl/apiserver.key 

Now it's possible to SSH into the controller again and use curl to interact with the custom apiserver container.

  • Set the APISERVER variable to point to the controller node. I'm using the value of the advertise-address parameter above.
APISERVER=https://10.245.207.223:6447 
  • Get a token.
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes.io/service-account.name']=='default')].data.token}"|base64 --decode); echo "TOKEN=$TOKEN" 
  • Make an api request. This request will fail because "Peer's Certificate issuer is not recognized.".
curl --header "Authorization: Bearer $TOKEN" -X GET $APISERVER/api 

An error message will appear in the docker log. It will look like this:

I0921 14:39:07.662368       1 log.go:172] http: TLS handshake error  from 10.245.207.223:59278: remote error: tls: unknown certificate authority 
  • Now use the -k curl parameter to bypass the recognition issue.
curl -k --header "Authorization: Bearer $TOKEN" -X GET $APISERVER/api {   "kind": "APIVersions",   "versions": [     "v1"   ],   "serverAddressByClientCIDRs": [     {       "clientCIDR": "0.0.0.0/0",       "serverAddress": "10.245.207.223:6447"     }   ] } 

You'll see the request works correctly. However, I don't want to use the -k parameter. So I tried to use the certificate authority from the apiserver.

  • Get the certificate authority from the apiserver.
echo |      openssl s_client -connect $APISERVER 2>/dev/null |      openssl x509 -text |      sed -n "/BEGIN CERTIFICATE/,/END CERTIFICATE/p"      > apiserver.ca.crt 
  • Use the certificate authority file for the api request.
curl --cacert apiserver.ca.crt --header "Authorization: Bearer $TOKEN" -X GET $APISERVER/api 

UPDATE

Following a thought prompted by Wiktor's response, I added /etc/kubernetes/ssl/ca.crt as the certificate authority. And used that file in my curl command.

curl --cacert /etc/kubernetes/ssl/ca.crt --header "Authorization: Bearer $TOKEN" -X GET $APISERVER/api 

This worked.

</div
        

回答リスト

0
 
vote
vote
ベストアンサー
 

--kubelet-certificate-authority フラグを作るためには、まず kubelet authentication と kubelet authorization 有効。その後、Kubernetesのマニュアルに従って、 kubelet認証:

  • --anonymous-auth=false flag

    でkubeletを起動します。
  • --client-ca-file フラグでkubeletを起動し、クライアント証明書を

    でクライアント証明書を検証するためのCAバンドルを提供します。
  • --kubelet-client-certificate および --kubelet-client-key

    でApiserverを起動します。
  • API Server

    で<コード> authentication.k8s.io/v1beta1 APIグループが有効になっていることを確認してください。
  • --authentication-token-webhook および --kubeconfig flags

    でKubeletを起動します。
  • kubeletは、制限されたAPIサーバ上の /etc/kubernetes/manifests/kube-apiserver.yaml0 APIを呼び出して、ベアラトークンからのユーザ情報を決定します

  1. kubelet承認:
    • API Server

      で<コード> /etc/kubernetes/manifests/kube-apiserver.yaml1 APIグループが有効になっていることを確認してください。
    • /etc/kubernetes/manifests/kube-apiserver.yaml2 /etc/kubernetes/manifests/kube-apiserver.yaml3

      でkubeletを起動します。
    • kubeletは、設定されたAPIサーバ上の /etc/kubernetes/manifests/kube-apiserver.yaml4 APIを呼び出して、各要求が許可されているか否かを判断する

    1. 998877615 フラグを使用して、kubeletのサービング証明書を検証するために使用するルート証明書バンドルを使用してApiserverを提供します。
    2. 関連資料に記載されているドキュメントに記載されています。

 

In order to make the --kubelet-certificate-authority flag work you first need to make sure you got Kubelet authentication and Kubelet authorization enabled. After that you can follow the Kubernetes documentation and setup the TLS connection between the apiserver and kubelet. And finally, you can edit the API server pod specification file /etc/kubernetes/manifests/kube-apiserver.yaml on the master node and set the --kubelet-certificate-authority parameter to the path to the cert file for the certificate authority.

So, to sum up the steps to do are:

  1. Kubelet authentication:
  • start the kubelet with the --anonymous-auth=false flag

  • start the kubelet with the --client-ca-file flag, providing a CA bundle to verify client certificates with

  • start the apiserver with --kubelet-client-certificate and --kubelet-client-key flags

  • ensure the authentication.k8s.io/v1beta1 API group is enabled in the API server

  • start the kubelet with the --authentication-token-webhook and --kubeconfig flags

  • the kubelet calls the TokenReview API on the configured API server to determine user information from bearer tokens

  1. Kubelet authorization:
  • ensure the authorization.k8s.io/v1beta1 API group is enabled in the API server

  • start the kubelet with the --authorization-mode=Webhook and the --kubeconfig flags

  • the kubelet calls the SubjectAccessReview API on the configured API server to determine whether each request is authorized

  1. Use the --kubelet-certificate-authority flag to provide the apiserver with a root certificate bundle to use to verify the kubelet's serving certificate.

More details can be found in the linked documentation.

</div
 
 

関連する質問

0  Windows Kubernetes API Server用のDockerでログの詳細を増やすにはどうすればよいですか?  ( How do i increase log verbosity in docker for windows kubernetes api server ) 
Windows用のDockerを実行すると、 kube-apiserver のログの詳細レベルは比較的低いです。 K8SノードはVMでホストされているので、デフォルト設定を変更する場所は明らかではありません。 ...

1  Nodeportの競合kube-apiserverのHostport  ( Nodeport conflicts wiht kube apiservers hostport ) 
私は健康なK8Sクラスターを持っています。 Kube-Apiserverはポート 8443 を使用しています。 それから私は以下のようなことをします。私はSEVICEを作成/編集し、固定ノッコポールを割り当てます。 8443 も割り当てます。 <事前> <コー...

0  Kubernetes Apiserverの再起動ループ  ( Kubernetes apiserver restarting loop ) 
vagrantを使ってK8Sクラスターを作成しようとしていますが、常に問題に遭遇します。 私はKubeAdmのインストールとクラスタの作成に関する公式ガイドをフォローしています。 kubeadm init を初めて実行したときは、タイムアウトが得られます。...

3  KubernetesのAPIエンドポイントWebHook Serverを変化させる  ( Api endpoints for kubernetes mutating webhook server ) 
説明されているようにここ、これはa ウェブフックのリファレンス実装 Kubernetes E2Eテストで使用されているサーバー。 <a href="tel:072 123456">072 123456</a> 3 関数では、変異に対するさまざまな要求を処理...

1  クウェネスリソースをaiversionでリストします  ( List kubernetes resources by apiversion ) 
APIバージョンに関連するすべてのKubernetesオブジェクトをリストする簡単な方法はありますか? APIバージョン<コード> apps/v1beta1 が廃止予定で、このバージョンを使用して私のクラスターにオブジェクトを持っているかどうかを知りたいので...

0  Kubernetes - API Server / etcdは各ポッドのステータスをどのように知っていますか?  ( Kubernetes how does api server etcd know the status of each pod ) 
kubelet は、PODSpecs(通常はAPIサーバーから)とポッドを実行する責任があることを理解しています。 kubernetesコンポーネント&gt。ノードコンポーネント&gt。 kubelet "Kubeletはさまざまなメカニズ...

1  Kube-APIサーバーが起動していません(CrashLoopbackoff)  ( Kube api server is not starting crashloopbackoff ) 
私の1マスターノードクラスタのkube-apiserverを起動できません。 Kubeletはサービスを開始しようとしていますが、すべてのTime Crashloopbackoffを取得します。 docker run コマンドを使用してコンテナを実行しようと...

1  --kubelet-certificate-orcurtiver apiserverパラメータを正しく設定する方法  ( How do i properly set kubelet certificate authority apiserver parameter ) 
kubespray を使ってAWSに2つのノードクラスタをプロビジョニングしています。デフォルトでは、 --kubelet-certificate-authority パラメータは使用されません。しかし、私はそれを設定したいです。 --kubelet-...

0  Kubernetes Clusterの内側からPODとサービスサブネットの問い合わせ  ( Inquiring pod and service subnets from inside kubernetes cluster ) 
携帯用および簡単な方法で、Kubernetes Podとサービスサブネットを使用中に問い合わせることができますか(たとえば、<コード> 9988877660 、<コード> 10.96.0.0/12 など)。例えば、 kubectl get cm -n kub...

0  Kubernetes API Serverとクライアント間のデータを暗号化し復号化する  ( Encrypt decrypt data between kubernetes api server and client ) 
kubeadmとIMを2つのクッベネスクラスタ設定とHaproxyを使用して、トラフィックをリダイレクトしてロードすると、さまざまなクラスタへのトラフィックをリダイレクトしてロードします。これで、各クラスタのそれぞれのAPIサーバーへのリクエストをリダイレク...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有