microk8s を Amazon Linux 2 にインストールしてIngressを起動するまで


snapコマンドのインストール

こちらの記事のワンライナーでsnapコマンドをインストールする。
https://www.bonusbits.com/wiki/HowTo:Install_Snap_on_Amazon_Linux_Workspace

tag_version=v0.1.0 && \
rpm_version=2.36.3-0 && \
wget https://github.com/albuild/snap/releases/download/${tag_version}/snap-confine-${rpm_version}.amzn2.x86_64.rpm -P $HOME/Downloads && \
wget https://github.com/albuild/snap/releases/download/${tag_version}/snapd-${rpm_version}.amzn2.x86_64.rpm -P $HOME/Downloads && \
sudo yum -y install $HOME/Downloads/snap-confine-${rpm_version}.amzn2.x86_64.rpm $HOME/Downloads/snapd-${rpm_version}.amzn2.x86_64.rpm && \
sudo systemctl enable --now snapd.socket

microk8sのインストールと設定

Canonicalの公式リファレンス通りに microk8s のインストールコマンドを実行する。
https://microk8s.io/docs

sudo snap install microk8s --classic --channel=1.18/stable

この時、下記のエラーが出たが数分待ってから再度実行することでインストールに成功した。

error: too early for operation, device not yet seeded or device model not acknowledged

あとは公式ドキュメント通りに設定するが、AmazonLinux2に合わせて少しコマンドを改変。

sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube

# aliasだとkubectlのプラグイン(krewなど)が動かないので、シェルスクリプトを作る方式の方が良いかも
echo alias kubectl="'microk8s kubectl'" >> $HOME/.bashrc
sudo su - $USER

よく使うaddonを有効化

microk8s enable dns storage ingress

Ingressの起動

Kubernetesの最小限の設定ファイルを作成してIngressを起動する。

deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: http-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80
kubectl apply -f deploy.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml

これでIngressが起動してパブリックIPから接続することができた。

トラブルシューティング

kubectl logs や kubectl exec が動作しない問題

DNS解決に失敗してlogs, execが動作しない問題が発生した。
AWSのVPCの「DNSホスト名の解決」が有効になっているか確認。
有効にして5分ほど待つとプライベートDNS名が解決されるようになり動作するようになった。

Nginx Ingress ControllerはがデフォルトでHTTPSへのリダイレクトを行う

Ingressに下記のアノテーションを入れることで回避できる

  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"