Kubernetes(K3s)

ドキュメント


  • ホスト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