YOKOHEI.COM

YOKOHEI.COM

›Kubernetes Basics

Kubernetes Basics

  • Kubernetes Basics
  • Commands
  • Static Pod
  • Drain & Uncordon
  • Cluster Upgrade
  • Backup & Restore
  • Certification
  • RBAC
  • CNI
  • CoreDNS
  • Ingress

Kubernetes the Hard Way

  • the Hard Way?
  • AWS Prerequisites
  • CA and TLS
  • Configuration Files
  • Data Encryption
  • Bootstrapping etcd
  • Bootstrapping Control Plane
  • Bootstrapping Worker Node
  • kubectl configuraton
  • Pod Network
  • RBAC for Kubelet
  • Coredns Add-On
  • Test
  • TLS Bootstrapping

Amazon EKS

  • EKS Introduction
  • Ingress with ALB
  • PersistentVolume with EBS
  • NetworkPolicy with Calico
  • Secret with KMS
  • EKS Hands-On

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
← CoreDNSthe Hard Way? →
▼ Codes ▼
LeetCodeGitHub
▼ Profile ▼
LinkedInFlickr
▼ Logo made with DesignEvo ▼
DesignEvo
Copyright © 2020 Kohei Yoshida