Ingress
Basics
Ingress Controller
Nginx, HAPROXY, traefik, etc... を利用して Ingress を実現するためにデプロイされるソリューションのこと。
Cloud 環境では ALB や GCP の GCE なども利用される。
Deployment リソースとしてデプロイされる。
設定ファイルなどは ConfigMap オブジェクトとして渡せる。
Ingress Resources
Ingress によりどのようなものを実現するか設定するルールなどのこと。
例
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-wear
spec:
backend:
serviceName: wear-service
servicePort: 80
なお、各 Ingress Recources と Controller は namespace が異なっていてもよい。
以下のような形で、Ingress Resources のマニフェストファイル内で namespace を設定できる。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
name: ingress-pay
namespace: critical-space
spec:
rules:
- http:
paths:
- backend:
serviceName: pay-service
servicePort: 8282
path: /pay
...
デプロイ済み Ingress に対する基本操作
デプロイ作業自体は次のセクションで行う。
ここでは、確認や編集といった基本的な操作について紹介。
デプロイされている Ingress Controller の確認
$ kubectl get deployment --all-namespaces
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
app-space default-backend 1 1 1 1 16m
app-space webapp-video 1 1 1 1 16m
app-space webapp-wear 1 1 1 1 16m
ingress-space nginx-ingress-controller 1 1 1 1 16m
kube-system coredns 2 2 2 2 32m
Ingress Resources の確認
$ kubectl get ingresses --all-namespaces
NAMESPACE NAME HOSTS ADDRESS PORTS AGE
app-space ingress-wear-watch * 80 22m
ルールの確認
以下のサンプルを利用。
$ kubectl describe ingress -n app-space ingress-wear-watch
...
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
*
/wear wear-service:8080 (<none>)
/watch video-service:8080 (<none>)
...
この場合、ホスト名に関するルールは設定されていない。path が /wear か /watch かで、宛先となるサービスが変わる。
また、どれにもマッチしない場合は Default backend: にて指定されているサービスが宛先となる。
ルールの編集
上の例で利用した ingress-wear-watch を編集してみる。
今回は、以下のような設定を追加する。
Ingress: ingress-wear-watch
Path: /stream
Backend Service: video-service
Backend Service Port: 8080
ルールの編集は kubectl edit でいけるらしい。
以下の通り、追記してやればいい。
$ kubectl -n app-space edit ingress ingress-wear-watch
...
rules:
- http:
paths:
- backend:
serviceName: wear-service
servicePort: 8080
path: /wear
- backend:
serviceName: video-service
servicePort: 8080
path: /watch
- backend:
serviceName: video-service
servicePort: 8080
path: /stream
...
デプロイ作業
1. namespace の作成
$ kubectl create namespace ingress-space
namespace/ingress-space created
2. ConfigMap の作成
$ kubectl create configmap nginx-configuration --namespace ingress-space
configmap/nginx-configuration created
3. ServiceAccount の作成
$ kubectl create serviceaccount ingress-serviceaccount --namespace ingress-space
serviceaccount/ingress-serviceaccount created
4. Role, RoleBindings の作成
Role のサンプル
$ kubectl get role ingress-role --namespace ingress-space
...
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
configmaps [] [] [get create]
configmaps [] [ingress-controller-leader-nginx] [get update]
endpoints [] [] [get]
namespaces [] [] [get]
pods [] [] [get]
secrets [] [] [get]
RoleBindings のサンプル
$ kubectl describe rolebindings ingress-role-binding --namespace ingress-space
...
Role:
Kind: Role
Name: ingress-role
Subjects:
Kind Name Namespace
---- ---- ---------
ServiceAccount ingress-serviceaccount
RoleBindings は ServiceAccount と紐付いている。
5. Ingress Controller の作成
Deployment リソースとして作成する。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: ingress-controller
namespace: ingress-space
spec:
replicas: 1
selector:
matchLabels:
name: nginx-ingress
template:
metadata:
labels:
name: nginx-ingress
spec:
serviceAccountName: ingress-serviceaccount
containers:
- name: nginx-ingress-controller
image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --default-backend-service=app-space/default-http-backend
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
6. NodePort の作成
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
name: nginx-ingress
name: ingress
namespace: ingress-space
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 30080
selector:
name: nginx-ingress
type: NodePort
status:
loadBalancer: {}
7. Ingress Resources の作成
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
name: ingress
namespace: app-space
spec:
rules:
- http:
paths:
- backend:
serviceName: wear-service
servicePort: 8080
path: /wear
- backend:
serviceName: video-service
servicePort: 8080
path: /watch
