banner
云野阁

云野阁

闲云野鹤,八方逍遥

高可用性コンテナクラウド構築(k8sクラスター+cephクラスター)

タスク目標#

  1. 高可用 k8s クラスターのインストールとデプロイを完了する

タスクプラットフォーム#

  1. 物理デバイス --
  2. オペレーティングシステム:openEuler 22.03 LTS SP2

デプロイガイド#

クラスターのトポロジー図

image-20240323222825713-1711204108611-3

一:ceph クラスターのデプロイ#

タスク一:設定準備#

  1. ホスト名の変更
# 10.10.1.80のホスト名をfuture-k8s-master0に変更
hostnamectl set-hostname future-k8s-master0 && bash
# 10.10.1.81のホスト名をfuture-k8s-master1に変更
hostnamectl set-hostname future-k8s-master1 && bash
# 10.10.1.82のホスト名をfuture-k8s-master2に変更
hostnamectl set-hostname future-k8s-master2 && bash
# 10.10.1.16のホスト名をk8s-ceph-node0に変更
hostnamectl set-hostname k8s-ceph-node0 && bash
# 10.10.1.17のホスト名をk8s-ceph-node1に変更
hostnamectl set-hostname k8s-ceph-node1 && bash
# 10.10.1.18のホスト名をk8s-ceph-node2に変更
hostnamectl set-hostname k8s-ceph-node2 && bash
# 10.10.1.15のホスト名をk8s-ceph-node2に変更
hostnamectl set-hostname k8s-ceph-node3 && bash
  1. インストール前の設定変更
# ファイアウォールを停止
systemctl stop firewalld
systemctl disable firewalld
firewall-cmd --state
 
# selinuxを永久に無効化
setenforce 0
 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
cat /etc/selinux/config

# swapを永久に無効化
swapoff --all
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
cat /etc/fstab

# hostsを追加
cat >> /etc/hosts << EOF
10.10.1.80 future-k8s-master0
10.10.1.81 future-k8s-master1
10.10.1.82 future-k8s-master2
10.10.1.16 k8s-ceph-node0
10.10.1.17 k8s-ceph-node1
10.10.1.18 k8s-ceph-node2
10.10.1.15 k8s-ceph-node3
10.10.1.83 future-k8s-vip
EOF
#確認
cat /etc/hosts


# ブリッジフィルタとカーネル転送の設定ファイルを追加
cat > /etc/sysctl.d/k8s.conf << EOF
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 net.ipv4.ip_forward = 1
EOF
# 確認
cat /etc/sysctl.d/k8s.conf
# br_netfilterモジュールをロード
modprobe br_netfilter
# ロードされているか確認
lsmod | grep br_netfilter
# ブリッジフィルタとカーネル転送の設定ファイルをロード
sysctl -p /etc/sysctl.d/k8s.conf

# 時間を同期
yum install ntp -y
systemctl start ntpd
systemctl enable ntpd
yum install chrony  -y
systemctl start chronyd
systemctl enable chronyd
# 設定を変更し、内容を追加
echo "
server 10.10.3.70 iburst
allow 10.10.3.0/24
allow 10.10.1.0/24
" >> /etc/chrony.conf
timedatectl set-ntp true
systemctl restart chronyd
timedatectl status
date
  1. ipset と ipvsadm をインストール
 # ipsetとipvsadmをインストール
 yum -y install ipset ipvsadm
 ipvsadmモジュールのロード方法を設定
 # ロードする必要があるモジュールを追加
echo ' #!/bin/bash
 modprobe -- ip_vs
 modprobe -- ip_vs_rr
 modprobe -- ip_vs_wrr
 modprobe -- ip_vs_sh
 modprobe -- nf_conntrack
' > /etc/sysconfig/modules/ipvs.modules
#確認
cat /etc/sysconfig/modules/ipvs.modules
 # 権限を付与し、実行し、ロードされているか確認
chmod 755 /etc/sysconfig/modules/ipvs.modules 
bash /etc/sysconfig/modules/ipvs.modules 
lsmod | grep -e ip_vs -e nf_conntrack

#再起動
reboot

設定準備が完了した後、すべてのノードを再起動する必要があります。

タスク二:python 環境の設定#

python2 をダウンロード

  1. zlibライブラリをインストールしないと pip のインストール時にエラーが発生します(再コンパイルが必要です)
 yum -y install zlib*
  1. GCC パッケージをインストールします。GCC がインストールされていない場合は、以下のコマンドを使用してインストールします。
yum -y install gcc openssl-devel bzip2-devel
  1. Python-2.7.18 をダウンロード
 cd /usr/src
 yum -y install wget tar
 wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
 tar xzf Python-2.7.18.tgz
  1. コンパイル前に、ソースファイル内の Modules/Setup.dist ファイルを修正し、コメントを外します。
sed -i 's/#zlib zlibmodule.c -I$(prefix)/zlib zlibmodule.c -I$(prefix)/'  Python-2.7.18/Modules/Setup.dist
  1. Python-2.7.18 をコンパイルします(make altinstallはデフォルトの python バイナリファイル /usr/bin/python を置き換えないようにします)。
cd /usr/src/Python-2.7.18
./configure --enable-optimizations
yum install -y make
make altinstall

元の Python バイナリファイルを上書きまたはリンクしないでください。これにより、システムが壊れる可能性があります。

  1. 環境変数を設定
echo "
export PYTHON_HOME=/usr/local/
PATH=\$PATH:\$PYTHON_HOME/bin
" >> /etc/profile
cat /etc/profile
source /etc/profile
  1. 方法一:
curl "https://bootstrap.pypa.io/pip/2.7/get-pip.py" -o "get-pip.py"
python2.7 get-pip.py 

ceph をダウンロード

#k8s-ceph-node0でダウンロード
#方法一:pipを使用してダウンロード
pip2 install ceph-deploy
yum install -y ceph ceph-radosgw
#他のノードでダウンロード
yum install -y ceph ceph-radosgw
#インストールパッケージが完全かどうかを確認
rpm -qa |egrep -i "ceph|rados|rbd"

タスク三:ceph クラスターのデプロイ#

  1. admin ノード#

  2. Monitor のデプロイ#
  3. 設定ファイルディレクトリを作成し、設定ファイルを作成

mkdir /etc/ceph/
touch /etc/ceph/ceph.conf
  1. クラスターの FSDI を生成:
uuidgen
30912204-0c26-413f-8e00-6d55c9c0af03
  1. クラスターのためにキーリングを作成し、Monitor サービスのためにキーを作成:
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
  1. 管理者キーリングを作成し、client.admin ユーザーを生成し、このユーザーをキーリングに追加:
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
  1. bootstrap-osd キーリングを作成し、client.bootstrap-osd ユーザーをこのキーリングに追加:
ceph-authtool --create-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd'
  1. 生成されたキーを ceph.mon.keyring に追加します。
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring

ceph-authtool /tmp/ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
  1. ホスト名と IP アドレス、FSID を使用して monitor map を生成:
monmaptool --create --add k8s-ceph-node0 10.10.1.16 --fsid 30912204-0c26-413f-8e00-6d55c9c0af03 /tmp/monmap
  1. mon のディレクトリを作成し、クラスター名-ホスト名の形式を使用:
 mkdir  /var/lib/ceph/mon/ceph-k8s-ceph-node0
  1. 最初の mon デーモンの情報を入力:
ceph-mon --mkfs -i k8s-ceph-node0 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
  1. /etc/ceph/ceph.conf ファイルを設定:
cat /etc/ceph/ceph.conf
################################################
[global]
fsid = 30912204-0c26-413f-8e00-6d55c9c0af03     # 生成されたFSID
mon initial members =k8s-ceph-node0
mon host = 10.10.1.16
public network = 10.10.1.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 333
osd pool default pgp num = 333
osd crush chooseleaf type = 1

################################################
  1. root で操作しているため、権限を ceph に設定する必要があり(systemd の起動ファイルを変更して ceph ユーザーを root に変更することもできます)、Monitor を起動します。
chown  -R ceph:ceph /var/lib/ceph
systemctl start [email protected]
systemctl enable [email protected]
  1. サービスが正常に起動したことを確認:
ceph -s
yum install -y net-tools
netstat -lntp|grep ceph-mon
  1. Manager のデプロイ#

ceph-mon サービスの設定が完了したら、ceph-mgr サービスの設定を行います。

  1. 認証キーを生成します(ceph-mgr はカスタム名):
#10.10.1.16
ceph auth get-or-create mgr.ceph-mgr mon 'allow profile mgr' osd 'allow *' mds 'allow *'
[mgr.ceph-mgr]
        key = AQANDD9lfWg2LBAAHY0mprdbuKFBPJDkE7/I5Q==
        
#10.10.1.17
ceph auth get-or-create mgr.ceph-mgr1 mon 'allow profile mgr' osd 'allow *' mds 'allow *'
[mgr.ceph-mgr1]
        key = AQDbRTZlgjXWBBAAGew4Xta+t9vgIWPCWC8EVg==
  1. このキーを保存するファイルのディレクトリを作成
#10.10.1.16
sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-ceph-mgr
#生成されたキーをこのディレクトリに保存し、keyringと名付ける
vi /var/lib/ceph/mgr/ceph-ceph-mgr/keyring 
[mgr.ceph-mgr]
        key = AQANDD9lfWg2LBAAHY0mprdbuKFBPJDkE7/I5Q==
        
#10.10.1.17
sudo -u ceph mkdir /var/lib/ceph/mgr/ceph-ceph-mgr1
#生成されたキーをこのディレクトリに保存し、keyringと名付ける
vi /var/lib/ceph/mgr/ceph-ceph-mgr1/keyring 
[mgr.ceph-mgr1]
        key = AQDbRTZlgjXWBBAAGew4Xta+t9vgIWPCWC8EVg==
  1. ceph-mgr サービスを起動
ceph-mgr -i ceph-mgr
ceph-mgr -i ceph-mgr1
systemctl enable ceph-mgr@k8s-ceph-node0
systemctl enable ceph-mgr@k8s-ceph-node1
#サービスが起動しているか確認し、cephの状態を確認
ceph -s
#現在のmgrで利用可能なモジュールを確認
ceph mgr module ls
  1. OSD の作成#
ceph-volume lvm create --data /dev/sda8
#現在のlvm論理ボリュームを確認
ceph-volume lvm list
#cephの状態を確認
ceph -s
  1. Ceph-dashboard のインストールと設定#
  2. dashboard 機能を有効にする

ceph mgr module enable dashboard
  1. 証明書を作成
ceph dashboard create-self-signed-cert
  1. web ログインのユーザー名とパスワードを設定
 #/etc/ceph/dashboard.keyを作成し、パスワードを書き込む
 echo "qishi#09319" >/etc/ceph/dashboard.key
 ceph dashboard ac-user-create k8s administrator -i /etc/ceph/dashboard.key
  1. dashboard のデフォルトポートを変更(オプション)

ポートを設定し、デフォルトポートは 8443 で、18443 に変更し、変更後は mgr を再起動してポートを有効にします。

ceph config set mgr mgr/dashboard/server_port 18443
systemctl restart ceph-mgr.target
  1. サービスアドレスを確認し、ログイン
ceph mgr services

{

​ "dashboard": "https://k8s-ceph-node0:8443/"

}

image-20240323222910679-1711204151978-5

  1. node ノード#

  2. Monitor の拡張#
  3. master ノードの設定を変更

vi /etc/ceph/ceph.conf
[global]
fsid = 30912204-0c26-413f-8e00-6d55c9c0af03     # 生成されたFSID
mon initial members =k8s-ceph-node0,k8s-ceph-node1,k8s-ceph-node2,k8s-ceph-node3            # ホスト名
mon host = 10.10.1.16,10.10.1.17,10.10.1.18,10.10.1.15                       # 対応するIP
public network = 10.10.1.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 333
osd pool default pgp num = 333
osd crush chooseleaf type = 1
[mon]
mon allow pool delete = true

[mds.k8s-ceph-node0]
host = k8s-ceph-node0
  1. 設定とキーリングファイルを他のノードに配布(master ノード)
#公開鍵を生成し、nodeノードホストにコピー
ssh-keygen -t rsa
ssh-copy-id 10.10.1.17
ssh-copy-id 10.10.1.18
ssh-copy-id 10.10.1.15
#認証キーをコピー
scp /etc/ceph/*  10.10.1.17:/etc/ceph/
scp /etc/ceph/*  10.10.1.18:/etc/ceph/
scp /etc/ceph/*  10.10.1.15:/etc/ceph/
  1. node ノードで ceph 関連ディレクトリを作成し、権限を追加:
mkdir -p  /var/lib/ceph/{bootstrap-mds,bootstrap-mgr,bootstrap-osd,bootstrap-rbd,bootstrap-rgw,mds,mgr,mon,osd}
chown  -R ceph:ceph /var/lib/ceph

sudo -u ceph mkdir /var/lib/ceph/mon/ceph-k8s-ceph-node1
sudo -u ceph mkdir /var/lib/ceph/mon/ceph-k8s-ceph-node2
  1. node ノードの設定ファイルを変更し、node1 の例(他のノードも同様)
[global]
fsid = 30912204-0c26-413f-8e00-6d55c9c0af03     # 生成されたFSID
mon initial members =k8s-ceph-node0,k8s-ceph-node1,k8s-ceph-node2,k8s-ceph-node3           # ホスト名
mon host = 10.10.1.16,10.10.1.17,10.10.1.18,10.10.1.15                       # 対応するIP
public network = 10.10.1.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 333
osd pool default pgp num = 333
osd crush chooseleaf type = 1
[mon]
mon allow pool delete = true

[mon.k8s-ceph-node1]
mon_addr = 10.10.1.17:6789
host = k8s-ceph-node1
  1. クラスター内のキーと map を取得し、node1 の例(他のノードも同様)
ceph auth get mon. -o /tmp/monkeyring
ceph mon getmap -o /tmp/monmap
  1. 既存のキーと map を使用して新しい Monitor を追加し、ホスト名を指定します。node1 の例(他のノードも同様)
sudo -u ceph ceph-mon --mkfs -i k8s-ceph-node1 --monmap /tmp/monmap --keyring /tmp/monkeyring
  1. サービスを起動し、node1 の例(他のノードも同様)
systemctl start ceph-mon@k8s-ceph-node1
systemctl enable ceph-mon@k8s-ceph-node1
#monの状態を確認
ceph -s
ceph mon stat
  1. OSD の追加#

既存の osd の master ノードから初期化されたキーリングファイルをコピーします。

scp -p  /var/lib/ceph/bootstrap-osd/ceph.keyring  10.10.1.17:/var/lib/ceph/bootstrap-osd/
scp -p  /var/lib/ceph/bootstrap-osd/ceph.keyring  10.10.1.18:/var/lib/ceph/bootstrap-osd/
scp -p  /var/lib/ceph/bootstrap-osd/ceph.keyring  10.10.1.15:/var/lib/ceph/bootstrap-osd/

node ノードで osd を追加します。

ceph-volume lvm create --data /dev/sdb

systemctl enable ceph-osd@k8s-ceph-node1
#状態を確認
ceph -s
  1. Mds の追加(node0 の例)#

#ディレクトリを作成
sudo -u ceph mkdir -p /var/lib/ceph/mds/ceph-k8s-ceph-node0
#キーを作成
ceph-authtool --create-keyring /var/lib/ceph/mds/ceph-k8s-ceph-node0/keyring --gen-key -n mds.k8s-ceph-node0
#キーをインポートし、capsを設定
ceph auth add mds.k8s-ceph-node0 osd "allow rwx" mds "allow" mon "allow profile mds" -i /var/lib/ceph/mds/ceph-k8s-ceph-node0/keyring
#サービスを手動で起動
ceph-mds --cluster ceph -i k8s-ceph-node0 -m k8s-ceph-node0:6789
 chown -R ceph:ceph /var/lib/ceph/mds/
 systemctl start ceph-mds@k8s-ceph-node0
 systemctl enable ceph-mds@k8s-ceph-node0
 #サービスが起動しているか確認
 ps -ef|grep ceph-mds
 #cephクラスターの状態を確認
 ceph -s
  1. CephFS の作成#

プールを作成

#データを保存
ceph osd pool create cephfs_data 64
#メタデータを保存
ceph osd pool create cephfs_metadata 64
#cephfsファイルシステムを有効化
ceph fs new cephfs cephfs_metadata cephfs_data
#ファイルシステムの状態を確認
ceph fs ls
ceph mds stat
  1. rbd プールの作成#

#rbdプールを作成
ceph osd pool create rbd-k8s 64 64
#有効化 
ceph osd pool application enable rbd-k8s rbd
#初期化
rbd pool init rbd-k8s
#確認
ceph osd lspools

二:高可用 k8s クラスターのデプロイ#

タスク一:設定準備(ceph クラスターと同様)#

タスク二:docker のインストール#

  1. Docker CE の yum リポジトリを設定します。docker-ce.repoファイルを開き、以下の内容をファイルにコピーします。
echo '
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg ' > /etc/yum.repos.d/docker-ce.repo

ファイルを保存して終了します。

  1. Docker CE をインストールします。以下のコマンドを実行して Docker CE をインストールします。
 yum -y install docker-ce docker-ce-cli  containerd.io
#dockerを起動し、起動時に自動起動を設定
systemctl start docker  
systemctl enable docker
#バージョンを確認
docker -v
docker compose version
  1. Docker の設定を変更し、cgroup ドライバーを systemd に設定し、設定を以下のように変更します。
#設定をdaemon.jsonファイルに書き込む
echo '{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "data-root": "/data/docker"
} ' > /etc/docker/daemon.json
#確認
cat /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
docker info
  1. 必要なディレクトリを作成
cd /data
mkdir  cri-dockerd calico    dashboard   metrics-server  script  ingress-nginx

タスク三:cri-dockerd のインストール(k8s 1.24 以降のバージョン)#

cd /data/cri-dockerd
# cri-dockerdインストールパッケージをダウンロード
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el8.x86_64.rpm
# cri-dockerdをインストール
rpm -ivh cri-dockerd-0.3.4-3.el8.x86_64.rpm
docker pull registry.aliyuncs.com/google_containers/pause:3.9
# イメージアドレスを国内に変更しないと、kubeletがイメージを取得できず、起動に失敗します
sed -i.bak 's|ExecStart=.*$|ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9|g' /usr/lib/systemd/system/cri-docker.service
cat /usr/lib/systemd/system/cri-docker.service
# cri-dockerdを起動
systemctl daemon-reload 
systemctl start cri-docker.service
systemctl enable cri-docker.service

タスク四:高可用コンポーネントのインストール#

高可用クラスターをデプロイするには、**keepalived と haproxy をインストールして、masterノードの高可用性を実現します。** 各 master ノードで操作します。

  1. keepalived と haproxy をインストール
yum install keepalived haproxy -y
  1. keepalived と haproxy の設定ファイルをバックアップ
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
  1. 各 master ノードの/etc/keepalived/keepalived.confファイルを変更
    1. future-k8s-master0

    2. echo '
      global_defs {
         router_id k8s
      }
      
      vrrp_script check_haproxy {
          script "killall -0 haproxy"
          interval 3
          weight -2
          fall 10
          rise 2
      }
      
      vrrp_instance VI_1 {
          state MASTER  #主ノードはMASTER、他はBACKUP
          interface ens192  #ネットワークインターフェース名
          virtual_router_id 51
          priority 250   #優先度
          nopreempt   #非奪取モードを設定
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass ceb1b3ec013d66163d6ab
          }
          virtual_ipaddress {
              10.10.1.83/24   #仮想IP
          }
          track_script {
              check_haproxy
          }
      }    
      ' > /etc/keepalived/keepalived.conf
      cat /etc/keepalived/keepalived.conf
      
    3. future-k8s-master1

    4. echo '
      global_defs {
         router_id k8s
      }
      
      vrrp_script check_haproxy {
          script "killall -0 haproxy"
          interval 3
          weight -2
          fall 10
          rise 2
      }
      
      vrrp_instance VI_1 {
          state BACKUP  #主ノードはMASTER、他はBACKUP
          interface ens192  #ネットワークインターフェース名
          virtual_router_id 51
          priority 200   #優先度
          nopreempt   #非奪取モードを設定
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass ceb1b3ec013d66163d6ab
          }
          virtual_ipaddress {
              10.10.1.83/24   #仮想IP
          }
          track_script {
              check_haproxy
          }
      }    
      ' > /etc/keepalived/keepalived.conf
      cat  /etc/keepalived/keepalived.conf
      
    5. future-k8s-master2

    6. echo '
      global_defs {
         router_id k8s
      }
      
      vrrp_script check_haproxy {
          script "killall -0 haproxy"
          interval 3
          weight -2
          fall 10
          rise 2
      }
      
      vrrp_instance VI_1 {
          state BACKUP  #主ノードはMASTER、他はBACKUP
          interface ens192  #ネットワークインターフェース名
          virtual_router_id 51
          priority 150   #優先度
          nopreempt   #非奪取モードを設定
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass ceb1b3ec013d66163d6ab
          }
          virtual_ipaddress {
              10.10.1.83/24   #仮想IP
          }
          track_script {
              check_haproxy
          }
      }    
      ' > /etc/keepalived/keepalived.conf
      cat  /etc/keepalived/keepalived.conf
      
  2. 各 master ノードの/etc/haproxy/haproxy.cfgファイルを変更します(3 つの master ノードの設定ファイルは同じです)。
echo "
#---------------------------------------------------------------------
# グローバル設定
#---------------------------------------------------------------------
global
    # これらのメッセージを/var/log/haproxy.logに送信するには、
    # syslogがネットワークログイベントを受け入れるように設定する必要があります。これは
    # /etc/sysconfig/syslogのSYSLOGD_OPTIONSに'-r'オプションを追加することで行います。
    # local2イベントを/var/log/haproxy.logファイルに送信するように設定します。
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # スタッツのUNIXソケットを有効にする
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# 'listen'および'backend'セクションで使用される共通デフォルト
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
#---------------------------------------------------------------------
# kubernetes apiserverフロントエンドがバックエンドにプロキシします
#---------------------------------------------------------------------
frontend kubernetes-apiserver
    mode                 tcp
    bind                 *:16443 #高可用監視ポート、k8sクラスターを初期化する際に使用されます
    option               tcplog
    default_backend      kubernetes-apiserver
#---------------------------------------------------------------------
# 様々なバックエンド間でラウンドロビンバランシング
#---------------------------------------------------------------------
backend kubernetes-apiserver
    mode        tcp
    balance     roundrobin
    server      future-k8s-master0   10.10.1.80:6443 check
    server      future-k8s-master1   10.10.1.81:6443 check
    server      future-k8s-master2   10.10.1.82:6443 check

#---------------------------------------------------------------------
# haproxy統計メッセージの収集
#---------------------------------------------------------------------
listen stats
    bind                 *:1080
    stats auth           admin:awesomePassword
    stats refresh        5s
    stats realm          HAProxy\ Statistics
    stats uri            /admin?stats

" > /etc/haproxy/haproxy.cfg

cat /etc/haproxy/haproxy.cfg
  1. (各 master ノードを順番に起動)
#keepalivedを起動  
systemctl enable keepalived  && systemctl start keepalived  
#haproxyを起動 
systemctl enable haproxy && systemctl start haproxy
systemctl status keepalived
systemctl status haproxy
  1. future-k8s-master0 でバインドされた vip アドレスを確認

ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:50:56:9a:eb:48 brd ff:ff:ff:ff:ff inet 10.10.1.80/24 brd 10.10.3.255 scope global noprefixroute ens192 valid_lft forever preferred_lft forever inet 10.10.1.83/24 scope global ens192 valid_lft forever preferred_lft forever inet6 fe80::250:56ff:fe9a/64 scope link noprefixroute valid_lft forever preferred_lft forever

タスク五:k8s クラスターのデプロイ#

  1. yum ソフトウェアソースを追加#

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  1. kubeadm、kubelet、kubectl をインストール#

# kubelet、kubeadm、kubectlをインストール
yum install -y kubelet-1.28.0 kubeadm-1.28.0 kubectl-1.28.0 --disableexcludes=kubernetes

#cgroupをsystemdに変更
echo 'KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"' > /etc/sysconfig/kubelet
# 確認
cat /etc/sysconfig/kubelet
# 自動起動を設定
systemctl start kubelet.service
systemctl enable kubelet.service

#バージョンを確認
 kubeadm version
 kubelet --version
 kubectl version 
  1. k8s クラスターを初期化(future-k8s-master0 ノード)#

    方式一:設定ファイルを使用して初期化#
    1. デフォルト設定ファイルをエクスポート(オプション)
    kubeadm config print init-defaults > kubeadm-config.yaml
    
    1. 設定ファイル
    echo '
    apiVersion: kubeadm.k8s.io/v1beta3
    kind: InitConfiguration
    localAPIEndpoint:
      advertiseAddress: 10.10.1.83  #仮想IP
      bindPort: 6443
    nodeRegistration:
      criSocket: unix:///var/run/cri-dockerd.sock
    ---
    apiServer:
      certSANs:    #masterノードと対応するホスト名
        - future-k8s-master0
        - future-k8s-master1
        - future-k8s-master2
        - future-k8s-vip
        - 10.10.1.80
        - 10.10.1.81
        - 10.10.1.82
        - 10.10.1.83
        - 127.0.0.1
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controlPlaneEndpoint: "future-k8s-vip:16443" #仮想IPと高可用設定のポート番号
    controllerManager: {}
    dns: {}
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: 1.28.0
    networking:
      dnsDomain: cluster.local
      podSubnet: 10.244.0.0/16
      serviceSubnet: 10.96.0.0/12
    scheduler: {}
    ' > /data/script/kubeadm-config.yaml
    cat /data/script/kubeadm-config.yaml
    
    1. クラスターの初期化
    kubeadm init --config kubeadm-config.yaml --upload-certs
    
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    方式二:コマンドを使用して初期化#
    1. master ノードをデプロイし、10.10.1.80 で master ノードを初期化します。
    kubeadm init \
      --apiserver-advertise-address=10.10.1.80 \
      --image-repository registry.aliyuncs.com/google_containers \
      --kubernetes-version v1.28.0 \
      --control-plane-endpoint=future-k8s-vip:16443 \  #仮想IP(未定)
      --control-plane-endpoint=future-k8s-vip \  #仮想IP(未定)
      --service-cidr=10.96.0.0/12 \
      --pod-network-cidr=10.244.0.0/16 \
      --cri-socket=unix:///var/run/cri-dockerd.sock \
      --ignore-preflight-errors=all 
      
      
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
    1. ssh のパスワードなし設定
    #10.10.1.80で公開鍵を生成し、他のmasterノードにコピー
    ssh-keygen -t rsa
    ssh-copy-id 10.10.1.81
    ssh-copy-id 10.10.1.82
    
    1. 10.10.1.80 の証明書を他の master ノードにコピーします。
    #他のmasterノードに証明書保存用ディレクトリを作成
    cd /root && mkdir -p /etc/kubernetes/pki/etcd &&mkdir -p ~/.kube/
    
    #future-k8s-master0の証明書をfuture-k8s-master1にコピー
    scp /etc/kubernetes/pki/ca.crt 10.10.1.81:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/ca.key 10.10.1.81:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/sa.key 10.10.1.81:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/sa.pub 10.10.1.81:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/front-proxy-ca.crt 10.10.1.81:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/front-proxy-ca.key 10.10.1.81:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/etcd/ca.crt 10.10.1.81:/etc/kubernetes/pki/etcd/
    scp /etc/kubernetes/pki/etcd/ca.key 10.10.1.81:/etc/kubernetes/pki/etcd/
    
    #future-k8s-master0の証明書をfuture-k8s-master2にコピー
    scp /etc/kubernetes/pki/ca.crt 10.10.1.82:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/ca.key 10.10.1.82:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/sa.key 10.10.1.82:/etc/kubernetes/pki/
    scp /etc/kubernetes/pki/sa.pub 10.10.1.82:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/front-proxy-ca.crt 10.10.1.82:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/front-proxy-ca.key 10.10.1.82:/etc/kubernetes/pki/ 
    scp /etc/kubernetes/pki/etcd/ca.crt 10.10.1.82:/etc/kubernetes/pki/etcd/
    scp /etc/kubernetes/pki/etcd/ca.key 10.10.1.82:/etc/kubernetes/pki/etcd/
    
  2. 他の master ノードを初期化#

 kubeadm join future-k8s-vip:16443 --token yjphdh.guefcomqw3am4ask \
        --discovery-token-ca-cert-hash sha256:ed44c7deada0ea0fe5a54212ab4e5aa6fc34672ffe2a2c87a31ba73306e75c21 \
        --control-plane --certificate-key 4929b83577eafcd5933fc0b6506cb6d82e7bc481751e442888c4c2b32b5d0c9c  --cri-socket=unix:///var/run/cri-dockerd.sock
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. node ノードを初期化#

kubeadm join future-k8s-vip:16443 --token yjphdh.guefcomqw3am4ask \
        --discovery-token-ca-cert-hash sha256:ed44c7deada0ea0fe5a54212ab4e5aa6fc34672ffe2a2c87a31ba73306e75c21 --cri-socket=unix:///var/run/cri-dockerd.sock
  1. master ノードが POD をスケジュールできるように設定(オプション)#

デフォルトの設定では Kubernetes は Pod を Master ノードにスケジュールしません。k8s-master も Node として使用したい場合は、汚染を除去してスケジューリングを有効にする必要があります。

#デフォルト設定の汚染を確認
kubectl describe node future-k8s-master2 |grep Taints

Taints: node-role.kubernetes.io/control-plane

#汚染を除去
kubectl taint nodes future-k8s-master2 node-role.kubernetes.io/control-plane-

worker マークを追加

#workerマークを追加
kubectl label nodes future-k8s-master2 node-role.kubernetes.io/worker=
#workerマークを削除
kubectl label nodes future-k8s-master2 node-role.kubernetes.io/worker-

タスク六:ネットワークプラグインのインストール(master)#

calico をインストール

mkdir /data/calico
wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml
#calico.yamlを変更し、CALICO_IPV4POOL_CIDRを見つける
vi calico.yaml
##############変更内容###################
 value: "10.244.0.0/16"
 ##############変更内容###################
 #masterノードでcalicoをインストール
 kubectl apply -f calico.yaml

ノードの状態を確認

# すべてのノードを確認
kubectl get nodes
kubectl get nodes -o wide
#クラスターの健康状態を確認
 kubectl get cs

タスク七:nginx をインストールしてテスト#

# Nginxアプリケーションを作成
kubectl create deployment nginx --image=nginx
# 80ポートを開放
kubectl expose deployment nginx --port=80 --type=NodePort
# podの状態を確認
kubectl get pod
#サービスの状態を確認
kubectl get service
##########################################################################
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        5d1h
nginx        NodePort    10.98.221.224   <none>        80:32743/TCP   23s
##########################################################################
# ウェブページテストにアクセス(ポート番号はサービスの状態で確認したものを基に)
http://10.10.1.80:32743/

タスク八:Dashboard インターフェースのインストール#

  1. yaml ファイルをダウンロード
#保存ディレクトリを作成
mkdir dashboard
cd dashboard/
#2.7
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
  1. yaml ファイルを変更
vi recommended.yaml
#レプリカを2に設定
#################変更内容#######################
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 32009   #この行を追加し、インデントを揃えることに注意
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort          #この行を追加し、インデントを揃えることに注意
  #################変更内容#######################
  1. インストールを適用し、pod と svc を確認
#インストール
kubectl apply -f recommended.yaml
#podとsvcを確認
kubectl get pod,svc -o wide -n kubernetes-dashboard
#########################################################
NAME                                             READY   STATUS              RESTARTS   AGE   IP       NODE    NOMINATED NODE   READINESS GATES
pod/dashboard-metrics-scraper-5cb4f4bb9c-mg569   0/1     ContainerCreating   0          9s    <none>   node1   <none>           <none>
pod/kubernetes-dashboard-6967859bff-2968p        0/1     ContainerCreating   0          9s    <none>   node1   <none>           <none>

NAME                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE   SELECTOR
service/dashboard-metrics-scraper   ClusterIP   10.100.129.191   <none>        8000/TCP        9s    k8s-app=dashboard-metrics-scraper
service/kubernetes-dashboard        NodePort    10.106.130.53    <none>        443:31283/TCP   9s    k8s-app=kubernetes-dashboard
########################################################

表示された svc を使用して、提供されたポートでDashboardにアクセスします。

  1. dashboard サービスアカウントを作成
#admin-userというサービスアカウントを作成し、クラスターにバインド
vi dashboard-adminuser.yaml
##################内容####################
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
  
---
# キーを作成し、サービスアカウントの長期保持者トークンを取得
apiVersion: v1
kind: Secret
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token
  ##################内容####################
 
  #実行して有効にする
  kubectl apply -f dashboard-adminuser.yaml
  1. ログイン方法

方法一:長期使用可能なトークンを取得

#それを/data/dashboard/のadmin-user.tokenファイルに保存
cd /data/dashboard/
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d > admin-user.token 

長期使用可能なトークンを取得するスクリプト

#!/bin/bash
#著者:云
#############説明#############
:<<!
長期使用可能なトークンを取得するスクリプト
トークンをadmin-user.tokenファイルに保存します
!
#############説明#############
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d > admin-user.token

echo -e "\033[1;32mトークンの作成に成功しました。admin-user.tokenファイルで確認してください\033[m"

方法二:Kubeconfig ファイルを使用してログイン

 #トークン変数を定義
 DASH_TOCKEN=$(kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d)
 #kubeconfigクラスターエントリを設定
 kubectl config set-cluster kubernetes --server=10.10.1.80:6433 --kubeconfig=/root/dashbord-admin.conf
 #kubeconfigユーザーエントリを設定
 kubectl config set-credentials admin-user --token=$DASH_TOCKEN --kubeconfig=/root/dashbord-admin.conf
 #kubeconfigコンテキストエントリを設定
 kubectl config set-context admin-user@kubernetes --cluster=kubernetes --user=admin-user --kubeconfig=/root/dashbord-admin.conf
 #kubeconfig現在のコンテキストを設定
 kubectl config use-context admin-user@kubernetes  --kubeconfig=/root/dashbord-admin.conf

生成された dashbord-admin.conf ファイルをローカルホストに置き、ログイン時にKubeconfigオプションを選択し、kubeconfig ファイルを選択してログインします。

タスク九:metrics-server のインストール#

デプロイファイルをダウンロード

wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml

yaml ファイルの Deployment 内容を変更

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls  #追加
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.4 #変更
        imagePullPolicy: IfNotPresent

#インストール
kubectl apply -f metrics-server-components.yaml

metrics-server の pod 状態を確認

kubectl get pods --all-namespaces | grep metrics

しばらく待って、各種監視グラフが正常に表示されることを確認します。

image-20240323222707075-1711204031457-1

タスク十:kubectl コマンドの自動補完#

yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
echo 'source <(kubectl completion bash)' >>  ~/.bashrc
bash

タスク十一:ingress-nginx コントローラーのインストール#

#yamlファイルをダウンロード
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
#yamlファイル内のイメージを取得するアドレスを変更
#####################変更内容######################
willdockerhub/ingress-nginx-controller:v1.0.0
hzde0128/kube-webhook-certgen:v1.0
#####################変更内容######################
#DeploymentをDaemonSetに変更
#ネットワークモードをhost networkに変更
#####################変更内容######################
template:
  spec:
    hostNetwork: true
    dnsPolicy: ClusterFirstWithHostNet
    tolerations:  #親和性設定を使用してすべてのノードにデプロイ
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
     nodeSelector:
          kubernetes.io/os: linux
          custem/ingress-controller-ready: 'true'
      containers:
        - name: controller
#####################変更内容######################
#ワーカーノードにラベルを設定(必須)
kubectl label nodes future-k8s-master0 custem/ingress-controller-ready=true
kubectl label nodes future-k8s-master1 custem/ingress-controller-ready=true
kubectl label nodes future-k8s-master2 custem/ingress-controller-ready=true
kubectl label nodes future-k8s-node3 custem/ingress-controller-ready=true

#インストール
kubectl apply -f deploy.yaml

#状態を確認
kubectl get pods -n ingress-nginx
################状態##################
NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-2lz4v       0/1     Completed   0          5m46s
ingress-nginx-admission-patch-c6896        0/1     Completed   0          5m46s
ingress-nginx-controller-7575fb546-q29qn   1/1     Running     0          5m46s

タスク十二:Dashboard プロキシの設定#

echo '
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-dashboard
  namespace: kubernetes-dashboard
  labels:
    ingress: k8s-dashboard
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /  #パスをリライト
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"   #httpを自動的にhttpsにリダイレクト
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  ingressClassName: nginx 
  rules:
    - host: k8s.yjs.51xueweb.cn
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kubernetes-dashboard
                port:
                  number: 443
' > /data/dashboard/dashboard-ingress.yaml

三:k8s クラスターと ceph クラスターの統合#

タスク一:ceph クライアント(ceph-common)のインストール#

k8s クラスターの各ノードに ceph-common をインストールします。

yum install ceph-common -y

タスク二:ceph クラスター設定ファイルの同期#

ceph クラスターの /etc/ceph/{ceph.conf,ceph.client.admin.keyring} ファイルを k8s のすべてのノードに同期します。

#sshのパスワードなし設定
ssh-keygen -t rsa
ssh-copy-id 10.10.1.80
ssh-copy-id 10.10.1.81
ssh-copy-id 10.10.1.82

#ファイルをコピー
scp -r /etc/ceph/{ceph.conf,ceph.client.admin.keyring} 10.10.1.80:/etc/ceph
scp -r /etc/ceph/{ceph.conf,ceph.client.admin.keyring} 10.10.1.81:/etc/ceph
scp -r /etc/ceph/{ceph.conf,ceph.client.admin.keyring} 10.10.1.82:/etc/ceph

タスク三:ceph-csi(rbd を使用)のデプロイ#

  1. ceph-csi コンポーネントをダウンロード(k8s の master ノードの 1 つ)
#ファイルをダウンロード
wget https://github.com/ceph/ceph-csi/archive/refs/tags/v3.9.0.tar.gz
#解凍
mv v3.9.0.tar.gz ceph-csi-v3.9.0.tar.gz
tar -xzf ceph-csi-v3.9.0.tar.gz
#ディレクトリに移動
cd  ceph-csi-3.9.0/deploy/rbd/kubernetes
mkdir /data/cephfs/csi
#csiに6つのファイルをコピー
cp * /data/cephfs/csi
  1. csi コンポーネントに必要なイメージをプルします。
#必要なイメージを確認
grep image csi-rbdplugin-provisioner.yaml
grep image csi-rbdplugin.yaml

すべての k8s ノードで必要なイメージをプルします。

cd /data/script
./pull-images.sh registry.k8s.io/sig-storage/csi-provisioner:v3.5.0
./pull-images.sh registry.k8s.io/sig-storage/csi-resizer:v1.8.0
./pull-images.sh registry.k8s.io/sig-storage/csi-snapshotter:v6.2.2
docker pull  quay.io/cephcsi/cephcsi:v3.9.0
./pull-images.sh registry.k8s.io/sig-storage/csi-attacher:v4.3.0
./pull-images.sh registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.8.0
  1. 名前空間cephfsを作成
echo '
apiVersion: v1
kind: Namespace
metadata:
  labels:
    kubernetes.io/metadata.name: cephfs
  name: cephfs
  ' > ceph-namespace.yaml
  
 #実行
  kubectl apply -f ceph-namespace.yaml 
  1. ceph クラスターに接続するための秘密鍵ファイル csi-rbd-secret.yaml を作成
echo '
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: cephfs
stringData:
  adminID: admin 
  adminKey: AQANDD9lfWg2LBAAHY0mprdbuKFBPJDkE7/I5Q==
  userID: admin  
  userKey: AQANDD9lfWg2LBAAHY0mprdbuKFBPJDkE7/I5Q==
  ' > csi-rbd-secret.yaml
  
   #実行
    kubectl apply -f csi-rbd-secret.yaml
  1. ceph-config-map.yaml を作成
echo '
apiVersion: v1
kind: ConfigMap
data:
  ceph.conf: |
     [global]
     fsid = 30912204-0c26-413f-8e00-6d55c9c0af03     # 生成されたFSID
     mon initial members =k8s-ceph-node0,k8s-ceph-node1,k8s-ceph-node2            # ホスト名
     mon host = 10.10.1.16,10.10.1.17,10.10.1.18                       # 対応するIP
     public network = 10.10.1.0/24
     auth cluster required = cephx
     auth service required = cephx
     auth client required = cephx
     osd journal size = 1024
     osd pool default size = 3
     osd pool default min size = 2
     osd pool default pg num = 333
     osd pool default pgp num = 333
     osd crush chooseleaf type = 1
     [mon]
     mon allow pool delete = true

     [mds.k8s-ceph-node0]    
     host = k8s-ceph-node0
  keyring: |
metadata:
  name: ceph-config
  namespace: cephfs
' > ceph-config-map.yaml

 #実行
 kubectl apply -f ceph-config-map.yaml  
  1. csi-config-map.yaml を変更し、ceph クラスターに接続する情報を設定
echo '
apiVersion: v1
kind: ConfigMap
metadata:
  name: ceph-csi-config
  namespace: cephfs
  labels:
    addonmanager.kubernetes.io/mode: Reconcile
data:
  config.json: |-
    [{"clusterID":"30912204-0c26-413f-8e00-6d55c9c0af03","monitors":["10.10.1.16:6789","10.10.1.17:6789","10.10.1.18:6789"]}]
' > csi-config-map.yaml
  1. csi コンポーネント設定ファイルを変更

    1. /data/cephfs/csiディレクトリ内のすべての yaml ファイルの名前空間をdefaultからcephfsに変更します。

    2. cd /data/cephfs/csi
      sed -i "s/namespace: default/namespace: cephfs/g" $(grep -rl "namespace: default" ./)
      sed -i -e "/^kind: ServiceAccount/{N;N;a\  namespace: cephfs}" $(egrep -rl "^kind: ServiceAccount" ./)
      
    3. csi-rbdplugin-provisioner.yamlcsi-rbdplugin.yamlの kms 部分の設定をコメントアウトします。

    4. # - name: KMS_CONFIGMAP_NAME

      ​ # value: encryptionConfig

      #- name: ceph-csi-encryption-kms-config

      ​ # configMap:

      ​ # name: ceph-csi-encryption-kms-config

 #実行し、csiコンポーネントをインストール
 kubectl apply -f csi-config-map.yaml
 kubectl apply -f csi-nodeplugin-rbac.yaml
 kubectl apply -f csidriver.yaml
 kubectl apply -f csi-provisioner-rbac.yaml
 kubectl apply -f csi-rbdplugin-provisioner.yaml
 kubectl apply -f csi-rbdplugin.yaml

タスク四:storageclass を作成#

echo '
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    k8s.kuboard.cn/storageType: cephfs_provisioner
  name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
  # fsName: cephfs  (cephfs方式使用)
  clusterID: 30912204-0c26-413f-8e00-6d55c9c0af03 
  pool: rbd-k8s 
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
  csi.storage.k8s.io/provisioner-secret-namespace: cephfs
  csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: cephfs
  csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
  csi.storage.k8s.io/node-stage-secret-namespace: cephfs
  csi.storage.k8s.io/fstype: xfs
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - discard
 ' > storageclass.yaml
 
 #実行
  kubectl apply -f storageclass.yaml

タスク五:PVC を作成#

echo '
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rbd-pvc 
  namespace: cephfs
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi 
  storageClassName: csi-rbd-sc
  ' > pvc.yaml
  
#実行
 kubectl apply -f pvc.yaml
#PVCが正常に作成されたか確認
kubectl get pvc -n cephfs
#PVが正常に作成されたか確認
kubectl get pv -n cephfs

#cephクラスターのcephfs_dataストレージプールにイメージが作成されたか確認
 rbd ls -p rbd-k8s

タスク六:pod を作成し、テスト検証を行う#

echo '
apiVersion: v1
kind: Pod
metadata:
  name: csi-rbd-demo-pod
  namespace: cephfs
spec:
  containers:
    - name: web-server
      image: nginx:latest
      volumeMounts:
        - name: mypvc
          mountPath: /var/lib/www/html
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: rbd-pvc 
        readOnly: false
' > pod.yaml

#実行
 kubectl apply -f pod.yaml
 #コンテナに入ってマウント情報を確認
kubectl exec -it csi-rbd-demo-pod -n cephfs -- bash
 lsblk -l|grep rbd
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。