ラベル Oracle Cloud の投稿を表示しています。 すべての投稿を表示
ラベル Oracle Cloud の投稿を表示しています。 すべての投稿を表示

2022年5月5日木曜日

Oracle Kubernetes Engine を試す - クラスタ作成から Ingress デプロイまで

OCI 用コンテナ起動

docker run -it --rm --name oci debian:bullseye-slim

OCI ツールのインストール

# 必須ツールのインストール
apt-get update
apt-get -y install \
        curl

# インストール
curl -LO https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh \
    && bash install.sh --accept-all-defaults --install-dir /opt/oci-cli --exec-dir /usr/local/bin --script-dir /opt/oci-cli-scripts

kubectl のインストール

apt-get update
apt-get install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | tee -a /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubectl

OCI ツールの設定

TENANCY_IDOCID をメモして、 oci setup config コマンドでログイン設定を行う。

  • TENANCY_ID: OCI コンソール -> プロファイル -> テナンシ:xxxx -> OCID
  • OCID: OCI コンソール -> プロファイル -> マイ・プロファイル -> OCID
oci setup config

API キーの追加

  1. OCI コンソール -> プロファイル -> マイ・プロファイル -> APIキー -> APIキーの追加 を選択
    • CLI ツールの設定 で作成した公開鍵(~/.oci/oci_api_key_public.pem)を選択

Kubernetes クラスタへの接続情報作成

mkdir -p $HOME/.kube
oci ce cluster create-kubeconfig \
        --cluster-id ocid1.cluster.oc1.ap-osaka-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
        --file $HOME/.kube/config \
        --region ap-osaka-1 \
        --token-version 2.0.0  \
        --kube-endpoint PUBLIC_ENDPOINT

動作確認

root@50c44ed35822:/# kubectl get node
NAME          STATUS   ROLES   AGE   VERSION
10.0.10.111   Ready    node    45m   v1.22.5
root@50c44ed35822:/# kubectl get pod -A
NAMESPACE     NAME                                   READY   STATUS    RESTARTS      AGE
kube-system   coredns-c54fdf6bc-ndlr6                1/1     Running   0             48m
kube-system   csi-oci-node-k52lv                     1/1     Running   1 (44m ago)   45m
kube-system   kube-dns-autoscaler-5cf654bff9-c7h8l   1/1     Running   0             48m
kube-system   kube-flannel-ds-j6xgp                  1/1     Running   1 (44m ago)   45m
kube-system   kube-proxy-tz5wf                       1/1     Running   0             45m
kube-system   proxymux-client-xtdtb                  1/1     Running   0             45m

nginx-ingress-controller のデプロイ

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/1.22/deploy.yaml

公開 IP アドレスを確認する。

root@50c44ed35822:/# kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.96.139.46   138.2.48.48   80:31906/TCP,443:30887/TCP   4m25s
ingress-nginx-controller-admission   ClusterIP      10.96.73.63    <none>        443/TCP                      4m25s

参考資料

2022年4月13日水曜日

Oracle Cloud Free Tier の Ampere A1 VM(ARM VM) に Kubernetes をインストールする (minikube 版)

Oracle Cloud Free Tier の Ampere A1 VM(ARM VM) に Kubernetes をインストールする - mikoto2000 の日記 では、 kubeadm を直接使って Kubernetes をインストールしたが、Eclipse Che を動かすのに minikune の方が都合が良かったのでそちらでの構築を行う。

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 update
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

Docker のインストール

必要な設定の追加

# 必須モジュールのロード
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

docker パッケージインストール

sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg \
    | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" \
    | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update \
    && sudo apt-get -y install \
        docker-ce \
        docker-ce-cli \
        containerd.io

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

minikube による Kubernetes の構築

minikube のダウンロード

minikube start | minikube から minikube のバイナリをダウンロードする。

今回は、 Linux, ARM64, Stable, Debian package で進める。

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_arm64.deb
sudo dpkg -i minikube_latest_arm64.deb

minikube の起動

minikube start コマンドで構築。

sudo minikube start --driver=none
  • --driver=none: 仮想化を使わず、ホストに直接構築する

kubectl から接続できるようにする

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

minikube による Ingress のデプロイ

アドオンがあるので、それを有効にする。

sudo minikube addons enable ingress

動作確認

前前回, 前回 を参照。

参考資料

2022年3月31日木曜日

Oracle Cloud Free Tier の Ampere A1 VM(ARM VM) に Kubernetes をインストールする

Oracle Cloudの無料枠でKubernetesクラスタを構築する(完全版) | blog.potproject.net を参考に、シングルノードクラスターを構築する。

前提

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) を許可する必要がある。

  1. Oracle Cloud を開く -> 右上のメニューを開く -> コンピュート -> インスタンス を選択
  2. <作成したVM> -> プライマリVNICのサブネットのリンクをクリック
  3. セキュリティ・リストDefault Security List for ... のリンクを選択
  4. イングレス・ルールイングレス・ルールの追加 ボタンを押下
    • ステートレス: チェック無し
    • ソース・タイプ: CIDR
    • ソースCIDR: 0.0.0.0/0
    • IPプロトコル: TCP
    • ソース・ポート範囲: (空)
    • 宛先ポート範囲: 30080
    • 説明: デモアプリの待ち受けポート開放

これで、外からの 30080 ポートアクセスが、ノードに届くようになる。

curl でアクセス

curl <VMの公開IPアドレス>:30080

NGINX のいつもの画面が表示されれば OK.

参考資料