Table of Contents
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 를 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 가 정상적으로 적용되는 것을 확인할 수 있습니다.