미래의 CI / CD 구축, NGINX Ingress + Cert-Manager

에서 개발 운영 엔지니어로이 튜토리얼에서는, 나는 내 경험을 공유 Cloudify.co은 , 이것이입니다 네 번째 포스트튜토리얼 나는 EKS 우리가에서 만든 클러스터에 Nginx에 침투이고 cert-관리자를 추가하는 방법을 설명합니다있는 이전 게시물 .

미래 게시 게시물 의 CI / CD 구축 :

Ingress 란 무엇입니까?

Ingress 는 클러스터 외부의 HTTP 및 HTTPS 경로를 클러스터 내의 서비스에 노출 합니다. 트래픽 라우팅은 Ingress 리소스에 정의 된 규칙에 의해 제어됩니다.

internet
|
[ Ingress ]
--|-----|--
[ Services ]

인 그레스는 서비스에 외부 적으로 연결 가능한 URL, 부하 분산 트래픽, SSL / TLS 종료 및 이름 기반 가상 호스팅을 제공하도록 구성 될 수 있습니다. 인 그레스 컨트롤러 는 일반적으로로드 밸런서를 사용하여 인 그레스를 수행 할 책임이 있지만 트래픽 처리를 돕기 위해 에지 라우터 또는 추가 프런트 엔드를 구성 할 수도 있습니다.

https://kubernetes.io/docs/concepts/services-networking/ingress/

NGINX Ingress 란 무엇입니까?

ingress-nginx는 NGINX 를 역방향 프록시 및로드 밸런서로 사용하는 Kubernetes 용 Ingress 컨트롤러입니다 .

https://github.com/kubernetes/ingress-nginx

Nginx Ingress를 설치하기 위해 Helm 패키지 관리자를 사용합니다.

Helm 패키지 관리자 설치

Helm 은 Kubernetes 용 패키지 관리자로 개발자와 운영자가 애플리케이션과 서비스를 Kubernetes 클러스터에보다 쉽게 ​​패키징, 구성 및 배포 할 수 있습니다.

Helm을 설치하려면 다음 참조 를 따르십시오 . homebrew를 사용하여 Mac에 Helm을 설치했습니다.

$ brew install helm

Helm v3에 안정적인 저장소 추가

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/

helm을 사용하여 ingress-nginx를 설치할 'ingress-nginx'네임 스페이스를 만들어 보겠습니다.

$ kubectl create ns ingress-nginx
$ helm install ingress-nginx stable/nginx-ingress -n ingress-nginx

생성 된 LB의 DNS 이름 : a5875a2383094446f952d4ac79051bc7–1133495909.us-east-1.elb.amazonaws.com

EKS 클러스터를 가리키는 DNS 레코드 만들기

도메인이 cicd-future.com이라고 가정 해 보겠습니다.

EKS 클러스터의 도메인은 eks.cicd-future.com입니다.

LoadBalancer 서비스 생성을 가리키는 A 레코드 * .eks.cicd-future.com을 추가해야합니다. 기본적으로 Ingress에서 LB를 생성했음을 가리키는 별칭입니다.

AWS의 route53을 사용하는 경우 Route53-> Hosted Zones-> 'cicd-future.com'으로 이동하여 생성 된 LB를 가리키는 새 A 레코드를 추가합니다.

A 레코드를 올바르게 정의했는지 확인하려면 'dig'를 사용하십시오.

$ dig eks.cicd-future.com

$ curl eks.cicd-future.com
default backend - 404%

DNS를 통해 연결할 수있는 EKS 클러스터 유효성 검사

올바르게 구성된 모든 것을 테스트하기 위해 수신 규칙이있는 간단한 Nginx 서버를 배포합니다.

$ kubectl run nginx --image nginx
$ kubectl expose deploy nginx --port 80

# Save as ingress-nginx.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-test
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: test.eks.cicd-future.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
# Deploy ingress rule
$ kubectl create -f ingress-nginx.yaml

$ curl test.eks.cicd-future.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Cert-Manager 란 무엇입니까?

cert-manager는 기본 Kubernetes 인증서 관리 컨트롤러입니다. Let 's Encrypt , HashiCorp Vault , Venafi , 간단한 서명 키 쌍 또는 자체 서명 과 같은 다양한 소스에서 인증서를 발급하는 데 도움이 될 수 있습니다 .

인증서가 유효하고 최신 상태인지 확인하고 만료되기 전에 구성된 시간에 인증서 갱신을 시도합니다.

https://cert-manager.io/docs/

Helm을 사용하여 EKS 클러스터에 cert-manager 설치

https://cert-manager.io/docs/installation/kubernetes/

네임 스페이스 생성, helm 저장소 추가 및 cert-manager 설치

# Create cert-manager namespace
$ kubectl create namespace cert-manager
# Add the Jetstack Helm repository
$ helm repo add jetstack https://charts.jetstack.io
# Update your local Helm chart repository cache
$ helm repo update
# Install needed CRDs
$ kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.14/deploy/manifests/00-crds.yaml
# Install using helm v3+
$ helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --version v0.14

$ kubectl get pods --namespace cert-manager

NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-5c6866597-zw7kh               1/1     Running   0          2m
cert-manager-cainjector-577f6d9fd7-tr77l   1/1     Running   0          2m
cert-manager-webhook-787858fcdb-nlzsq      1/1     Running   0

Let 's Encrypt 인증서를 발급하도록 클러스터 발급자 구성

Let 's Encrypt 인증서를 얻으려면 발급자를 생성해야합니다. 발급자 또는 ClusterIssuer 일 수 있습니다. 차이점은 발급자 가 단일 네임 스페이스로 범위가 지정되고 ClusterIssuer가 발급자 의 클러스터 전체 버전이라는 점입니다 .

Let 's Encrypt Issuer에는 스테이징 및 프로덕션 환경이 있으며 테스트를위한 스테이징 발급자부터 시작할 수 있으며 테스트에 더 적합한 (확장 된) 속도 제한이 있지만이 자습서에서는 프로덕션 ClusterIssuer 생성에 집중할 것입니다.

apiVersion: cert-manager.io/v1alpha3
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: admin@eks.cicd-future.com
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod
    # Enable the HTTP-01 challenge provider
    solvers:
    - http01:
        ingress:
          class: nginx

clusterissuer.yaml 배포

kubectl create -f clusterissuer.yaml

새 인증서를 발급하기 위해 'nginx'서버에 대한 수신 규칙을 수정하고 '주석'및 'tls'부분에주의합니다.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-test
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
  - hosts:
    - test.eks.cicd-future.com
    secretName: test-tls-prod
  rules:
  - host: test.eks.cicd-future.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
kubectl create -f my-ingress.yaml

'kubectl'을 사용하여 획득 한 인증서 및 상태를 확인할 수 있습니다.

$ kubectl get certificates -n cert-manager

이 게시물에서는 EKS 클러스터 용 NGINX Ingress를 설치 및 구성하는 방법, EKS 클러스터를 가리키는 route53을 사용하여 DNS 레코드를 생성하는 방법, ClusterIssuer 및 Let 's Encrypt 인증서를 사용하여 Cert-Manager를 설치 및 구성하는 방법을 설명했습니다.

읽어 주셔서 감사합니다. 즐거웠기를 바랍니다. 다음 게시물에서 뵙겠습니다.

이 튜토리얼의 다음 게시물이 게시 될 때 알림을 받고 싶다면 여기 미디엄과 트위터 (@warolv) 에서 저를 팔로우하세요 .

이 자습서를 복제 할 개인 블로그 : http://igorzhivilo.com ,이 자습서에서 만든 모든 구성을 Github (warolv)에 저장 합니다.

참고 문헌

https:///@warolv/build-ci-cd-of-the-future-with-kubernetes-aws-eks-and-jenkins-84b744f26949

https://kubernetes.io/docs/concepts/services-networking/ingress/

https://github.com/kubernetes/ingress-nginx

https://cert-manager.io/docs/

https://cert-manager.io/docs/installation/kubernetes/

Suggested posts

Kubernetes 디버깅 및 로컬 개발에 Telepresence 2 사용

Kubernetes 디버깅 및 로컬 개발에 Telepresence 2 사용

Telepresence 2는 최근에 출시되었으며 (Telepresence 1과 같이) Kubernetes 도구 상자에 추가 할 가치가 있습니다. Telepresence는 일상적인 작업 흐름이 어떻게 개선되는지 발견 한 후에는 살 수없는 도구 중 하나입니다.

HashiCorp Consul을 사용하여 Kubernetes에서 Canary 배포

HashiCorp의 Consul Connect 및 Ingress Gateway 기능을 사용하여 새 애플리케이션 릴리스를 출시하는 방법에 대한 대화 형 가이드입니다.

HashiCorp Consul을 사용하여 Kubernetes에서 Canary 배포

소개 애플리케이션 팀이 고객 대면 애플리케이션의 새 버전을 배포하고 출시 할 준비가 된 시나리오를 그려보십시오. 개발자는 엄격한 테스트를 수행했지만 애플리케이션이 프로덕션에 도달하면 클라이언트는 의도 한대로 서비스를 사용하지 못하게하는 잡히지 않은 버그에 부딪 힙니다.