yoshiislandblog.net
元営業の駆け出しアラサーSEが、休日にMACと戯れた際の殴り書きメモ。日々勉強。日々進歩。

この記事は3年以上前に書かれた記事で内容が古い可能性があります

Kubernetes超入門(Vagrant・CentOS7)〜(2)マスターサーバ設定〜

2019-10-15

マスターサーバの設定

Kubernetes超入門(Vagrant・CentOS7)〜(1)環境づくり〜の続き

先ほど作成したマスターサーバ「kubemaster」の設定をしていく

マスターサーバにログイン

% vagrant ssh kubemaster
Last login: Mon Oct 14 06:29:15 2019 from 10.0.2.2
[vagrant@localhost ~]$
[vagrant@localhost ~]$ sudo su
[root@localhost vagrant]#

必要なものをインストール

ざっくりしか理解していないが
etcdは設定情報を複数サーバで共有するもの
flannelはサーバ間のネットワーク通信を可能にするもの

# yum -y install etcd kubernetes flannel

インストールできているか確認

# yum list installed | grep -e etcd -e kubernetes -e flannel
Failed to set locale, defaulting to C
etcd.x86_64                        3.3.11-2.el7.centos                 @extras
flannel.x86_64                     0.7.1-4.el7                         @extras
kubernetes.x86_64                  1.5.2-0.7.git269f928.el7            @extras
kubernetes-client.x86_64           1.5.2-0.7.git269f928.el7            @extras
kubernetes-master.x86_64           1.5.2-0.7.git269f928.el7            @extras
kubernetes-node.x86_64             1.5.2-0.7.git269f928.el7            @extras

etcdの設定

etcdの設定をする

設定ファイルは「/etc/etcd/etcd.conf」
「ETCD_LISTEN_CLIENT_URLS」の値を変更する

# cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.backup
# vi /etc/etcd/etcd.conf
# diff /etc/etcd/etcd.conf /etc/etcd/etcd.conf.backup
6c6
< ETCD_LISTEN_CLIENT_URLS="http://192.168.33.10:2379,http://localhost:2379"
---
> ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"

設定できたので、etcdサービスを起動する

# systemctl start etcd

flannelの設定

flannelの設定をしていく
ノード間のネットワーク設定をするということ

「/etc/sysconfig/flanneld」の「FLANNEL_ETCD_PREFIX」の値を確認しておく

# cat /etc/sysconfig/flanneld
# Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://127.0.0.1:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""

先ほど確認した「/atomic.io/network」のkeyを設定しにいく

# etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'
{"Network":"172.17.0.0/16"}

設定されたか確認

# etcdctl ls
/coreos.com
/atomic.io
# etcdctl get /atomic.io/network/config
{"Network":"172.17.0.0/16"}

設定できたのでflannelを起動

# systemctl start flanneld

kubernetesの設定

一旦「/etc/kubernetes/」配下の設定ファイルを確認する

# ls /etc/kubernetes/
apiserver  config  controller-manager  kubelet  proxy  scheduler

「apiserver」は、文字通りapiを提供しているサービス。Kubernetesを操作するために必要なサービス
「controller-manager」は、コントローラたちを管理するサービス。コントローラはリソースがうまいこと使われるように管理するもの、とざっくり理解
「kubelet」はpodの状態を管理するサービス。マスターサーバでは使わないので今回は起動しない
「proxy」はノードのルーティングを管理するサービス
「scheduler」は、podをどのノードで起動するかなどを決めるサービス

ここでやることは
鍵を作成して「apiserver」「controller-manager」「config」に鍵の場所に付いて設定を追加すること

まずは鍵の作成

# openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048

「/etc/kubernetes/apiserver」の設定変更
「KUBE_API_ADDRESS」「KUBE_API_ARGS」に設定追加

# cp /etc/kubernetes/apiserver /etc/kubernetes/apiserver.backup
# vi /etc/kubernetes/apiserver
# diff /etc/kubernetes/apiserver /etc/kubernetes/apiserver.backup
8c8
< KUBE_API_ADDRESS="--insecure-bind-address=192.168.33.10"
---
> KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
26c26
< KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/serviceaccount.key"
---
> KUBE_API_ARGS=""

「/etc/kubernetes/controller-manager」の設定変更
「KUBE_CONTROLLER_MANAGER_ARGS」に設定追加

# cp /etc/kubernetes/controller-manager /etc/kubernetes/controller-manager.backup
# vi /etc/kubernetes/controller-manager
# diff /etc/kubernetes/controller-manager /etc/kubernetes/controller-manager.backup
7c7
< KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/serviceaccount.key"
---
> KUBE_CONTROLLER_MANAGER_ARGS=""

「/etc/kubernetes/config」の設定変更
「KUBE_MASTER」に設定追加

# cp /etc/kubernetes/config /etc/kubernetes/config.backup
# vi /etc/kubernetes/config
# diff /etc/kubernetes/config /etc/kubernetes/config.backup
22c22
< KUBE_MASTER="--master=http://192.168.33.10:8080"
---
> KUBE_MASTER="--master=http://127.0.0.1:8080"

設定ができたので起動していく

# systemctl start kube-apiserver
# systemctl start kube-controller-manager
# systemctl start kube-scheduler
# systemctl start kube-proxy

kubectlの設定

「kubectl」はkubernetesを操作するためのコマンドツール
これが先ほど起動した「kube-apiserver」経由でapiを叩きにいく

コマンドを打つユーザーや場所で設定をする
必ずしもマスターサーバでなくても良いが、今回はマスターサーバで設定する
ユーザーはvagrantユーザーで設定してみる
※環境に合わせて設定ください

まずはvagrantユーザーに移動

[root@localhost vagrant]# exit
exit
[vagrant@localhost ~]$
[vagrant@localhost ~]$ whoami
vagrant
[vagrant@localhost ~]$

設定していく

$ kubectl config set-credentials myself --username=admin --password=vagrant
User "myself" set.
$ kubectl config set-cluster local-server --server=http://192.168.33.10:8080
Cluster "local-server" set.
$ kubectl config set-context default-context --cluster=local-server --user=myself
Context "default-context" set.
$ kubectl config use-context default-context
Switched to context "default-context".
$ kubectl config set contexts.default-context.namespace default
Property "contexts.default-context.namespace" set.

kubectlコマンドが打てるか確認

$ kubectl cluster-info
Kubernetes master is running at http://192.168.33.10:8080

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

うまくいった

SSL/TLS証明書の設定

いまいちなぜ必要か理解していないが、
ここでSSL/TLS証明書の設定が必要らしいので淡々と設定していく

$ sudo mkdir -p /etc/kubernetes/ca
$ cd /etc/kubernetes/ca

独自証明書作成(「ca.key」「ca.crt」)

$ sudo openssl genrsa -out ca.key 2048
$ sudo openssl req -x509 -new -nodes -key ca.key -subj "/CN=192.168.33.10 " -days 10000 -out ca.crt

サーバー鍵作成(「server.key」)

$ sudo openssl genrsa -out server.key 2048

KubernetesサービスIPアドレス確認

$ kubectl get svc
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.254.0.1   <none>        443/TCP   15m

csr.confファイル作成(新規作成)

$ sudo vi csr.conf
$ cat csr.conf
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = JP
ST = dummy
L = dummy
O = dummy
OU = dummy
CN = 192.168.33.10

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
IP.1 = 192.168.33.10
IP.2 = 10.254.0.1

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names

サーバー証明書の署名リクエストファイルを作成(「server.csr」)

$ sudo openssl req -new -key server.key -out server.csr -config csr.conf

サーバー証明書を作成(「server.csr」)

$ sudo openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000 -extensions v3_ext -extfile csr.conf
Signature ok
subject=/C=JP/ST=dummy/L=dummy/O=dummy/OU=dummy/CN=192.168.33.10
Getting CA Private Key

証明書が作成できたので、
「apiserver」「controller-manager」の設定ファイルに場所を教えてあげる

「/etc/kubernetes/apiserver」の「KUBE_API_ARGS」を変更
※「KUBE_API_ADDRESS」は変更済み

$ sudo vi /etc/kubernetes/apiserver
$ diff /etc/kubernetes/apiserver /etc/kubernetes/apiserver.backup
8c8
&lt; KUBE_API_ADDRESS=&quot;--insecure-bind-address=192.168.33.10&quot;
---
> KUBE_API_ADDRESS=&quot;--insecure-bind-address=127.0.0.1&quot;
26,29c26
&lt; KUBE_API_ARGS=&quot;--client-ca-file=/etc/kubernetes/ca/ca.crt \
&lt; --tls-cert-file=/etc/kubernetes/ca/server.crt \
&lt; --tls-private-key-file=/etc/kubernetes/ca/server.key \
&lt; --service-account-key-file=/etc/kubernetes/serviceaccount.key&quot;
---
> KUBE_API_ARGS=&quot;&quot;

「/etc/kubernetes/controller-manager」の「KUBE_CONTROLLER_MANAGER_ARGS」を変更

$ sudo vi /etc/kubernetes/controller-manager
$ diff /etc/kubernetes/controller-manager /etc/kubernetes/controller-manager.backup
7,9c7
&lt; KUBE_CONTROLLER_MANAGER_ARGS=&quot;--service-account-private-key-file=/etc/kubernetes/serviceaccount.key \
&lt; --root-ca-file=/etc/kubernetes/ca/ca.crt \
&lt; --cluster-signing-cert-file=/etc/kubernetes/ca/ca.crt&quot;
---
> KUBE_CONTROLLER_MANAGER_ARGS=&quot;&quot;

マスターサーバの設定はここまで
次はコンテナ稼働ノードの設定をするので、マスターサーバからログアウトしておく

$ exit
logout
Connection to 127.0.0.1 closed.

続きはKubernetes超入門(Vagrant・CentOS7)〜(3)ノード設定〜