k 8 sノート-1を順番に手動でインストール

14248 ワード

私と同じように、手動でインストールするときに成功しなかった人はいますか(主に知識の蓄積が足りない)、さまざまな高可用性構成とさまざまな証明書権限にうとうとしています.このメモは、Kubernetesクラスタを手動でインストールする方法の多くを試みた結果、複雑な構成を簡略化し、基本的な機能を示すKubernetesプログラムを提示し、各コンポーネントを最も簡単に構成し、基本的な機能を実現する方法を記録したいと考えています.次に、マルチノード、セキュリティ認証、高可用性などの複雑な構成を徐々に追加し、Kubernetesのさまざまなインフラストラクチャ間の関係が構成されている方法を理解します.
計画の最初のステップは、非安全な単一master単一nodeクラスタを完了することであり、api-serverやkubeletなどのコンポーネントはsystemdで管理され、masterにはkubeletをインストールせずに管理側でのみ使用されます.まず、比較的新しい1.10を使ってみました.X版k 8 sはインストールされていますが、インストール中にapi-serverのアドレスを非証明書認証で指定することはできません.政府は非セキュリティ方式のサポートを徐々にキャンセルする意図があるようです.最後に、比較的古いk 8 s 1.6.0を選択してインストールを完了しました.

参考資料:

  • 『Kubernetes権威ガイド』
  • 実行環境&ソフトウェアバージョン:

  • Ubuntu 16.04.4 LTS
  • kubernetes v1.6.0
  • etcd v3.0.14
  • docker-ce 18.06.1-ce

  • ロール計画:


    ホスト名
    IPアドレス
    ロール#ロール#
    CPU/メモリ
    u16-1
    192.168.112.148
    master(only as master)
    2コア/2 G
    u16-2
    192.168.112.149
    node
    2コア/2 G

    環境準備


    githubのKubernetesプロジェクトページから必要なV 1を見つけます.6.0バージョン、CHANGELOGをクリックし、Older releasesの下でCHANGELOG-1.6をクリックします.md、v 1が見つかりました.6.0バージョンのServer Binariesで対応するアーキテクチャのパッケージ(kubernetes-server-linux-amd 64.tar.gz)をダウンロードしてサーバにアップロードします(国内のインターネット環境では正常にダウンロードできない可能性があります)
    k 8 s 1.6.0に対応するetcdバージョンはv 3である.0.14、github上のetcdプロジェクトの対応するバージョンのページからサーバにダウンロードすることもできます.
    wget https://github.com/etcd-io/etcd/releases/download/v3.0.14/etcd-v3.0.14-linux-amd64.tar.gz

    swapを閉じ、/etc/fstabファイルで自動マウントを解除
    sudo swapoff -a

    システムにSELinuxがインストールされている場合は、システムを閉じる必要があります.また、次の手順で使用するすべてのポートをファイアウォールで開放するか、ファイアウォール管理ソフトウェアを閉じる必要があります.ubuntu 16を選択します.04デフォルトufwオフ
    sudo ufw disable

    MASTERノードのインストール


    etcdサービスのインストール

    tar xf etcd-v3.0.14-linux-amd64.tar.gz
    #  etcd   etcdctl   /usr/bin  
    sudo cp etcd-v3.0.14-linux-amd64/etcd{,ctl} /usr/bin/

    次にsystemdサービスファイル/lib/systemd/systemd/systemm/etcdを設定.service
    [Unit]
    Description=Etcd Server
    After=network.target
    
    [Service]
    Type=notify
    WorkingDirectory=/var/lib/etcd/
    EnvironmentFile=-/etc/etcd/etcd.conf
    ExecStart=/usr/bin/etcd
    
    [Install]
    WantedBy=multi-user.target

    ここでWorkingDirectoryで指定したディレクトリは、etcdデータとして保存されるディレクトリとして事前に作成する必要があります.
    EnvironmentFileでは、etcdのプロファイルを指定できます.私のところではインストールをテストするだけなので、etcdはデフォルトの構成を使用すればいいです.
    systemdでetcdを起動し、起動するように設定します.
    sudo systemctl daemon-reload
    sudo systemctl start etcd
    sudo systemctl enable etcd
    #  
    systemctl status etcd
    #   etcdctl   etcd  
    etcdctl cluster-health
    #  :
    # member 8e9e05c52164694d is healthy: got healthy result from http://localhost:2379
    # cluster is healthy

    kube-apiserverサービスのインストール

    tar xf kubernetes-server-linux-amd64.tar.gz
    #   kube-apiserver、kube-controller-manager   kube-scheduler   /usr/bin  
    sudo cp kubernetes/server/bin/kube-{apiserver,controller-manager,scheduler} /usr/bin/

    systemdサービスファイル/lib/systemd/systemd/systemm/kube-apiserverを編集します.service
    [Unit]
    Description=Kubernetes API Server
    After=etcd.service
    Wants=etcd.service
    
    [Service]
    EnvironmentFile=/etc/kubernetes/apiserver
    ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS
    Restart=on-failure
    Type=notify
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target

    環境変数ファイル/etc/kubernetes/apiserverで定義されているkube-apiserver起動パラメータKUBE_API_ARGS.このファイルを作成し、次のように記入します.
    KUBE_API_ARGS="--storage-backend=etcd3 --etcd-servers=http://127.0.0.1:2379 \
    --insecure-bind-address=0.0.0.0 --insecure-port=8080 \
    --service-cluster-ip-range=169.169.0.0/16 --service-node-port-range=1-65535 \
    --admission_control=NamespaceLifecycle,LimitRanger,ServiceAccount, \
    DefaultStorageClass,ResourceQuota \
    --logtostderr=false --log-dir=/var/log/kubernetes --v=2"

    パラメータの説明:
    --storage-backend:etcdバージョンを指定します.
    --etcd-servers:etcdサーバのアドレスとポートを指定します.
    --insecure-bind-address:api-serverが非安全にバインドされているアドレスを指定します.0.0.0.0はすべてのアドレスを表します.
    --insecure-port:api-serverが非セキュリティで有効になっているポート番号を指定します.
    --service-cluster-ip-range:クラスタCluster IPセグメントを指定し、後でネットワークプラグインを使用する必要がある場合は、ネットワークプラグインの要件に従ったセグメント構成が必要です.
    --service-node-port-range:クラスタ内のServiceが物理マシンのポート番号範囲をマッピングできるように指定
    --admission_コントロール:Kubernetesクラスタのアクセス制御設定は、各制御モジュールがプラグイン形式で順次有効になります.
    --logtostderr:falseとして指定すると、標準出力ではなくログファイルにエラーログが書き込まれます.
    --log-dir:ログ保存パス.
    --v:ログレベル
    システムdでkube-apiserverを起動し、POSTに設定します.
    sudo systemctl daemon-reload
    sudo systemctl start kube-apiserver
    sudo systemctl enable kube-apiserver
    #   status  
    systemctl status kube-apiserver

    kube-controller-managerサービスのインストール


    systemdサービスファイルの編集/lib/systemd/systemd/systemm/kube-controller-manager.service
    [Unit]
    Description=Kubernetes Controller Manager
    After=kube-apiserver.service
    Requires=kube-apiserver.service
    
    [Service]
    EnvironmentFile=/etc/kubernetes/controller-manager
    ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target

    環境変数ファイル/etc/kubernetes/controller-managerで定義されているkube-controller-manager起動パラメータKUBE_CONTROLLER_MANAGER_ARGS.このファイルを作成し、次のように記入します.
    KUBE_CONTROLLER_MANAGER_ARGS="--master=http://192.168.112.148:8080 \
    --logtostderr=false \
    --log-dir=/var/log/kubernetes \
    --v=2"

    パラメータの説明:
    --master:API-serverのURLアドレスを指定する

    kube-schedulerサービスのインストール


    systemdサービスファイル/lib/systemd/systemd/systemm/kube-schedulerを編集します.service
    [Unit]
    Description=Kubernetes Scheduler Server
    After=kube-apiserver.service
    Requires=kube-apiserver.service
    
    [Service]
    EnvironmentFile=/etc/kubernetes/scheduler
    ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target

    環境変数ファイル/etc/kubernetes/schedulerでkube-scheduler起動パラメータKUBE_が定義されています.SCHEDULER_ARGS.このファイルを作成し、次のように記入します.
    KUBE_SCHEDULER_ARGS="--master=http://192.168.112.148:8080 \
    --logtostderr=false \
    --log-dir=/var/log/kubernetes \
    --v=2"

    kube-controller-managerとkube-schedulerをインストールした後に起動し、POSTに設定します.
    sudo systemctl daemon-reload
    sudo systemctl start kube-controller-manager kube-scheduler
    sudo systemctl enable kube-controller-manager kube-scheduler
    #  ,  systemctl status XXXX  
    systemctl status kube-controller-manager
    systemctl status kube-scheduler.service

    マスターのインストールが完了しました.次はnodeノードのインストールに必要なサービスを開始します.

    NODEノードのインストール


    Nodeノードにインストールする必要があるサービスはdocker、kubelet、kube-proxyです.

    docker-ceのインストール


    dockerをインストールする方法はたくさんあります.ここではアリクラウドを追加するソースを使用し、apt-getを使用してインストールします.
    # step 1:  
    sudo apt-get update
    sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
    # step 2:  GPG 
    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    # Step 3:  
    sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    # Step 4:   Docker-CE
    sudo apt-get -y update
    sudo apt-get -y install docker-ce

    装着後dockerを押すと起動状態になり、POSTが設定されます.

    クbeletのインストール

    tar xf kubernetes-server-linux-amd64.tar.gz
    #   kubelet   kube-proxy   /usr/bin  
    sudo cp kubernetes/server/bin/kube{let,-proxy} /usr/bin/

    systemdサービスファイル/lib/systemd/systemd/systemm/kubeletを編集します.service
    [Unit]
    Description=Kubernetes Kubelet Server
    After=docker.service
    Requires=docker.service
    
    [Service]
    WorkingDirectory=/var/lib/kubelet
    EnvironmentFile=/etc/kubernetes/kubelet
    ExecStart=/usr/bin/kubelet $KUBELET_ARGS
    Restart=on-failure
    
    [Install]
    WantedBy=mulit-user.target

    WorkingDirectoryで指定したパスはkubeletのデータディレクトリで、サービス実行前に事前作成を作成する必要があります.
    環境変数ファイル/etc/kubernetes/kubeletでkubelet起動パラメータKUBELET_が定義されていますARGS.このファイルを作成し、次のように記入します.
    KUBELET_ARGS="--api-servers=http://192.168.112.148:8080 \
    --hostname-override=u16-2 \
    --logtostderr=false \
    --log-dir=/var/log/kubernetes \
    --v=2"

    パラメータの説明:
    --api-servers:apiserverのURLアドレスを指定します.
    --hostname-override:apiserverに登録するときのこのノードの名前を指定します.
    システムdでクbeletを起動し、起動するように設定します.
    sudo systemctl daemon-reload
    sudo systemctl start kubelet
    sudo systemctl enable kubelet
    #   status  
    systemctl status kubelet

    kube-proxyサービスのインストール


    systemdサービスファイル/lib/systemd/systemd/systemm/kube-proxyを編集します.service
    [Unit]
    Description=Kubernetes Kube-Proxy Server
    After=networking.service
    Requires=networking.service
    
    [Service]
    EnvironmentFile=/etc/kubernetes/proxy
    ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target

    環境変数ファイル/etc/kubernetes/proxyで定義されているkube-proxy起動パラメータKUBE_PROXY_ARGS.このファイルを作成し、次のように記入します.
    KUBE_PROXY_ARGS="--master=http://192.168.112.148:8080 \
    --logtostderr=false \
    --log-dir=/var/log/kubernetes \
    --v=2"

    システムdでkubu-proxyを起動し、POSTに設定します.
    sudo systemctl daemon-reload
    sudo systemctl start kube-proxy
    sudo systemctl enable kube-proxy
    #   status  
    systemctl status kube-proxy

    Nodeノードの設定が完了すると、masterノードにkubernetesのコマンドライン管理ソフトウェアkubectlがあれば、kubectlを使用して新しく追加されたノードを表示できます.kubectlのバイナリファイルはkubernetes-server-linux-amd 64から使用できる.tar.gzで見つかりました.
    sudo cp kubernetes/server/bin/kubectl /usr/bin/
    sudo chmod +x /usr/bin/kubectl
    kubectl get node
    #  
    # NAME      STATUS     AGE       VERSION
    # u16-2     NotReady   17m       v1.6.0

    このとき、新たに追加されたノードu 16−2の状態がNotReadyであり、コマンドによりnode状態が表示される
    kubectl describe node u16-2

    このときEvents:でエラーが表示されます.Massageは
    Failed to start ContainerManager failed to initialise top level QOS containers: root container/kubepods doesn't exist
    解決策はここを参考に、kubeletの起動パラメータに次のパラメータを加えて再起動します.
        --cgroups-per-qos=false
        --enforce-node-allocatable=""

    再起動するとnodeはReady状態になります.

    Kubernetesクラスタでのサービスの実行


    サンプル・サービスの作成

    #   kubernetes-bootcamp  
    kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
    #     dockerhub   jocatalin/kubernetes-bootcamp:v1
    kubectl run kubernetes-bootcamp --image=jocatalin/kubernetes-bootcamp:v1 --port=8080
    #   deployment  
    kubectl get deployment
    # --- ---
    NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-bootcamp   1         0         0            0           4m
    #   Pod  0,  deployment  
    kubectl describe deployment kubernetes-bootcamp
    # Events   Scaled up replica set kubernetes-bootcamp-4025819334 to 1 ,  replicaSet  
    kubectl describe replicaset kubernetes-bootcamp-4025819334

    Eventsのエラーが見つかりました.
    Error creating: No API token found for service account "default", retry after the token is automatically created and added to the service account
    解決策はここを参照してください.ここで構築されたクラスタ全体がセキュリティ認証されていないため、api-serverの--admission_コントロールパラメータのServiceAccountを削除し、kube-apiserverを再起動します.
    その後deploymentステータスを再度表示
    kubectl get deployment
    # --- ---
    NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-bootcamp   1         1         1            0           18m

    今回podは作成に成功しましたが、AVAILABLE状態ではありません.
    #   pod 
    kubectl get pod
    # --- ---
    NAME                                   READY     STATUS              RESTARTS   AGE
    kubernetes-bootcamp-4025819334-q61xj   0/1       ContainerCreating   0          5m
    #   Pod  
    kubectl describe pod kubernetes-bootcamp-4025819334-q61xj
    #  Events  :
    # Error syncing pod, skipping: failed to "CreatePodSandbox" for "kubernetes-bootcamp-4025819334-q61xj_default(1d20e7af-af48-11e8-bf2f-000c29a01556)" with CreatePodSandboxError: "CreatePodSandbox for pod \"kubernetes-bootcamp-4025819334-q61xj_default(1d20e7af-af48-11e8-bf2f-000c29a01556)\" failed: rpc error: code = 2 desc = unable to pull sandbox image \"gcr.io/google_containers/pause-amd64:3.0\": Error response from daemon: {\"message\":\"Get https://gcr.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)\"}"

    このミラーのダウンロードに失敗した:gcr.io/google_containers/pause-amd64:3.0 .やはりネットワーク環境の問題で、dockerhub上で同じミラーを見つけてtagをダウンロードして修正してこのミラーを得ることができます.
    ノード上で実行
    sudo docker image pull mirrorgooglecontainers/pause-amd64:3.0
    sudo docker tag mirrorgooglecontainers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0

    ミラーがダウンロードされたら、deploymentステータスを再度表示します.
    kubectl get deployment
    # --- ---
    NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-bootcamp   1         1         1            1           35m

    ノードにポートを露出する


    この時点でサービスは正しく導入されており、クラスタの外部からもサービスにアクセスできるように、NodePort方式でポートを露出する必要があります.
    kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
    kubectl get service
    # --- ---
    NAME                  CLUSTER-IP        EXTERNAL-IP   PORT(S)          AGE
    kubernetes            169.169.0.1               443/TCP          2d
    kubernetes-bootcamp   169.169.210.120          8080:10412/TCP   12m

    この時点でnodeの10412ポートが開いており(ここでの10412ポートはkube-apiserver起動パラメータであるservice-node-port-rangeの範囲内でランダムに割り当てられている)、nodeネイティブでアクセス可能である.ただし、クラスタ外部アクセスはタイムアウトし、kube-proxyがインストールされていないmasterアクセスもタイムアウトします.解決策はこちらを参考に.
    安全のため、dockerは1.13バージョンの後、システムiptablesのFOrWARDチェーンのデフォルトポリシーをDROPに設定し、docker 0ブリッジに接続されたコンテナに放行ルールを追加しました.
    なぜならdocker起動時にiptablesルールが変更された場合、dockerのサービスファイル/lib/systemd/systemm/dockerを変更できるからです.サービスは次の内容を追加します.
    ExecStartPost=/sbin/iptables -P FORWARD ACCEPT

    dockerを起動した後、FOrWARDチェーンを変更するデフォルトのルールがACCEPTであることを意味します.構成が完了したらdockerを再起動します.外部からアクセスできます.
    これで、単一master単一nodeの非安全kubernetsクラスタの構成が完了し、インフラストラクチャが正常に使用されます.