ドキュメント
- ホストPC(virt-manager:KVM/QEMU)
- NATネットワーク (virbr1: 192.168.100.0/24 IPv6対応)
- Master-Node: k3s server
- Worker-Node: k3s worker (複数可)
- VM3: DB (SQL)
- ホストPCの外部IP: (例: 192.168.1.100)
- 外部公開するポートはホストPC側でNATフォワーディング
ホストPC: 192.168.1.100 での作業
IPv6対応の仮想ネットワーク作成時の注意
minikubeで作成したマニフェストのコピー
$ scp -r ./ [email protected]:/home/xxx/~
Ingress向けポートフォワーディング設定
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.122.10:30080
$ sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.122.10:30443
上記設定は再起動時には無効となるので、nftablesでポートフォワードを管理します。
$ sudo systemctl enable nftables
$ sudo systemctl start nftables
$ sudo systemctl status nftables # ステータス確認
下記ルールを追加。
注) oifを指定しないとVMからインターネットへアクセスできません。
/etc/nftables.conf
# NATルール追加
table ip nat {
chain prerouting {
type nat hook prerouting priority 0;
iif "wlp2s0" tcp dport 80 dnat to 192.168.100.10:30080
iif "wlp2s0" tcp dport 443 dnat to 192.168.100.10:30443
}
chain postrouting {
type nat hook postrouting priority 100;
oif "wlp2s0" masquerade
}
}
table ip6 nat {
chain postrouting {
type nat hook postrouting priority 100;
oif "wlp2s0" masquerade
}
}
ルールの適用
$ sudo nft -f /etc/nftables.conf
Master-Node: 192.168.122.10 での作業
NetplanでIPv6対応、静的IP指定して再起動
network:
version: 2
ethernets:
enp1s0:
dhcp4: no
dhcp6: no
addresses:
- 192.168.122.10/24
- fdxx:xxxx:xxxx:1::10/80
gateway4: 192.168.122.1
gateway6: fdxx:xxxx:xxxx:1::1
nameservers:
addresses:
- 192.168.122.1
- fdxx:xxxx:xxxx:1::1
再起動後K3sのインストール
$ curl -sfL https://get.k3s.io | sh -
Ingress-Nginxのインストール
$ sudo kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.3/deploy/static/provider/baremetal/deploy.yaml
NodePortでポートがランダムに割当てられるため固定ポートを指定します。
新しいマニフェストを作成するか既存の設定を編集します。
マニフェスト:
$ sudo nano ingress-nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
type: NodePort
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/component: controller
ports:
- name: http
port: 80
targetPort: http
nodePort: 30080
- name: https
port: 443
targetPort: https
nodePort: 30443
適用
$ sudo kubectl apply -f ingress-nginx-service.yaml
既存マニフェストを編集する場合
$ sudo kubectl edit service ingress-nginx-controller -n ingress-nginx
以下のnodePortの箇所を変更
ports:
- name: http
nodePort: 30080
port: 80
protocol: TCP
targetPort: http
- name: https
nodePort: 30443
port: 443
protocol: TCP
targetPort: https
Worker-Node用トークン取得
$ sudo cat /var/lib/rancher/k3s/server/node-token
注)取得したトークンは、後ほどワーカノード内で使用します。
Cert-Managerのインストール
$ sudo kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
ホストからコピーしたminikubeで作成したマニフェストフォルダへ移動し適用
CloudflareへアクセスするためのAPIトークンをSecretへ登録
$ sudo kubectl create secret generic cloudflare-api-token-secret --from-literal=api-token='YOUR_CLOUDFLARE_API_TOKEN' --namespace=cert-manager
ClusterIssuer適用
$ sudo kubectl apply -f cluster-issuer.yaml
Ingress適用
$ sudo kubectl apply -f ingress.yaml
認証ステータス確認
$ sudo kubectl get certificate
Worker-Node: 192.168.122.20 での作業
Master-Nodeから取得したトークンを指定してk3sをインストール
$ curl -sfL https://get.k3s.io | K3S_URL=https://192.168.122.10:6443 K3S_TOKEN=K10f8d5...abcdef sh -
設定(IPアドレス)を変更する場合
K3sサービス停止
$ sudo systemctl stop k3s-agent
環境変数で設定されている場合、サービスファイルを確認
$ sudo systemctl cat k3s-agent
[Service]
Type=notify
EnvironmentFile=-/etc/default/%N
EnvironmentFile=-/etc/sysconfig/%N
EnvironmentFile=-/etc/systemd/system/k3s-agent.service.env
環境変数を変更(IPアドレス変更)
$ sudo nano /etc/systemd/system/k3s-agent.service.env
K3S_TOKEN='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
K3S_URL='https://192.168.100.10:6443'
サービスを起動
$ sudo systemctl start k3s-agent
Master-Node: 192.168.122.10 での作業
ノード確認
$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-node Ready control-plane,master 23h v1.32.5+k3s1
worker-node001 Ready <none> 23h v1.32.5+k3s1