ノード構成
| 役割 | ホスト名 | IPアドレス |
|---|---|---|
| Master | k8s-55 | 10.2.49.55 |
| Worker | k8s-54 | 10.2.49.54 |
| Worker | k8s-53 | 10.2.49.53 |
| Worker | k8s-52 | 10.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 クラスタの構築は完了です。