Kubernetes – ingress-nginx 설치

By | 2022년 10월 25일
Table of Content

Kubernetes – ingress-nginx 설치

service 외부 노출을 위한 ingress-nginx 를 설치합니다.

ingress 설치

git clone https://github.com/kubernetes/ingress-nginx.git
cd ./ingress-nginx/deploy/static/provider/baremetal
# kubectl apply -f .
kubectl apply -k ./
kubectl get deploy -n ingress-nginx
kubectl get svc -n ingress-nginx

# 사설인증서를 사용할 경우 아래 명령 실행
kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission

node 당 3개의 controller 를 실행하도록 수정합니다.

kubectl edit deployment/ingress-nginx-controller -n ingress-nginx

......
spec:
  replicas: 3
......
kubectl edit svc/ingress-nginx-controller -n ingress-nginx

......
  ports:
  - appProtocol: http
    name: http
    nodePort: 32080
    port: 80
    protocol: TCP
    targetPort: http
  - appProtocol: https
    name: https
    nodePort: 32443
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  sessionAffinity: None
  type: NodePort
......

서비스 연동 샘플

jenkins 설치

jenkins 를 ingress 로 연동합니다.

nodePort 는 제거하고, 서비스 포트를 80 으로 변경합니다.

vi jenkins.yaml
---------------------------
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: jenkins
spec:
  type: ClusterIP            # 이거
  ports:
  - name: http-port          # 이거
    port: 80
    protocol: TCP
    targetPort: 8080
  - name: jnlp-port
    port: 50000
    protocol: TCP
    targetPort: 50000
  selector:
    app: jenkins
---------------------------
kubectl apply -f jenkins.yaml
vi jenkins-ingress.yaml
---------------------------
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-jenkins
  namespace: jenkins
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: "k8s-jenkins.skyer9.pe.kr"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: jenkins
            port:
              number: 80
---------------------------
kubectl apply -f jenkins-ingress.yaml

클러스터 외부에서는 ingress-nginx 포트를 이용해서 접속합니다.

kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.106.157.74   <none>        80:32080/TCP,443:32443/TCP   164m
ingress-nginx-controller-admission   ClusterIP   10.105.6.182    <none>        443/TCP                      164m

http://k8s-jenkins.local:32080/ 로 접속하면 젠킨스가 접속됩니다.

클러스터 내부에서는 호스트 파일에 도메인 등록 후(10.106.157.74) 접속합니다.

sudo vi /etc/hosts
---------------------------
10.106.157.74 k8s-jenkins.skyer9.pe.kr
---------------------------

https 적용하기

여기 를 참조하여 jenkins 용 사설인증서를 생성합니다.

아래 명령으로 secret 을 생성합니다.

kubectl create secret tls jenkins-jenkins-svc-cluster-local --key jenkins/jenkins.key --cert jenkins/jenkins.crt -n jenkins
vi jenkins-ingress.yaml
---------------------------
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-jenkins
  namespace: jenkins
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
  - hosts:
    - jenkins.jenkins.svc.cluster.local
    secretName: jenkins-jenkins-svc-cluster-local
  rules:
  - host: "jenkins.jenkins.svc.cluster.local"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: jenkins
            port:
              number: 80
---------------------------
kubectl apply -f jenkins-ingress.yaml

rootCA.crt 인증서를 PC 또는 브라우저에 등록 후,
호스트 파일에 아래 내용을 추가합니다.

218.111.222.333    jenkins.jenkins.svc.cluster.local

아래 주소로 접근시 https 가 정상적으로 적용되는 것을 확인할 수 있습니다.

https://jenkins.jenkins.svc.cluster.local:32443/

답글 남기기