
Kubernetesのインストールに関するインターネット上でかなりの数の記事が書かれていますが、それらのほとんどはkubeadmとminikubeに基づいています。 もちろん、2、3回クリックするだけで簡単にクラスターをデプロイできるのは素晴らしいことですが、Kubernetesの構成要素について詳しく理解したいと思います。 このガイドでこの状況を修正しようとします。
目的: SSLキーとトークンで認証されたKubernetesクラスター。
指定: Centos 7上の2つの仮想マシン(必要に応じて、マニュアルは他のディストリビューションに簡単に適合します)
c00test01-マスター/ミニオン-10/10/12/101
c00test02-ミニオン-10/10/12/10
注:インストールは、firewalldおよびselinuxを無効にして実行されました。1. Etcdをインストールします
$ yum install etcd-3.1.9
設定を編集
/etc/etcd/etcd.conf ETCD_NAME=c00test01 ETCD_DATA_DIR=/var/lib/etcd #[cluster] ETCD_INITIAL_ADVERTISE_PEER_URLS=https://10.10.12.101:2380 ETCD_INITIAL_CLUSTER=c00test01=https://10.10.12.101:2380 ETCD_INITIAL_CLUSTER_STATE=new ETCD_INITIAL_CLUSTER_TOKEN=etcd-k8-cluster ETCD_LISTEN_PEER_URLS=https://0.0.0.0:2380 ETCD_ADVERTISE_CLIENT_URLS=https://10.10.12.101:2379 ETCD_LISTEN_CLIENT_URLS=https://0.0.0.0:2379 #[proxy] ETCD_PROXY="off" #[security] ETCD_CA_FILE=/etc/etcd/certs/ca.crt ETCD_TRUSTED_CA_FILE=/etc/etcd/certs/ca.crt ETCD_CERT_FILE=/etc/etcd/certs/server.crt ETCD_KEY_FILE=/etc/etcd/certs/server.key ETCD_CLIENT_CERT_AUTH=true ETCD_PEER_CA_FILE=/etc/etcd/certs/ca.crt ETCD_PEER_TRUSTED_CA_FILE=/etc/etcd/certs/ca.crt ETCD_PEER_CERT_FILE=/etc/etcd/certs/peer.crt ETCD_PEER_KEY_FILE=/etc/etcd/certs/peer.key ETCD_PEER_CLIENT_CERT_AUTH=true
initスクリプトのExecStartユニットの方向を置き換えます。
$ mkdir /usr/lib/systemd/system/etcd.service.d
/usr/lib/systemd/system/etcd.service.d/etcd.conf [Service] ExecStart= ExecStart=/usr/bin/etcd
$ chmod -R 644 /usr/lib/systemd/system/etcd.service.d $ chown -R root:root /usr/lib/systemd/system/etcd.service.d $ systemctl daemon-reload
easy-rsaをダウンロード:
$ mkdir /tmp/easyrsa $ cd /tmp/easyrsa $ curl -sSL -O https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz $ tar xzf easy-rsa.tar.gz $ cd easy-rsa-master/easyrsa3
自己署名証明書を生成します。
$ ./easyrsa --batch init-pki
etcd証明書ディレクトリにコピーします。
$ mkdir /etc/etcd/certs $ cp -p pki/ca.crt /etc/etcd/certs/ca.crt $ cp -p pki/issued/* /etc/etcd/certs/ $ cp -p pki/private/* /etc/etcd/certs/ $ chmod –R 440 /etc/etcd/certs/
etcdを開始します。
$ systemctl enable etcd && systemctl start etcd
etcdにネットワーク構成をロードします。
/tmp/flannel-conf.json { "Network": "172.96.0.0/12", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }
2.フランネルをインストールする
$ yum install flannel-0.7.1
構成を編集します。
/ etc / sysconfig / flanneld # 'cluster.lan' FLANNEL_ETCD="https://c00test01:2379" FLANNEL_ETCD_ENDPOINTS="https://c00test01:2379" FLANNEL_ETCD_KEY="/cluster.lan/network" FLANNEL_ETCD_PREFIX="/cluster.lan/network" FLANNEL_ETCD_CAFILE="/etc/flanneld/certs/ca.crt" FLANNEL_ETCD_CERTFILE="/etc/flanneld/certs/client.crt" FLANNEL_ETCD_KEYFILE="/etc/flanneld/certs/client.key" FLANNEL_OPTIONS="-etcd-cafile /etc/flanneld/certs/ca.crt -etcd-certfile /etc/flanneld/certs/client.crt -etcd-keyfile /etc/flanneld/certs/client.key"
証明書をコピーします。
$ mkdir –R /etc/flanneld/certs $ cp /etc/etcd/certs/ca.pem /etc/flanneld/certs/ca.crt $ cp /etc/etcd/certs/client.crt /etc/flanneld/certs/client.crt $ cp /etc/etcd/certs/client.key /etc/flanneld/certs/client.key $ chmod –R 440 /etc/flanneld/certs/
フランネルの開始:
$ systemctl enable flanneld && systemctl start flannel
3. Dockerをインストールして実行する
$ yum install docker-1.12.6 $ systemctl enable docker && systemctl start docker
Kubernetes自体のインストール/構成に進みます
4. apiserverをインストールします
すぐに使用できるRPM
をここからインストール
します 。
$ mkdir /tmp/k8s $ cd /tmp/k8s $ rpms=(kubernetes-master kubernetes-client kubernetes-node) $ for i in ${rpms[*]}; do wget https://kojipkgs.fedoraproject.org/packages/kubernetes/1.8.1/1.fc28/x86_64/${i}-1.8.1-1.fc28.x86_64.rpm; done $ yum install kubernetes-master-1.8.1-1.fc28.x86_64.rpm kubernetes-client-1.8.1-1.fc28.x86_64.rpm kubernetes-node-1.8.1-1.fc28.x86_64.rpm
証明書を生成します:
$ cd /tmp/easyrsa $ ./easyrsa --batch init-pki
それらをkubernetesディレクトリにコピーします。
$ cp -p pki/ca.crt /etc/kubernetes/certs/ca.crt $ cp -p pki/issued/* /etc/kubernetes/certs/ $ cp -p pki/private/* /etc/kubernetes/certs/ $ chown –R kube:kube /etc/kubernetes/certs/ $ chmod –R 440 /etc/kubernetes/certs/
etcd証明書をkubernetesディレクトリにコピーします。
$ mkdir /etc/kubernetes/certs/etcd $ cd /etc/etcd/certs $ cp ca.crt /etc/kubecnetes/certs/etcd/ca.crt $ cp client.crt /etc/kubecnetes/certs/etcd/client.crt $ cp client.key /etc/kubecnetes/certs/etcd/client.key
すべての接続設定が* .kubeconfigファイルで指定されるため、/ etc / kubernetes / configを削除します。
rm /etc/kubernetes/config
構成を編集します。
/ etc / kubernetes / apiserver KUBE_API_ADDRESS="--bind-address=0.0.0.0" KUBE_API_PORT="--secure-port=6443" # KUBELET_PORT="--kubelet-port=10250" KUBE_ETCD_SERVERS="--etcd-servers=https://c00test01:2379 --etcd-cafile=/etc/kubernetes/certs/etcd/ca.crt --etcd-certfile=/etc/kubernetes/certs/etcd/client.crt --etcd-keyfile=/etc/kubernetes/certs/etcd/client.key" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=172.30.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,PersistentVolumeLabel,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota" KUBE_API_ARGS="--tls-cert-file=/etc/kubernetes/certs/server.crt \ --tls-private-key-file=/etc/kubernetes/certs/server.key \ --tls-ca-file=/etc/kubernetes/certs/ca.crt \ --client-ca-file=/etc/kubernetes/certs/ca.crt \ --kubelet-certificate-authority=/etc/kubernetes/certs/ca.crt \ --kubelet-client-certificate=/etc/kubernetes/certs/apiserver-kubelet-client.crt \ --kubelet-client-key=/etc/kubernetes/certs/apiserver-kubelet-client.key \ --token-auth-file=/etc/kubernetes/tokens/known_tokens.csv \ --service-account-key-file=/etc/kubernetes/certs/server.crt \ --bind-address=0.0.0.0 \ --insecure-port=0 \ --apiserver-count=1 \ --basic-auth-file=/etc/kubernetes/certs/basic.cnf \ --anonymous-auth=false \ --allow-privileged=true"
トークン用のディレクトリとその中に空のファイルを作成します。
$ mkdir /etc/kubernetes/tokens $ touch /etc/kubernetes/tokens/known_tokens.csv
apiserverが特権ポートを「バインド」できるようにします。
$ setcap cap_net_bind_service=ep /usr/bin/kube-apiserver
基本認証用のファイルを作成します。
$ touch /etc/kubernetes/certs/basic.cnf
ルールによって満たされる:ユーザー名、パスワード、ID
id-任意の一意の番号
例:
/etc/kubernetes/certs/basic.cnf admin,password,001 deploy,deploy,002
基本認証なしで実行できますが、
ansibleを使用してクラスターにデプロイする場合のように、使用する必要がある場合があります。
トークンを生成します。 トークンはすべてのkubeletとkube-proxyで同じであることに注意してください。 別のものを生成するには、アカウント名に-<hostname>を追加するだけです。 (例:システム:kubelet-c00test02)
api-serverを開始します。
$ systemctl enable kube-apiserver && systemctl start kube-apiserver
controller-managerを構成します。
設定を編集します。
/ etc / kubernetes / controller-manager KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/controller-manager.kubeconfig \ --service-account-private-key-file=/etc/kubernetes/certs/server.key \ --root-ca-file=/etc/kubernetes/certs/ca.crt "
/etc/kubernetes/controller-manager.kubeconfig # 'cluster.lan' apiVersion: v1 kind: Config current-context: controller-manager-to-cluster.lan preferences: {} clusters: - cluster: certificate-authority: /etc/kubernetes/certs/ca.crt server: https://c00test01:6443 name: cluster.lan contexts: - context: cluster: cluster.lan user: controller-manager name: controller-manager-to-cluster.lan users: - name: controller-manager user: # token /etc/kubernetes/tokens/system:controller-manager.token token: cW6ha9WHzTK9Y4psT9pMKcUqfr673ydF
controller-managerを開始します。
$ systemctl enable kube-controller-manager && systemctl start kube-controller-manager
kube-schedulerを構成します。
設定を編集します。
/ etc / kubernetes /スケジューラー KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/scheduler.kubeconfig"
/etc/kubernetes/scheduler.kubeconfig # 'cluster.lan' apiVersion: v1 kind: Config current-context: scheduler-to-cluster.lan preferences: {} clusters: - cluster: certificate-authority: /etc/kubernetes/certs/ca.crt server: https://c00test01:6443 name: cluster.lan contexts: - context: cluster: cluster.lan user: scheduler name: scheduler-to-cluster.lan users: - name: scheduler user: # token /etc/kubernetes/tokens/system:scheduler.token token: A2cU20Q9MkzdK8ON6UnVaP1nusWNKrWT
kube-schedulerを開始します。
$ systemctl enable kube-scheduler && systemctl start kube-scheduler
kubectlを構成します。
構成を編集します。
/etc/kubernetes/kubectl.kubeconfig # 'cluster.lan' apiVersion: v1 kind: Config current-context: kubectl-to-cluster.lan preferences: {} clusters: - cluster: certificate-authority: /etc/kubernetes/certs/ca.crt server: https://c00test01:6443 name: cluster.lan contexts: - context: cluster: cluster.lan user: kubectl name: kubectl-to-cluster.lan users: - name: kubectl user: client-certificate: /etc/kubernetes/certs/kubectl.crt client-key: /etc/kubernetes/certs/kubectl.key
便宜上、kubectlが呼び出されたときに、–kubeconfigパラメーターで構成の前に場所を指定しないでください。ユーザーのハムスターに.kubeディレクトリーを作成し、そこにconfigに名前を変更してkubectl構成をコピーできます
例:
/home/user1/.kube/config
kube-dnsをインストールします。
kube-dnsレプリケーションコントローラーを展開する $ cat <<EOF | kubectl create –f – apiVersion: v1 kind: ReplicationController metadata: name: kube-dns-v20 namespace: kube-system labels: k8s-app: kube-dns version: v20 kubernetes.io/cluster-service: "true" spec: replicas: 1 selector: k8s-app: kube-dns version: v20 template: metadata: labels: k8s-app: kube-dns version: v20 spec:
kube-dnsサービスを展開する $ cat <<EOF | kubectl create –f – apiVersion: v1 kind: Service metadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns kubernetes.io/cluster-service: "true" kubernetes.io/name: "KubeDNS" spec: selector: k8s-app: kube-dns
ウィザードのインストールが完了しました。 ただし、ポッドのステータスを見ると、kube-dnsが保留中ステータスにあることがわかります。 これは、Kubernetesがポッドを配置するミネネを設定するまでです。
minienの場合は、手順2と3を実行する必要があります(フランネルとドッカーをインストールします)。
5. kubeletをインストールして構成する
すべてがc00test01ノードにすでにインストールされていますが、パッケージをc00test02ノードにインストールする必要があります。
$ mkdir /tmp/k8s $ cd /tmp/k8s $ rpms=(kubernetes-client kubernetes-node);for i in ${rpms[*]}; do wget https://kojipkgs.fedoraproject.org/packages/kubernetes/1.8.1/1.fc28/x86_64/${i}-1.8.1-1.fc28.x86_64.rpm; done $ yum install kubernetes-client-1.8.1-1.fc28.x86_64.rpm kubernetes-node-1.8.1-1.fc28.x86_64.rpm
また、マスターノードから/ etc / kubernetes / certsディレクトリに証明書とキーをコピーする必要があります。
kubelet.crt
kubelet.key
apiserver-kubelet-client.crt
apiserver-kubelet-client.key
設定を編集します。
/ etc / kubernetes / kubelet KUBELET_ADDRESS="--address=0.0.0.0" # KUBELET_PORT="--port=10250" KUBELET_HOSTNAME="--hostname-override=c00test02" KUBELET_ARGS="--register-node=true \ --tls-cert-file=/etc/kubernetes/certs/apiserver-kubelet-client.crt \ --tls-private-key-file=/etc/kubernetes/certs/apiserver-kubelet-client.key \ --require-kubeconfig=true \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --pod-manifest-path=/etc/kubernetes/manifests \ --cgroup-driver=systemd \ --allow-privileged=true \ --cluster-domain=cluster.lan \ --authorization-mode=Webhook \ --fail-swap-on=false \ --cluster-dns=172.30.0.10"
ウィザードからca.crtの内容を取得します。
$ base64 /etc/kubernetes/certs/ca.crt
/etc/kubernetes/kubelet.kubeconfig apiVersion: v1 kind: Config current-context: kubelet-to-cluster.lan # change 'cluster.lan to your cluster name' preferences: {} clusters: - cluster: certificate-authority-data: <_ca.crt__base64> server: https://c00test01:6443 name: cluster.lan # change 'cluster.lan to your cluster name' contexts: - context: cluster: cluster.lan # change 'cluster.lan to your cluster name' user: kubelet name: kubelet-to-cluster.lan # change 'cluster.lan to your cluster name' users: - name: kubelet user: client-certificate: /etc/kubernetes/certs/kubelet.crt client-key: /etc/kubernetes/certs/kubelet.key
/ etc / kubernetes /プロキシ<source lang = "basic>
KUBE_PROXY_ARGS = "-kubeconfig = / etc / kubernetes / proxy.kubeconfig --cluster-cidr = 172.30.0.0 / 16"
/etc/kubernetes/proxy.kubeconfig apiVersion: v1 kind: Config current-context: proxy-to-cluster.lan # change 'cluster.lan to your cluster name' preferences: {} contexts: - context: cluster: cluster.lan # change 'cluster.lan to your cluster name' user: proxy name: proxy-to-cluster.lan # change 'cluster.lan to your cluster name' clusters: - cluster: certificate-authority-data: <_ca.crt__base64> server: https://c00test01:6443 name: cluster.lan # change 'cluster.lan to your cluster name' users: - name: proxy user: client-certificate: /etc/kubernetes/certs/kubelet.crt client-key: /etc/kubernetes/certs/kubelet.key
kubeletとkube-proxyを開始します。
$ systemctl enable kubelet && systemctl enable kube-proxy $ systemctl start kubelet && systemctl start kube-proxy
インストールが完了したら、kube-dnのノードとポッドのステータスを確認できます。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION c00test01 Ready master 5m v1.8.1 c00test02 Ready <none> 4m v1.8.1
$ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kube-dns-v20-2jqsj 3/3 Running 0 3m
このガイドを作成するとき、次の資料が使用されました。
→
公式ドキュメント→
Kubernetes Ansible