TIL: 10월 11일 (월)

center

K8S Ingress

K8S Ingress

K8S Ingress

참고 자료: https://arisu1000.tistory.com/27840

인그레스 정의

인그레스(ingress)는 클러스터 외부에서 내부로 접근하는 요청들을 어떻게 처리할지 정의해둔 규칙들의 모음

할 수 있는 것들

  • 외부에서 접근가능한 URL을 사용할 수 있게 함
  • 트래픽 로드밸런싱
  • SSL 인증서 처리
  • 도메인 기반으로 가상 호스팅을 제공

이런 규칙들을 실제로 동작하게 해주는게 인그레스 컨트롤러(ingress controller)

K8S Ingress
  1. 클라우드 서비스는 별다른 설정없이 자사의 로드밸런서 서비스들과 연동해서 인그레스를 사용

  2. 직접 쿠버네티스 클러스터를 구축해서 사용하는 경우라면 인그레스 컨트롤러를 직접 인그레스와 연동

  3. 이때 가장 많이 사용되는건 쿠버네티스에서 제공하는 ingress-nginx(https://github.com/kubernetes/ingress-nginx)

K8S Ingress

YAML 예제

foo.bar.com으로 요청이 들어오더라도 뒷부분의 경로에 따라 /foos1이면 서비스 s1으로 연결되고 /bars2이면 서비스 s2쪽으로 연결

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foos1
        backend:
          serviceName: s1
          servicePort: 80
      - path: /bars2
        backend:
          serviceName: s2
          servicePort: 80
  - host: bar.foo.com
    http:
      paths:
      - backend:
          serviceName: s2
          servicePort: 80
Cert-manager

Cert-manager

Cert-manager

설명

  • cert-manager는 k8s에서 자동으로 TLS 인증서를 갱신해주는 쿠버네티스 에드온

  • kube lego 프로젝트에 기초

  • 유사 프로젝트로 kube-cert-manager가 존재

  • 외부 Issuers를 사용하거나 self-signed 방식으로 자동 갱신

openssl로 안하고 이걸 사용하는 이유는 인증서 자동 갱신 및 관리?

Cert-manager

설치

cert-manager 네임스페이스를 사용

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
Cert-manager

설치 확인

[root@stg-accordion1 twkang] k get all -n cert-manager 
NAME                                           READY   STATUS    RESTARTS   AGE
pod/cert-manager-7c6f78c46d-t9j4r              1/1     Running   0          100s
pod/cert-manager-cainjector-668d9c86df-lwhzv   1/1     Running   0          100s
pod/cert-manager-webhook-979688b46-zffvw       1/1     Running   0          100s

NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/cert-manager           ClusterIP   10.98.36.159    <none>        9402/TCP   101s
service/cert-manager-webhook   ClusterIP   10.102.126.21   <none>        443/TCP    101s

NAME                                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/cert-manager              1/1     1            1           101s
deployment.apps/cert-manager-cainjector   1/1     1            1           101s
deployment.apps/cert-manager-webhook      1/1     1            1           101s

NAME                                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/cert-manager-7c6f78c46d              1         1         1       101s
replicaset.apps/cert-manager-cainjector-668d9c86df   1         1         1       101s
replicaset.apps/cert-manager-webhook-979688b46       1         1         1       101s
Cert-manager
  • Cert-manager는 기본적으로 외부 Issuer(let's enscypt)가 아닌,
    Cluster 내부에서 사용할 수 있는 자체적으로 서명된 self-signed issuer를 생성

Issuer 뜻 = CA라고 칭하는 서명할 수 있는 주체를 지칭, Certificate(인증서)를 생성할 수 있는 발급기관

  • cluster 내부에서 사용하거나 테스트 용도로 사용하는 것이라면 self-signed 인증서를 사용하는 것도 좋은 방법
Cert-manager

시스템 구성도

  • cert-manager를 이용해서 클러스터 전역에서 사용할 수 있는 Cluster Issuer를 생성

  • 해당 Issuer를 이용해서 각각의 Namespace 별로 Certificate를 생성

클러스터/네임스페이스 스코프별로 ClusterIssuer, Issuer 리소스 따로 존재

Cert-manager

Usage

  1. Issuer 생성
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: selfsigned-issuer
spec:
  selfSigned: {}

결과

[root@stg-accordion1 twkang] k get clusterissuers.cert-manager.io -A
NAME                READY   AGE
selfsigned-issuer   True    4s
Cert-manager
  1. Certificate 생성
  • 생성된 ClusterIssuer를 사용해서 self-signed Certificate를 생성
  • 해당 Certificate는 속해있는 Namespace 내의 모든 서비스가 사용할 수 있는 인증서가 됨
  • 해당 인증서가 생성됨과 동시에 Certificate는 Kubernetes내에서 사용할 수 있도록 Public key, Secret key와 같은 데이터를 가진 secret 리소스가 생성
Cert-manager

아래 yaml을 apply 하면 certificate와 secret 리소스가 함께 생성 (v1 기준으로 작성: v1beta1은 yaml 스펙이 다름)

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: selfsigned-cert
  namespace: <네임스페이스명>
spec:
  secretName: selfsigned-cert-tls # Certificate와 동시에 함께 생성되는 secret의 이름
  duration: 2880h # 120d, 인증서의 유효기간
  renewBefore: 360h # 15d, 자동으로 인증서를 갱신할 때를 지정
  commonName: example.com # host name, dnsName 옵션과 함게 사용가능
  # commonName이 설정되지 않았을 경우에는 dnsName의 가장 첫번째 값을 commonName이 기본값
  isCA: false # CA서명이 유효하도록 하는 옵션
  privateKey:
    algorithm: RSA
    encoding: PKCS1
    size: 2048  
  usages: # 참고 https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1alpha2.KeyUsage
    - digital signature
    - key encipherment
    - server auth
  issuerRef:
    name: selfsigned-issuer
    kind: ClusterIssuer
    group: cert-manager.io
Cert-manager

결과

[root@stg-accordion1 twkang] k get certificate -n docs selfsigned-cert 
NAME              READY   SECRET                AGE
selfsigned-cert   True    selfsigned-cert-tls   9s
Cert-manager
  1. 생성되는 secret 데이터 확인
  • ca.crt: public certificate file
  • tls.crt: Public Key
  • tls.key: Private Key
[root@stg-accordion1 twkang] k get secrets -n docs 
NAME                       TYPE                                  DATA   AGE
selfsigned-cert-tls        kubernetes.io/tls                     3      10m
Cert-manager
  1. 생성된 TLS Secret을 Ingress에 적용
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # 1. add an annotation indicating the issuer to use.
    cert-manager.io/cluster-issuer: selfsigned-issuer
  name: myIngress
  namespace: myIngress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: myservice
            port:
              number: 80
  tls: # < 2. placing a host in the TLS config will determine what ends up in the cert's subjectAltNames
  - hosts:
    - example.com
    secretName: selfsigned-cert-tls # < 3. cert-manager will store the created certificate in this secret.