Oracle Cloudの無料枠でKubernetesクラスタを構築する(完全版) | blog.potproject.net を参考に、シングルノードクラスターを構築する。
前提
- Oracle Cloud Free
Tier | Oracle 日本 でアカウントを作成し、
VM Standard A1.Flex
のUbuntu20.04
インスタンスを作成済み
kubeadm、kubelet、kubectl のインストール
iptablesがブリッジを通過するトラフィックを処理できるようにする
sudo modprobe br_netfilter
cat | sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
iptablesがnftablesバックエンドを使用しないようにする
sudo apt-get install -y iptables arptables ebtables
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo update-alternatives --set arptables /usr/sbin/arptables-legacy
sudo update-alternatives --set ebtables /usr/sbin/ebtables-legacy
ポート設定
sudo vi /etc/iptables/rules.v4
差分は以下の通り。
--- /etc/iptables/rules.v4 2022-03-03 19:28:40.279059992 +0000
+++ ./rules.v4 2022-03-30 23:11:47.310270150 +0000
@@ -14,8 +14,15 @@
-A INPUT -i lo -j ACCEPT
-A INPUT -p udp --sport 123 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT--A INPUT -j REJECT --reject-with icmp-host-prohibited
--A FORWARD -j REJECT --reject-with icmp-host-prohibited
+-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -m comment --comment "http"
+-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -m comment --comment "https"
+-A INPUT -p tcp -m state --state NEW -m tcp --dport 6443 -j ACCEPT -m comment --comment "Kubernetes API server"
+-A INPUT -p tcp -m state --state NEW -m tcp --dport 2379 -j ACCEPT -m comment --comment "etcd server client API"
+-A INPUT -p tcp -m state --state NEW -m tcp --dport 2380 -j ACCEPT -m comment --comment "etcd server client API"
+-A INPUT -p tcp -m state --state NEW -m tcp --dport 10250 -j ACCEPT -m comment --comment "Kubelet API"
+-A INPUT -p tcp -m state --state NEW -m tcp --dport 10251 -j ACCEPT -m comment --comment "kube-scheduler"
+-A INPUT -p tcp -m state --state NEW -m tcp --dport 10252 -j ACCEPT -m comment --comment "kube-controller-manager"
+-A INPUT -p tcp -m state --state NEW -m tcp --match multiport --dports 30000:32767 -j ACCEPT -m comment --comment "NodePort Service"
-A OUTPUT -d 169.254.0.0/16 -j InstanceServices
-A InstanceServices -d 169.254.0.2/32 -p tcp -m owner --uid-owner 0 -m tcp --dport 3260 -m comment --comment "See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or rem
oving this rule" -j ACCEPT
-A InstanceServices -d 169.254.2.0/24 -p tcp -m owner --uid-owner 0 -m tcp --dport 3260 -m comment --comment "See the Oracle-Provided Images section in the Oracle Cloud Infrastructure documentation for security impact of modifying or rem oving this rule" -j ACCEPT
変更したルールを適用。
sudo iptables-restore < /etc/iptables/rules.v4
containerd のインストール
必要な設定の追加
# 必須モジュールのロード
cat | sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 必要なカーネルパラメータの設定・設定値永続化
cat | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
containerd パッケージインストール
# 必須パッケージをインストール
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# Docker公式のGPG鍵を追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Dockerのaptリポジトリの追加
sudo add-apt-repository \
"deb [arch=arm64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# containerdのインストール
sudo apt-get update && sudo apt-get install -y containerd
# containerdの設定
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
kubeadm、kubelet、kubectl パッケージのインストール
まだ kubernetes-focal
は無いようなので
kubernetes-xenial
を使用する。
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
kubelet 再起動
sudo systemctl daemon-reload
sudo systemctl restart kubelet
クラスターの作成
マスターノードの初期化
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
実行結果の最後に、以下のような表示がされるのでメモしておく。 (ワーカーノードの追加時に必要)
kubeadm join 10.0.0.6:6443 --token c7qetq.em6zu48c0op2gch5 \
--discovery-token-ca-cert-hash sha256:9d0f86ce7154975e53e52450f77b7159b98b80c507c2bcaa0a711a1ff35f1740
設定ファイル群の準備
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
マスターノード上で Pod の起動を許可する設定
セキュリティ上の理由で、デフォルトでは、コントロールプレーンノードに Pod を置かない。
今回はシングルノードでクラスターを作っているため、コントロールプレーンノード上での Pod 起動を許可する。
kubectl taint nodes --all node-role.kubernetes.io/master-
マスターノードへワーカーノードを追加する場合
マスターノードの初期化時にメモしたコマンドを実行する。 (今回は、追加のワーカーノードはないので実行しない)
sudo kubeadm join 10.0.0.6:6443 --token c7qetq.em6zu48c0op2gch5 \
--discovery-token-ca-cert-hash sha256:9d0f86ce7154975e53e52450f77b7159b98b80c507c2bcaa0a711a1ff35f1740
flannel のインストール
Pod 間通信を実現するために、 flannel をインストールする。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Pod の状態確認
この時点で、以下のようにすべての Pod が Running
になっているはず。
ubuntu@eclipse-che:~$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-64897985d-n4fvq 1/1 Running 0 12m
kube-system coredns-64897985d-xqfr4 1/1 Running 0 12m
kube-system etcd-eclipse-che 1/1 Running 0 13m
kube-system kube-apiserver-eclipse-che 1/1 Running 0 13m
kube-system kube-controller-manager-eclipse-che 1/1 Running 0 13m
kube-system kube-flannel-ds-ffm9r 1/1 Running 0 35s
kube-system kube-proxy-csb5h 1/1 Running 0 12m
kube-system kube-scheduler-eclipse-che 1/1 Running 0 13m
動作確認
Pod のデプロイ
nginx をデプロイしてみる。
cat > ./nginx.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
selector:
app: nginx
type: NodePort
ports:
- protocol: TCP
port: 8080
targetPort: 80
nodePort: 30080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
EOF
kubectl apply -f ./nginx.yaml
自分自身のノードから動作確認
curl localhost:30080
NGINX のいつもの画面が表示されれば OK.
外部から(自分のPCから)動作確認
VNIC のインバウンド設定
VM 作成時に作られる VNIC は、最低限のポート開放しかしていないため、今回デプロイしたアプリケーションが使用するポート(30080) を許可する必要がある。
- Oracle Cloud を開く -> 右上のメニューを開く ->
コンピュート
->インスタンス
を選択 - <作成したVM> ->
プライマリVNIC
のサブネットのリンクをクリック セキュリティ・リスト
のDefault Security List for ...
のリンクを選択イングレス・ルール
のイングレス・ルールの追加
ボタンを押下ステートレス
: チェック無しソース・タイプ
:CIDR
ソースCIDR
:0.0.0.0/0
IPプロトコル
:TCP
ソース・ポート範囲
: (空)宛先ポート範囲
:30080
説明
:デモアプリの待ち受けポート開放
これで、外からの 30080 ポートアクセスが、ノードに届くようになる。
curl でアクセス
curl <VMの公開IPアドレス>:30080
NGINX のいつもの画面が表示されれば OK.
参考資料
- Oracle Cloud Free Tier | Oracle 日本
- kubeadmを使ってクラスターを構築する | Kubernetes
- CRIのインストール | Kubernetes
- kubectl実行時に「localhost:8080 was refused」が出る時の対処 - Qiita
- kubeadmを使用したクラスターの作成 | Kubernetes
- flannel-io/flannel: flannel is a network fabric for containers, designed for Kubernetes
- Oracle Cloudの無料枠でKubernetesクラスタを構築する(完全版) | blog.potproject.net