K 8 S入門シリーズのクラスタバイナリ配置-->node編(二)

14471 ワード

Nodeノードコンポーネント(v 1.17)
  • docker https://download.docker.com/
  • kubelet
  • kube-proxy

  • kubernetes-server-linux-amd64.tar.gz(関連するここではバイナリファイルが見つかります!)
    1.システム初期化
    1.1システム環境
    [root@localhost ~]# cat /etc/redhat-release 
    CentOS Linux release 8.0.1905 (Core) 
    

    1.2各ノードの対応するhostnameを変更し、それぞれ/etc/hostsに書き込む
    hostnamectl set-hostname k8s-node01
    
    #   hosts-->     >>            !
    cat>> /etc/hosts <

    1.3依存パッケージと共通ツールのインストール
    yum install  wget vim yum-utils net-tools tar chrony curl jq ipvsadm ipset conntrack iptables sysstat libseccomp -y
    

    1.4すべてのノードがfirewalld,selinuxおよびswapを閉じる
    #              
    systemctl disable --now firewalld
    iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
    iptables -P FORWARD ACCEP
    
    #   selinux  --->selinux=disabled      !
    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    
    #   swap --->   swap   ,      !
    swapoff -a && sed -i '/ swap / s/^\(.*\)$/# \1/g' /etc/fstab
    

    1.5すべてのノードの時間同期の設定
    timedatectl set-timezone Asia/Shanghai
    timedatectl set-local-rtc 0
    
    systemctl enable chronyd && systemctl restart chronyd
    

    1.6カーネルパラメータを調整し、k 8 sの必須パラメータ!
    #      
    modprobe br_netfilter
    
    #       
    cat> /etc/sysctl.d/kubernetes.conf <

    1.6 kube-proxy開始ipvsの前置条件
    #       
    cat> /etc/sysconfig/modules/ipvs.modules <

    1.7 nodeごとにディレクトリを作成する
    #      
    mkdir -p /opt/k8s/{bin,cert}
    mkdir -p /opt/lib/{kubelet,kube-proxy}
    
    #    node       :
    sh -c "echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >> /etc/profile.d/k8s.sh"
    #       
    source /etc/profile.d/k8s.sh
    
  • 以上の手順を完了したら、機械を再起動して
  • を検査したほうがいいです.
    2.インストールdockerの配備
  • dockerは、コンテナの稼働環境であり、ライフサイクルを管理します.kubeletはContainer Runtime Interface(CRI)を介してdockerと対話する
  • flanneld起動時にネットワーク構成を/run/flannel/dockerファイルに書き込み、dockerd起動前にファイルの環境変数DOCKER_を読み込むNETWORK_OPTIONS、docker 0ブリッジセグメントを設定します.

  • 2.1 yumインストールdocker
  • 現在、Red Hatはdocker-ceのインストールをブロックしているため、コマンドyum install docker-ceを実行しようとすると、実行に失敗します.
  • #    docker  
    yum-config-manager  --add-repo   https://download.docker.com/linux/centos/docker-ce.repo
    
    #      containerd.io (    el7  ...)
    yum install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
    
    # yum   docker-ce 19.03
    yum install docker-ce
    

    2.2 dockerプロファイルの変更
    2.3起動を設定し、認証dockerサービスを起動する
    systemctl enable docker && systemctl daemon-reload && systemctl restart docker && systemctl status docker
    

    3.クbeletコンポーネントの配備
  • kubletは各nodeノード上で実行され、kube-apiserverから送信された要求を受信し、Podコンテナを管理し、exec、run、logsなどのインタラクティブなコマンドを実行する.
  • kublet起動時に自動的にkube-apiserverにノード情報を登録し、内蔵cadvisorはノードのリソース使用状況を統計し、監視する.
  • セキュリティを確保するため、本書ではhttpsリクエストを受信するセキュリティポートのみを開き、リクエストを認証および承認し、不正アクセスps:kubeletを拒否するメカニズムでは、手動で証明書を生成する必要はありません.

  • 3.1バイナリクbeletファイルのダウンロード
    kubernetes-server-linux-amd64.tar.gz    #     ,    !      kubectl         !
    
    #     ,      kube-proxy      !
    [root@k8s-master01 ~]# scp /root/kubernetes/server/bin/{kubelet,kube-proxy} root@k8s-node01:/opt/k8s/bin/
    

    3.2マスターノードでのロールバインドの作成
  • kubelet起動時にkube-apiserverにTLS bootstrappingリクエストを送信するには、bootstrap tokenファイルのkubelet-bootstrapユーザーにsystem:node-bootstrapper clusterロール(role)を付与してからkubeletが認証リクエスト(certificate signing requests):
  • を作成する権限を持つ必要があります.
    [root@k8s-master01 ~]# kubectl create clusterrolebinding kubelet-bootstrap \
    --clusterrole=system:node-bootstrapper \
    --user=kubelet-bootstrap
    

    --user=kubelet-bootstrapは、kube-apiserverの配備時にbootstrap-tokenを作成する.csvファイルで指定するユーザはbootstrapに書き込む必要がある.kubeconfigファイル
    3.3マスターノードに参加するnodeのkubelet-bootstrapを作成する.kubeconfigファイル
    #       
    [root@k8s-master01 ~]# kubectl config set-cluster kubernetes \
    --certificate-authority=/opt/k8s/cert/ca.pem \
    --embed-certs=true \
    --server=https://192.168.2.210:8443 \
    --kubeconfig=/opt/k8s/kubelet-bootstrap.kubeconfig
    
    #          
    ### tocker      bootstrap-token.csv   token 
    [root@k8s-master01 ~]# kubectl config set-credentials kubelet-bootstrap \
    --token=23f6d5b6ddb2779c048ef13197d4aa2b \
    --kubeconfig=/opt/k8s/kubelet-bootstrap.kubeconfig
    
    #        
    [root@k8s-master01 ~]# kubectl config set-context default \
    --cluster=kubernetes \
    --user=kubelet-bootstrap \
    --kubeconfig=/opt/k8s/kubelet-bootstrap.kubeconfig
    
    #        
     [root@k8s-master01 ~]# kubectl config use-context default \
    --kubeconfig=/opt/k8s/kubelet-bootstrap.kubeconfig
    

    関連ファイルの転送
    #   ca          node   
    scp /opt/k8s/cert/ca*.pem root@k8s-node01:/opt/k8s/cert/
    
    #      kubelet-bootstrap.kubeconfig     node    (   !)
    scp /opt/k8s/kubelet-bootstrap.kubeconfig root@k8s-node01:/opt/k8s/
    

    3.4 nodeノードに対応するkubeletのsystemd unitファイルを作成する
  • 注意パラメータの置換「##NODE_IP##」置換対応するnodeIP「##NODE_NAME#」置換対応するnodeのhostname
  • [root@k8s-node01 ~]# vi /etc/systemd/system/kubelet.service
    [Unit]
    Description=Kubernetes Kubelet
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=docker.service
    Requires=docker.service
    
    [Service]
    WorkingDirectory=/opt/lib/kubelet
    ExecStart=/opt/k8s/bin/kubelet \
    --bootstrap-kubeconfig=/opt/k8s/kubelet-bootstrap.kubeconfig \
    --cert-dir=/opt/k8s/cert/  \
    --kubeconfig=/opt/k8s/kubelet.kubeconfig \
    --anonymous-auth=false \
    --authorization-mode=Webhook \
    --authentication-token-webhook=true \
    --client-ca-file=/opt/k8s/cert/ca.pem \
    --address=##NODE_IP## \
    --cgroup-driver=cgroupfs \
    --image-pull-progress-deadline=300s \
    --node-labels=node.kubernetes.io/k8s-node=true \
    --cluster-dns=10.96.0.2 \
    --cluster-domain=cluster.local \
    --node-ip=##NODE_IP## \
    --port=10250 \
    --hostname-override=##NODE_NAME## \
    --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1 \
    --network-plugin=cni \
    --cni-conf-dir=/opt/cni/net.d \
    --alsologtostderr=true \
    --logtostderr=false \
    --log-dir=/opt/log/kubernetes \
    --v=2
    Restart=on-failure
    RestartSec=5
    KillMode=process
    
    [Install]
    WantedBy=multi-user.target
    
  • --authorization-mode:kubelet認証モード
  • --cert-dir:TLS証明書が存在するディレクトリ
  • --eviction-max-pod-grace-period:pod終了最大猶予時間
  • --pod-infra-container-image:podごとのnetwork/ipc namespaceコンテナで使用されるミラーアドレス!
  • --hostname-override:nodeのクラスタ内のホスト名を設定し、デフォルトではホストhostnameを使用します.このパラメータが設定されている場合、kube-proxyサービスもこのパラメータ
  • を設定する必要があります.
    3.6起動を設定する.クbeletのチェックサービスを開始します
    systemctl daemon-reload && systemctl enable kubelet && systemctl restart kubelet && systemctl status kubelet 
    

    3.7クbeletのTLS証明書リクエストをマスターで承認する
  • kubeletは、kube-apiserverに証明書署名要求を送信するために初めて起動し、kubernetesシステムによって許可されてから、nodeをクラスタに追加する必要があります.

  • 手動approve csrリクエスト
    #    CSR   :
    [root@k8s-master01 ~]# kubectl get csr
    NAME                                                   AGE   REQUESTOR           CONDITION
    node-csr--LyhqMsoBZHufxq_PNLzryNXUZGHhGy1sbdclP6pPoE   12m   kubelet-bootstrap   Pending
    
    
    #   approve csr:
    [root@k8s-master01 ~]# kubectl certificate approve node-csr--LyhqMsoBZHufxq_PNLzryNXUZGHhGy1sbdclP6pPoE
    certificatesigningrequest.certificates.k8s.io/node-csr--LyhqMsoBZHufxq_PNLzryNXUZGHhGy1sbdclP6pPoE approved
    
    
    # )   approve   :
    [root@k8s-master01 ~]# kubectl get csr
    NAME        AGE   REQUESTOR           CONDITION
    csr-wzzm5   61s   kubelet-bootstrap   Approved
    

    自動approve csrリクエスト!
  • 自動approve client、renew client、renew server証明書の3つのClusterRoleBindingを作成します:
  • [root@k8s-master01 ~]# cat > /opt/k8s/csr-crb.yaml <
  • auto-approve-csrs-for-group:自動approve nodeの最初のCSR;注意最初のCSRの場合、要求されたGroupはsystem:bootstrappersである.
  • node-client-cert-renewal:自動approve node後続期限切れのclient証明書、自動生成証明書Groupはsystem:nodes;
  • node-server-cert-renewal:自動approve node後続期限切れのserver証明書、自動生成証明書Groupはsystem:nodes;

  • 有効な構成:
    [root@k8s-master01 ~]# kubectl apply -f /opt/k8s/csr-crb.yaml
    clusterrolebinding.rbac.authorization.k8s.io/auto-approve-csrs-for-group created
    clusterrolebinding.rbac.authorization.k8s.io/node-client-cert-renewal created
    clusterrole.rbac.authorization.k8s.io/approve-node-server-renewal-csr created
    clusterrolebinding.rbac.authorization.k8s.io/node-server-cert-renewal created
    

    4.kube-proxyコンポーネントの配備
  • kube-proxyはすべてのnodeノードで実行され、apiserverにおけるserviceとEndpointの変化を傍受し、サービス負荷の等化のためのルーティングルールを作成します.
  • kube-proxyはipvsモードを使用します.(ipvs構成は環境構成に設定されています!)

  • 4.1 kube-proxyバイナリファイルのダウンロード
    kubernetes-server-linux-amd64.tar.gz    #     ,    !      kube-proxy         !
    

    4.2 masterノードでkube-proxy証明書を作成する
    masterノードに証明書リクエストファイルを作成するには
    [root@k8s-master01 ~]# cat > /opt/k8s/cert/kube-proxy-csr.json << EOF
    {
      "CN": "system:kube-proxy",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "BeiJing",
          "L": "BeiJing",
          "O": "k8s",
          "OU": "steams"
        }
      ]
    }
    EOF
    
  • CN:証明書のUserをsystem:kube-proxyと指定する.
  • この証明書はkube-proxyによってclient証明書としてのみ使用されるため、hostsフィールドは空です.

  • masterノードで証明書と秘密鍵を生成
    [root@k8s-master01 ~]# cfssl gencert \
    -ca=/opt/k8s/cert/ca.pem \
    -ca-key=/opt/k8s/cert/ca-key.pem \
    -config=/opt/k8s/cert/ca-config.json \
    -profile=kubernetes /opt/k8s/cert/kube-proxy-csr.json | cfssljson -bare /opt/k8s/cert/kube-proxy
    
    #     
    [root@k8s-master01 ~]# ls /opt/k8s/cert/kube-proxy*
    

    4.3マスターノードにkube-proxyを作成する.kubeconfigファイル
    ##       
    [root@kube-master ~]# kubectl config set-cluster kubernetes \
    --certificate-authority=/opt/k8s/cert/ca.pem \
    --embed-certs=true \
    --server=https://192.168.2.210:8443 \
    --kubeconfig=/opt/k8s/kube-proxy.kubeconfig
    
    ##          
    [root@kube-master ~]# kubectl config set-credentials kube-proxy \
    --client-certificate=/opt/k8s/cert/kube-proxy.pem \
    --client-key=/opt/k8s/cert/kube-proxy-key.pem \
    --embed-certs=true \
    --kubeconfig=/opt/k8s/kube-proxy.kubeconfig
    
    ##        
    [root@kube-master ~]# kubectl config set-context kube-proxy@kubernetes \
    --cluster=kubernetes \
    --user=kube-proxy \
    --kubeconfig=/opt/k8s/kube-proxy.kubeconfig
    
    ##          
    [root@kube-master ~]# kubectl config use-context kube-proxy@kubernetes \
    --kubeconfig=/opt/k8s/kube-proxy.kubeconfig
    
  • --embed-certs=true:ca.pemとadmin.pem証明書の内容は生成されたkubectl-proxyに埋め込まれる.kubeconfigファイル(追加しない場合、証明書ファイルのパスが書き込まれます).

  • 関連ファイルの転送
    #         node  
    [root@k8s-master01 ~]# scp /opt/k8s/cert/kube-proxy*.pem root@k8s-node01:/opt/k8s/cert/
    
    #   kube-proxy.kubeconfig node  
    [root@k8s-master01 ~]# scp /opt/k8s/kube-proxy.kubeconfig root@k8s-node01:/opt/k8s/
    

    4.5 nodeノードに対応するkube-proxyのkube-proxyプロファイルを作成する
  • all flags other than --config, --write-config-to, and --cleanup are deprecated. Please begin using a config file ASAP以降、すべてのコンポーネントがこの方向に向かっていると予測!!
  • 注意パラメータの置き換え"##NODE_IP###"対応nodeのnodeIP"##NODE_NAME##"対応nodeのhostname
  • を置き換える.
    [root@k8s-node01 ~]# vi /opt/k8s/kube-proxy.config.yaml
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    bindAddress: ##NODE_IP##
    clientConnection:
      kubeconfig: /opt/k8s/kube-proxy.kubeconfig
    clusterCIDR: 10.96.0.0/16
    healthzBindAddress: ##NODE_IP##:10256
    hostnameOverride: ##NODE_NAME##
    kind: KubeProxyConfiguration
    metricsBindAddress: ##NODE_IP##:10249
    mode: "ipvs"
    

    4.6 nodeノードでkube-proxy得systemd unitファイルを作成する
    [root@k8s-node01 ~]# vi /etc/systemd/system/kube-proxy.service 
    [Unit]
    Description=Kubernetes Kube-Proxy Server
    Documentation=https://github.com/GoogleCloudPlatform/kubernetes
    After=network.target
    
    [Service]
    WorkingDirectory=/opt/lib/kube-proxy
    ExecStart=/opt/k8s/bin/kube-proxy \
      --config=/opt/k8s/kube-proxy.config.yaml \
      --alsologtostderr=true \
      --logtostderr=false \
      --log-dir=/opt/log/kubernetes \
      --v=2
    Restart=on-failure
    RestartSec=5
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    

    4.7起動を設定し、kube-proxyサービスを起動して確認する
    systemctl daemon-reload && systemctl enable kube-proxy && systemctl restart kube-proxy && systemctl status kube-proxy
    

    4.8 nodeノード-->ipvsルーティングルールの表示
    [root@k8s-node01 ~]# /usr/sbin/ipvsadm -L -n
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
      -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  10.96.0.1:443 rr
      -> 192.168.2.201:6443           Masq    1      0          0         
      -> 192.168.2.202:6443           Masq    1      0          0         
      -> 192.168.2.203:6443           Masq    1      0          0     
    

    Nodeノード基本コンポーネントの導入完了