Kubernetesの構築

NHNテコラス様が提供されているCloudGarage「開発者向けインスタンス無償提供制度」に通ってしまいました。ちょっとばっかしどうしようかな、と持て余しているスタッフがいます。こんばんわ、Web担当 神凪です。
通ったことは素直にうれしいのですけれど、期間限定ということもあってNCEの本番環境を移設するわけにもいかず。ちょっとどうしようかしら? 少し弱気です。
さて今回はCloudGarageでのKubernetesの構築をメモします。Docker関連はあまり設定したことがないため、メモレベルになりますが記録していきますね。

環境

今回の環境は以下のとおりです。

  • サーバ1: Kubernetes Master & Node1
  • サーバ2: Kubernetes Node2
  • サーバ3: Kubernetes Node3

準備

設定手順

共通設定

Kubernetesをインストールするためのrepoを追加します。
これはすべてのサーバで行います。

cat << EOT > /etc/yum.repos.d/virt7-docker-common-release.repo
[virt7-docker-common-release]
name=virt7-docker-common-release
baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/
gpgcheck=0
EOT
yum -y install --enablerepo=virt7-docker-common-release kubernetes flannel

Kubernetesは内部で通信できる必要があるため、hostsに記述してhost名で通信できるようにしておきます。

echo "192.168.0.1  nccgkbn01
192.168.0.2  nccgkbn02
192.168.0.3  nccgkbn03" >> /etc/hosts

Kubernetes 共通設定

Kubernetes共通の設定です。
すべてのサーバで行います。

[/etc/kubernetes/config]
# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://nccgkbn01:2379"

# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://nccgkbn01:8080"

Master側設定

Master側に追加する設定です。

まずは必要になるwgetとetcdをインストール。

yum install wget etcd -y

Kubernetesの設定を追加していきます。

[/etc/kubernetes/apiserver]
# The address on the local server to listen to.
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

# The port on the local server to listen on.
# KUBE_API_PORT="--port=8080"

# Port minions listen on
# KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
#KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

# Add your own!
KUBE_API_ARGS=""

続いてetcdの設定。

[/etc/etcd/etcd.conf]
(...)
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
(...)
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
(...)

flanneldの設定も行います。

[/etc/sysconfig/flanneld]
# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://nccgkbn01:2379"

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

設定が終わったら、etcdを起動してネットワーク設定を行います。

systemctl start etcd
etcdctl mkdir /nce-kubernetes/network
etcdctl mk /nce-kubernetes/network/config '{ "Network": "172.30.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }'

必要なすべてのサービスを再起動し、有効化していきます。

for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do
  systemctl restart $SERVICES
  systemctl enable $SERVICES
  systemctl status $SERVICES
done

以上でMaster側は設定完了です。

Node設定

続いてNode側も設定を行っていきます。

まずは肝心かなめのDockerをインストール。
そしてKubernetesの設定です。

yum install -y docker

[/etc/kubernetes/kubelet]
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"

# The port for the info server to serve on
# KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=nccgkbn0[1-3]"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://nccgkbn01:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS=""

flanneldの設定

[/etc/sysconfig/flanneld]
# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://nccgkbn01:2379"

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

設定完了ですので、各種サービスを起動・有効化します。

for SERVICES in kube-proxy kubelet flanneld docker; do
  systemctl restart $SERVICES
  systemctl enable $SERVICES
  systemctl status $SERVICES
done

kubernetesからクラスターを構築します。

kubectl config set-cluster default-cluster --server=http://nccgkbn01:8080
kubectl config set-context default-context --cluster=default-cluster --user=default-admin
kubectl config use-context default-context

以上でNodeの設定が完了。

動作確認

master側で操作・確認します。

kubectl get nodes
kubectl describe nodes
cat << EOT > nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx-container
    image: nginx
    ports:
    - containerPort: 80
EOT
kubectl create -f nginx-pod.yaml
kubectl get pods -o wide

これでNodeのどこかにnginxコンテナが展開されていることが確認できるはずです。
コンテナの削除はkubectl delete pods nginx-podで可能です。

如何でしたか?
システム上、外部ストレージがないとちょっと厳しいかなと思うことが多々ありました。
開発環境ならともかく、常用サービスでdockerコンテナは厳しいのかな? 要研究です。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください