2022年4月4日月曜日

kubeadm でインストールした Kubernetes に Ingress をインストールする

前回 は、Ampere A1 VM に Kubernetes をインストールしたので、その上に Ingress を載せる。

今回は、以下のように、 httpd の Pod と nginx の Pod をパスによってルーティングする。

                               +---------------+  +-------+
                            +->| httpd service |->| httpd |
+---------+ HOST_NAME/httpd |  +---------------+  +-------+
|         |-----------------+
| Ingress |                    +---------------+  +-------+
|         |------------------->| nginx service |->| nginx |
+---------+ HOST_NAME/nginx    +---------------+  +-------+

Helm のインストール

Kubernetes 上にデプロイする必須アプリは、 Helm でデプロイする。

curl https://helm.baltorepo.com/organization/signing.asc | sudo apt-key add -
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

Ingress のインストール

Helm を使ってインストール。

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --set controller.hostNetwork=true --create-namespace
  • --set controller.hostNetwork=true: ホストネットワークを true にすることで、このホストへの IP アドレスで Ingress へ届くようになる

MetalLB のインストール

Ingress のロードバランス機能を提供するアプリらしい。こちらも Helm でインストールする。

# MetalLB のための ConfigMap 設定
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

helm repo add metallb https://metallb.github.io/metallb

cat | tee ./metallb-value.yaml <<EOF
configInline:
  address-pools:
   - name: default
     protocol: layer2
     addresses:
     - 10.244.0.0/16
EOF

helm upgrade --install metallb metallb/metallb \
   -n metallb-system --create-namespace -f metallb-value.yaml

別途 metallb-value.yaml を作成し、アドレス範囲を設定することで、 Ingress への IP 払い出しが行われるようだ。

アプリをデプロイし、 Ingress を使ってルーティングする

以下のような形で、パスに httpd がきたか nginx が来たかに応じて接続先サービスを変更する。

                               +---------------+  +-------+
                            +->| httpd service |->| httpd |
+---------+ HOST_NAME/httpd |  +---------------+  +-------+
|         |-----------------+
| Ingress |                    +---------------+  +-------+
|         |------------------->| nginx service |->| nginx |
+---------+ HOST_NAME/nginx    +---------------+  +-------+

httpd のデプロイ

Deployment, Service, Ingress を作成する。

DOMAIN="138-2-38-86.nip.io"

cat > ./httpd.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  selector:
    matchLabels:
      app: httpd
  replicas: 1
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80
EOF

kubectl apply -f ./httpd.yaml



cat > ./httpd-service.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: httpd-service
  labels:
    app: httpd
spec:
  selector:
    app: httpd
  type: NodePort
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
EOF

kubectl apply -f ./httpd-service.yaml


cat > ./httpd-ingress.yaml <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: httpd-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: ${DOMAIN}
      http:
        paths:
          - backend:
              service:
                name: httpd-service
                port:
                  number: 80
            path: /httpd
            pathType: Prefix
EOF

kubectl apply -f ./httpd-ingress.yaml

ブラウザで http://${DOMAIN} へ接続し、 httpd のいつもの画面が表示されれば OK.

nginx のデプロイ

Deployment, Service, Ingress を作成する。

DOMAIN="138-2-38-86.nip.io"

cat > ./nginx.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
EOF

kubectl apply -f ./nginx.yaml



cat > ./nginx-service.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
EOF

kubectl apply -f ./nginx-service.yaml


cat > ./nginx-ingress.yaml <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: ${DOMAIN}
      http:
        paths:
          - backend:
              service:
                name: nginx-service
                port:
                  number: 80
            path: /nginx
            pathType: Prefix
EOF

kubectl apply -f ./nginx-ingress.yaml

ブラウザで http://${DOMAIN} へ接続し、 nginx のいつもの画面が表示されれば OK.

参考資料

0 件のコメント:

コメントを投稿