阿里云サーバー上でkubeadmを使用したk8sクラスタ構築

この記事は、B站のUP主「尚硅谷」によるKubernetes(k8s)講義動画に基づく学習内容のまとめです:https://www.bilibili.com/video/BV1w4411y7Go

阿里云サーバー上でのk8sクラスタ構築

このチュートリアルでは、初心者向けにシンプルな1マスター2スレーブ構成のクラスタを構築します。これはk8sの完全な機能を体験するには不十分ですが、学習初期段階では適切なスタート地点となります。

阿里云サーバーの購入

3台の阿里云サーバーを購入します。料金は従量課金方式で、停止時に料金は発生しません(再起動後もクラスタ構造は保持されます)。

購入リンク:https://ecs-buy.aliyun.com/wizard

サーバー選択

  • 従量課金方式を選択
  • 最近の地域を選択
  • 突然変異性能インスタンス t6 (ecs.t6-c1m1.large) を選択(初期設定として使用)
  • 数量:3台
  • システムイメージ:64ビットCentOS 8.0(Dockerインストール要件:CentOS 7.0以上)
  • ディスク:40GB

月間費用は¥0.413/時です。

ネットワークとセキュリティグループ

  • ネットワーク:デフォルト選択
  • 帯域幅料金:トラフィック使用量に応じて課金(例:40Mbps)

システム設定

  • ログイン認証:カスタムパスワード

グループ設定

  • デフォルト設定

サーバー初期設定(全3台)

管理の便宜上、インスタンス名を以下の通り変更:k8s-master01-225/k8s-node01-228/k8s-node02-229

ホスト名の変更

# マスター
hostnamectl set-hostname k8s-master01-225
# スレーブ1
hostnamectl set-hostname k8s-node01-228
# スレーブ2
hostnamectl set-hostname k8s-node02-229

/etc/hostsファイルの編集

172.19.199.225 k8s-master01-225
172.19.188.228 k8s-node01-228
172.19.188.229 k8s-node02-229

依存パッケージのインストール

yum install -y conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

ファイアウォールの無効化

systemctl stop firewalld && systemctl disable firewalld

Iptablesルールの初期化

yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

スワップ領域の無効化

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

SELinuxの無効化

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

カーネルパラメータの調整

cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
</code>

システムタイムゾーンの設定

timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 0
systemctl restart rsyslog
systemctl restart crond

不要サービスの停止

systemctl stop postfix && systemctl disable postfix

ログシステムの設定

mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d

cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog=no
EOF

systemctl restart systemd-journald
</code>

kube-proxyのipvs前提条件

modprobe br_netfilter

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
</code>

Dockerのインストール

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
yum update -y && yum install -y docker-ce
docker --version

mkdir /etc/docker

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https:xxxxx"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  }
}
EOF

mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
</code>

kubeadmのインストール(マスターとスレーブ)

kubeadmのダウンロード

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubelet kubeadm kubectl
systemctl enable --now kubelet

必須コンテナイメージのダウンロード

kubeadm config images list

国内環境ではこれらのイメージを直接取得できないため、別途取得する必要があります。

set -o errexit
set -o nounset
set -o pipefail

KUBE_VERSION=v1.18.6
KUBE_PAUSE_VERSION=3.2
ETCD_VERSION=3.4.3-0
DNS_VERSION=1.6.7

GCR_URL=k8s.gcr.io
DOCKERHUB_URL=gotok8s

images=(
kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${DNS_VERSION}
)

for imageName in ${images[@]} ; do
  docker pull $DOCKERHUB_URL/$imageName
  docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
  docker rmi $DOCKERHUB_URL/$imageName
done

マスターノードの初期化

初期化設定ファイルの生成

kubeadm config print init-defaults > kubeadm-config.yaml

初期化設定ファイルの編集

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 172.19.199.225
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master01-225
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.18.6
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

初期化コマンドの実行

kubeadm init --config=kubeadm-config.yaml | tee kubeadm-init.log

初期化失敗時の対処

kubeadm reset

Flannelネットワークの導入

mkdir -p install-k8s/core
mv kubeadm-init.log kubeadm-config.yaml install-k8s/core
cd install-k8s
mkdir plugin
cd plugin/
mkdir flannel
cd flannel/
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl create -f kube-flannel.yml

スレーブノードの追加

kubeadm join 172.19.199.225:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:23816230102e09bf09766f14896828f7b377d0b3aa44e619342cbdf47ccd37b5

PodのIPアクセス問題の解決

iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat

プライベートレジストリHarborの導入

前提条件

  • Python 2.7以上
  • Docker 1.10以上
  • Docker Compose 1.6.0以上

Docker Composeのインストール

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Harborのダウンロードと展開

wget https://github.com/goharbor/harbor/releases/download/v1.10.4/harbor-offline-installer-v1.10.4.tgz
tar xvf harbor-offline-installer-v1.10.4.tgz -C /usr/local/
cd /usr/local/
mv harbor/ harbor-v1.10.4
ln -s /usr/local/harbor-v1.10.4/ /usr/local/harbor

設定ファイルの編集

hostname: alex.gcx.com
http:
  port: 8002
# https:
#   port: 443
#   certificate: /data/cert/server.crt
#   private_key: /data/cert/server.key
harbor_admin_password: your_password
data_volume: /data/harbor
location: /data/harbor/logs

HTTPS証明書の生成(任意)

openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
cp server.key server.key.back
openssl rsa -in server.key -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
mkdir -p /data/cert
mv server.* /data/cert/
chmod -R 777 /data/cert

Harborのインストール

sh /usr/local/harbor/install.sh

Harborへのアクセス

URL: http://alex.gcx.com:8002

DockerからのHarborへのログイン

vim /etc/docker/daemon.json
"insecure-registries": ["https://alex.gcx.com"]
systemctl restart docker

Harborの管理

docker-compose down -v
vim harbor.yml
docker-compose up -d

タグ: Kubernetes kubeadm Docker 阿里云 Harbor

6月7日 22:34 投稿