Ubuntu 16.04 上構築する Kubernetes v1.11.2 クラスタ

ノード構成

役割ホスト名IPアドレス
Masterk8s-5510.2.49.55
Workerk8s-5410.2.49.54
Workerk8s-5310.2.49.53
Workerk8s-5210.2.49.52

Kubernetes パッケージのインストール

まず、Kubernetes の APT リポジトリを追加します(中国国内向けに Alibaba Cloud ミラーを使用):

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes-archive-keyring.gpg
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update

次に、v1.11.2 を明示的にインストールします:

sudo apt-get install -y kubelet=1.11.2-00 kubeadm=1.11.2-00 kubectl=1.11.2-00
sudo apt-mark hold kubelet kubeadm kubectl

Docker のインストール

Kubernetes v1.11.2 と互換性のある Docker バージョンは 17.03.x です。Alibaba Cloud ミラーからインストールします:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce=17.03.3~ce-0~ubuntu-xenial
sudo systemctl enable docker

必要なコンテナイメージの事前取得

Google Container Registry (gcr.io) へのアクセスが制限されているため、代替レジストリからイメージを取得し、タグを再設定します。

#!/bin/bash
K8S_VERSION="v1.11.2"
PAUSE_VERSION="3.1"
ETCD_VERSION="3.2.18"
COREDNS_VERSION="1.1.3"
REPO_PREFIX="anjia0532/google-containers"

IMAGES=(
  "kube-proxy-amd64:${K8S_VERSION}"
  "kube-scheduler-amd64:${K8S_VERSION}"
  "kube-controller-manager-amd64:${K8S_VERSION}"
  "kube-apiserver-amd64:${K8S_VERSION}"
  "pause:${PAUSE_VERSION}"
  "etcd-amd64:${ETCD_VERSION}"
  "coredns:${COREDNS_VERSION}"
)

for image in "${IMAGES[@]}"; do
  if [[ "$image" == *"coredns"* ]]; then
    docker pull anjia0532/coredns:${COREDNS_VERSION}
    docker tag anjia0532/coredns:${COREDNS_VERSION} k8s.gcr.io/coredns:${COREDNS_VERSION}
    docker rmi anjia0532/coredns:${COREDNS_VERSION}
  else
    full_image="${REPO_PREFIX}.${image}"
    docker pull "${full_image}"
    new_tag="k8s.gcr.io/${image#*.}"
    docker tag "${full_image}" "${new_tag}"
    docker rmi "${full_image}"
  fi
done

# イメージ名の正規化(google-containers. 削除)
docker tag k8s.gcr.io/google-containers.kube-apiserver-amd64:${K8S_VERSION} k8s.gcr.io/kube-apiserver-amd64:${K8S_VERSION}
docker rmi k8s.gcr.io/google-containers.kube-apiserver-amd64:${K8S_VERSION}
docker tag k8s.gcr.io/google-containers.kube-controller-manager-amd64:${K8S_VERSION} k8s.gcr.io/kube-controller-manager-amd64:${K8S_VERSION}
docker rmi k8s.gcr.io/google-containers.kube-controller-manager-amd64:${K8S_VERSION}
docker tag k8s.gcr.io/google-containers.kube-scheduler-amd64:${K8S_VERSION} k8s.gcr.io/kube-scheduler-amd64:${K8S_VERSION}
docker rmi k8s.gcr.io/google-containers.kube-scheduler-amd64:${K8S_VERSION}
docker tag k8s.gcr.io/google-containers.kube-proxy-amd64:${K8S_VERSION} k8s.gcr.io/kube-proxy-amd64:${K8S_VERSION}
docker rmi k8s.gcr.io/google-containers.kube-proxy-amd64:${K8S_VERSION}

クラスタ初期化

Master ノードで以下のコマンドを実行してクラスタを初期化します:

sudo kubeadm init \
  --kubernetes-version=v1.11.2 \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=10.2.49.55

成功すると、以下のような出力が表示され、ワーカーノードの参加コマンドが提供されます。

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run (as a regular user):

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.2.49.55:6443 --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

ローカルユーザーで kubectl を使用できるように設定します:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Flannel CNI のデプロイ

Pod 間通信のため Flannel を導入します:

wget https://raw.githubusercontent.com/flannel-io/flannel/v0.10.0/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

Flannel が使用するイメージ quay.io/coreos/flannel:v0.10.0-amd64 が自動的にプルされます。必要に応じて手動で取得可能です。

ワーカーノードの参加

各ワーカーノードで、初期化時に表示された kubeadm join コマンドを実行します:

sudo kubeadm join 10.2.49.55:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

また、IPVS モジュールを有効にしてパフォーマンスを向上させることも推奨されます:

sudo modprobe ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh

クラスタ状態の確認

Master ノードで以下のコマンドを実行し、全ノードが Ready 状態であることを確認します:

kubectl get nodes
kubectl get pods --all-namespaces

すべての Pod が正常に起動していれば、Kubernetes クラスタの構築は完了です。

タグ: Kubernetes kubeadm Docker flannel Ubuntu

5月19日 15:44 投稿