バイナリインストールkubernetes v 1.11.2(第8章kube-apiserver配備)

22896 ワード

前章の配置を続行します.
八、kube-apiserverコンポーネントの配置
7章のhaproxyとkeepalivedを使用して配備された高可用性クラスタが提供するVIP:${MASTER_VIP}
8.1バイナリファイルのダウンロード、第三章参照
8.2 kubernetes証明書と秘密鍵の作成
source /opt/k8s/bin/environment.sh
cat > kubernetes-csr.json <<EOF
{
  "CN": "kubernetes",
  "hosts": [
    "127.0.0.1",
    "192.168.56.20",
    "192.168.56.20",
    "${MASTER_VIP}",
    "${CLUSTER_KUBERNETES_SVC_IP}",
    "kubernetes",
    "kubernetes.default",
    "kubernetes.default.svc",
    "kubernetes.default.svc.cluster",
    "kubernetes.default.svc.cluster.local"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "ST": "BeiJing",
      "L": "BeiJing",
      "O": "k8s",
      "OU": "4Paradigm"
    }
  ]
}
EOF
  • hostフィールドは、証明書の使用を許可するIPまたはドメイン名のリストを指定します.ここには、VIP、apiserverノードIP、kubernetesサービスIP、ドメイン名
  • がリストされています.
  • ドメイン名は最後にできません.(kubernetes.default.svc.cluster.local.)でなければ、解析に失敗した場合は、x 509:cannot parse dnsName"kubernetes.default.svc.cluster.local."
  • 非clusterを使用する場合.localドメイン名、例えばxxx.comでは、ドメイン名リストの最後の2つのドメイン名を変更する必要があります:kubernetes.default.svc.xxx、kubernetes.default.svc.xxx.com
  • kubernetesサービスIPはapiserverによって自動的に作成され、一般的に-service-cluster-ip-rangeパラメータで指定されたセグメントの最初のIPであり、その後、次のコマンドで取得することができる:
  • $ kubectl get svc kubernetes
    NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   10.254.0.1           443/TCP   1d

    8.3証明書と秘密鍵の生成
    cfssl gencert -ca=/etc/kubernetes/cert/ca.pem \
      -ca-key=/etc/kubernetes/cert/ca-key.pem \
      -config=/etc/kubernetes/cert/ca-config.json \
      -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
    ls kubernetes*pem

    8.4生成した証明書と秘密鍵ファイルをmasterノードにコピーする
    source /opt/k8s/bin/environment.sh
    for master_ip in ${MASTER_IPS[@]}
      do
        echo ">>> ${master_ip}"
        ssh root@${master_ip} "mkdir -p /etc/kubernetes/cert/ && sudo chown -R k8s /etc/kubernetes/cert/"
        scp kubernetes*.pem k8s@${master_ip}:/etc/kubernetes/cert/
    done

    8.5暗号化プロファイルの作成
    source /opt/k8s/bin/environment.sh
    cat > encryption-config.yaml <<EOF
    kind: EncryptionConfig
    apiVersion: v1
    resources:
      - resources:
          - secrets
        providers:
          - aescbc:
              keys:
                - name: key1
                  secret: ${ENCRYPTION_KEY}
          - identity: {}
    EOF

    8.6暗号化プロファイルをmasterノードの/etc/kubernetesディレクトリにコピーする
    source /opt/k8s/bin/environment.sh
    for master_ip in ${MASTER_IPS[@]}
      do
        echo ">>> ${master_ip}"
        scp encryption-config.yaml root@${master_ip}:/etc/kubernetes/
    done

    置換後の暗号化プロファイル:
    [root@k8s-m1 cert]# more encryption-config.yaml 
    kind: EncryptionConfig
    apiVersion: v1
    resources:
      - resources:
          - secrets
        providers:
          - aescbc:
              keys:
                - name: key1
                  secret: V8NUF8gATb1bZmBke9NRVw33JHt3elTDfNoIi0uhOFI=
          - identity: {}

    8.7 kube-apiserver systemd unitテンプレートファイルの作成
    source /opt/k8s/bin/environment.sh
    cat > kube-apiserver.service.template <<EOF
    [Unit]
    Description=Kubernetes API Server
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=network.target
    
    [Service]
    ExecStart=/opt/k8s/bin/kube-apiserver \\
      --enable-admission-plugins=Initializers,NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\
      --anonymous-auth=false \\
      --experimental-encryption-provider-config=/etc/kubernetes/encryption-config.yaml \\
      --advertise-address=##NODE_IP## \\
      --bind-address=##NODE_IP## \\
      --insecure-port=0 \\
      --authorization-mode=Node,RBAC \\
      --runtime-config=api/all \\
      --enable-bootstrap-token-auth \\
      --service-cluster-ip-range=${SERVICE_CIDR} \\
      --service-node-port-range=${NODE_PORT_RANGE} \\
      --tls-cert-file=/etc/kubernetes/cert/kubernetes.pem \\
      --tls-private-key-file=/etc/kubernetes/cert/kubernetes-key.pem \\
      --client-ca-file=/etc/kubernetes/cert/ca.pem \\
      --kubelet-client-certificate=/etc/kubernetes/cert/kubernetes.pem \\
      --kubelet-client-key=/etc/kubernetes/cert/kubernetes-key.pem \\
      --service-account-key-file=/etc/kubernetes/cert/ca-key.pem \\
      --etcd-cafile=/etc/kubernetes/cert/ca.pem \\
      --etcd-certfile=/etc/kubernetes/cert/kubernetes.pem \\
      --etcd-keyfile=/etc/kubernetes/cert/kubernetes-key.pem \\
      --etcd-servers=${ETCD_ENDPOINTS} \\
      --enable-swagger-ui=true \\
      --allow-privileged=true \\
      --apiserver-count=2 \\
      --audit-log-maxage=30 \\
      --audit-log-maxbackup=3 \\
      --audit-log-maxsize=100 \\
      --audit-log-path=/var/log/kube-apiserver-audit.log \\
      --event-ttl=1h \\
      --alsologtostderr=true \\
      --logtostderr=false \\
      --log-dir=/var/log/kubernetes \\
      --v=2
    Restart=on-failure
    RestartSec=5
    Type=notify
    User=k8s
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    EOF
  • --experimental-encryption-provider-config:暗号化機能を有効にする
  • --authorization-mode=Node,RBAC:NodeとRBACライセンスモードをオンにし、不正な要求を拒否する
  • --enable-admission-plugins:ServiceAccountとNodeRestrictionを有効にする
  • --service-account-key-file:署名ServiceAccount Tokenの公開鍵ファイル、kube-controller-managerの--service-account-private-key-fileは秘密鍵ファイルを指定し、両者のペアは
  • を使用します.
  • --tls-*-file:apiserverが使用する証明書、秘密鍵、CAファイルを指定します.--Client-ca-fileは、client(kue-controller-manager、kube-scheduler、kubelet、kube-proxyなど)要求に伴う証明書
  • を検証するために使用される.
  • --kubelet-client-certificate、--kubelet-client-key:指定した場合、httpsを使用してkubelet APIsにアクセスします.RBACルールは、証明書に対応するユーザ(上のkubernetes*.pem証明書のユーザはkubernetes)のユーザに定義する必要があります.そうしないと、kubelet APIにアクセスすると、
  • が許可されていないことを通知します.
  • --bind-address:127.0.0.1にはできません.そうしないと、外部からセキュリティポート6443
  • にアクセスできません.
  • --insecure-port=0:傍受非安全ポートを閉じる(8080)
  • --service-cluster-ip-range:Service Cluster IPアドレスセグメント
  • を指定
  • --service-node-port-range:NodePortのポート範囲を指定する
  • --runtime-config=api/all=true:autoscaling/v 2 alpha 1
  • などのすべてのバージョンのAPIsを有効にします.
  • --enable-bootstrap-token-auth:kubelet bootstrapを有効にするtoken認証
  • --apiserver-count=3:クラスタ実行モードを指定し、複数のkube-apiserverがleader選挙によって1つのワークノードを生成し、他のノードがブロックされている
  • User=k 8 s:k 8 sアカウントを使用して
  • を実行
     
    8.8各ノードに対するkube-apiserver systemd unitファイルの作成と配布
    テンプレート内の変数を置き換え、各masterノードのsystemd unitファイルを生成します.
    source /opt/k8s/bin/environment.sh
    for (( i=0; i < 2; i++ ))
      do
        sed -e "s/##NODE_NAME##/${NODE_NAMES[i]}/" -e "s/##NODE_IP##/${NODE_IPS[i]}/" kube-apiserver.service.template > kube-apiserver-${NODE_IPS[i]}.service 
    done
    ls kube-apiserver*.service

    8.9生成したsystemd unitファイルの配布
    source /opt/k8s/bin/environment.sh
    for master_ip in ${MASTER_IPS[@]}
      do
        echo ">>> ${master_ip}"
        ssh root@${master_ip} "mkdir -p /var/log/kubernetes && chown -R k8s /var/log/kubernetes"
        scp kube-apiserver-${master_ip}.service root@${master_ip}:/etc/systemd/system/kube-apiserver.service
    done
  • ログディレクトリ
  • を作成する必要があります.
  • 配布後、ファイル名はkube-apiserverと変更された.service

  • 8.10 kube-apiserverサービスの開始
    source /opt/k8s/bin/environment.sh
    for master_ip in ${MASTER_IPS[@]}
      do
        echo ">>> ${master_ip}"
        ssh root@${master_ip} "systemctl daemon-reload && systemctl enable kube-apiserver && systemctl restart kube-apiserver"
    done

    8.11 kube-apiserver運転状態の確認
    source /opt/k8s/bin/environment.sh
    for master_ip in ${MASTER_IPS[@]}
      do
        echo ">>> ${master_ip}"
        ssh root@${master_ip} "systemctl status kube-apiserver |grep 'Active:'"
    done

    サービスステータスがActive:active(running)であることを確認
    ログの表示方法:journalctl-u kube-apiserver
    8.12 kube-apiserver書き込みetcdデータの印刷
    source /opt/k8s/bin/environment.sh
    ETCDCTL_API=3 etcdctl \
        --endpoints=${ETCD_ENDPOINTS} \
        --cacert=/etc/kubernetes/cert/ca.pem \
        --cert=/etc/etcd/cert/etcd.pem \
        --key=/etc/etcd/cert/etcd-key.pem \
        get /registry/ --prefix --keys-only

    8.13クラスタ情報の確認
     
    [root@k8s-m1 template]# kubectl cluster-info
    Kubernetes master is running at https://192.168.56.6:8443
    
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
    [root@k8s-m1 template]# kubectl get all --all-namespaces
    NAMESPACE   NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    default     service/kubernetes   ClusterIP   10.254.0.1           443/TCP   9m
    [root@k8s-m1 template]# kubectl get componentstatuses
    NAME                 STATUS      MESSAGE                                                                                     ERROR
    controller-manager   Unhealthy   Get http://127.0.0.1:10252/healthz: dial tcp 127.0.0.1:10252: connect: connection refused   
    scheduler            Unhealthy   Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused   
    etcd-0               Healthy     {"health":"true"}                                                                           
    etcd-1               Healthy     {"health":"true"}  

    8.14 kubectl命令式を実行するときに次のようなエラーメッセージを出力と、使用する~/.kube/configファイルが間違っています.正しいアカウントに切り替えてから、このコマンドを実行してください.
    The connection to the server localhost:8080 was refused - did you specify the right host or port?
    8.15 kubectl get componentstatusesコマンドを実行すると、apiserverはデフォルトで127.0.0.1にリクエストを送信します.Controller-manager、schedulerがクラスタモードで動作している場合、kube-apiserverとは1台のマシンに存在しない可能性があります.この場合、Controller-managerまたはschedulerの状態はUnhealthyですが、実際には正常に動作します.
    8.16 kube-apiserverが傍受しているポートを確認する
    [root@k8s-m1 template]# sudo netstat -lnpt|grep kube
    tcp        0      0 192.168.56.20:6443      0.0.0.0:*               LISTEN      9918/kube-apiserver 
  • 6443 https要求を受信するセキュリティポートは、すべての要求を認証し、
  • を許可する.
  • 非セキュアポートがオフになっているため、8080
  • は傍受されていない.
    8.17 kubernetes証明書にkubelet APIへのアクセス権を付与
    kubectl exec、run、logsなどのコマンドを実行するとapiserverがkubeletに転送されます.ここでRBACルールを定義します
    [root@k8s-m1 template]# kubectl create clusterrolebinding kube-apiserver:kubelet-apis --clusterrole=system:kubelet-api-admin --user kubernetes
    clusterrolebinding.rbac.authorization.k8s.io/kube-apiserver:kubelet-apis created

     
    転載先:https://www.cnblogs.com/aast/p/9849416.html