Ingress - 실습
1. Nginx Controller 설치
1. Nginx 설치
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml
2. NodePort Service 생성
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/baremetal/service-nodeport.yaml
3. nodePort 변경
- 대시보드에서 Ingress-nginx Namespace의 서비스에 들어가기
- http의 nodePort는 30431, https는 30798로 변경
2. Service Loadbalancing
- 세 종류의 파드를 설치
- Ingress를 만들어서 해당 rule대로 접근하는 실습
Shopping Page
apiVersion: v1
kind: Pod
metadata:
name: pod-shopping
labels:
category: shopping
spec:
containers:
- name: container
image: kubetm/shopping
---
apiVersion: v1
kind: Service
metadata:
name: svc-shopping
spec:
selector:
category: shopping
ports:
- port: 8080
Customer Center
apiVersion: v1
kind: Pod
metadata:
name: pod-customer
labels:
category: customer
spec:
containers:
- name: container
image: kubetm/customer
---
apiVersion: v1
kind: Service
metadata:
name: svc-customer
spec:
selector:
category: customer
ports:
- port: 8080
Order Service
apiVersion: v1
kind: Pod
metadata:
name: pod-order
labels:
category: order
spec:
containers:
- name: container
image: kubetm/order
---
apiVersion: v1
kind: Service
metadata:
name: svc-order
spec:
selector:
category: order
ports:
- port: 8080
Ingress
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: service-loadbalancing
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: svc-shopping
servicePort: 8080
- path: /customer
backend:
serviceName: svc-customer
servicePort: 8080
- path: /order
backend:
serviceName: svc-order
servicePort: 8080
rules
를 보면path: /
,path: /customer
,path: /order
별로 다른 서비스에 연결시킴
실습 과정
- Shopping Page에 있는 파드와 서비스 생성(네임스페이스는 default)
- Customer Center의 파드와 서비스 생성
- Order Service의 파드와 서비스 생성
- 마스터 노드에서 각 서비스의 클러스터 아이피에 다음 명령어로 접근
Order
Customercurl 10.103.131.142:8080
Shoppingcurl 10.98.193.178:8080
curl 10.96.99.95:8080
- Ingress 생성
- 마스터 노드에서 마스터 아이피로 각 다른 포트 접속
Shopping
Ordercurl 192.168.35.30:30431/
Customercurl 192.168.35.30:30431/order
curl 192.168.35.30:30431/customer
3. Canary Upgrade
- 기존 서비스인 V1 파드를 만들고 Ingress를 만들어 연결
- Canary 테스트를 할 v2 파드 생성하고 그에 맞는 Ingress를 새로 연결
- Ingress는
@weight:10%
어노테이션을 줘서 10%가 v2에 연결되는지 확인
App V1
apiVersion: v1
kind: Pod
metadata:
name: pod-v1
labels:
app: v1
spec:
containers:
- name: container
image: kubetm/app:v1
---
apiVersion: v1
kind: Service
metadata:
name: svc-v1
spec:
selector:
app: v1
ports:
- port: 8080
App V2
apiVersion: v1
kind: Pod
metadata:
name: pod-v2
labels:
app: v2
spec:
containers:
- name: container
image: kubetm/app:v2
---
apiVersion: v1
kind: Service
metadata:
name: svc-v2
spec:
selector:
app: v2
ports:
- port: 8080
Ingress - Default
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: app
spec:
rules:
- host: www.app.com
http:
paths:
- backend:
serviceName: svc-v1
servicePort: 8080
rules
에host: www.app.com
으로 지정paths:
는 특별하게 지정하지 않고 바로svc-v1
으로 연결되도록 지정
Ingress - Weight
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: canary-v2
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
rules:
- host: www.app.com
http:
paths:
- backend:
serviceName: svc-v2
servicePort: 8080
annotations:
nginx.ingress.kubernetes.io/canary: "true"
: Canary 테스트를 할 거에요nginx.ingress.kubernetes.io/canary-weight: "10"
: 똑같은 도메인 이름으로 접근하면 10%만 이 서비스로 연결해줘요
Ingress - Header
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: canary-kr
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-by-header: "Accept-Language"
nginx.ingress.kubernetes.io/canary-by-header-value: "kr"
spec:
rules:
- host: www.app.com
http:
paths:
- backend:
serviceName: svc-v2
servicePort: 8080
annotations:
nginx.ingress.kubernetes.io/canary: "true"
: Canary 테스트를 할 거에요nginx.ingress.kubernetes.io/canary-by-header: "Accept-Language"
: 헤더키로 "Accept-Languag"를 줌nginx.ingress.kubernetes.io/canary-by-header-value: "kr"
: 헤더 벨류로 "kr"을 줌
실습 과정
- App V1의 파드와 서비스 생성
- Ingress - Default 생성
- 마스터 노드쉘에 다음과 같이 HostName 등록
```bash
cat << EOF >> /etc/hosts - 168.35.30 www.app.com
EOF
curl www.app.com:30431/version
![image](https://user-images.githubusercontent.com/28076542/109032892-7407a080-7709-11eb-89a4-51d3fd7c6341.png)
4. App v2의 파드와 서비스 생성
5. Ingress - Weight 생성
6. 마스터 노드에 다음 명령어로 1초에 한 번씩 도메인에 트래픽 날리기
```bash
while true; do curl www.app.com:30431/version; sleep 1; done
10번에 한 번 꼴로 v2에 연결 됨
7. Ingress - Weight 삭제
8. Ingress - Header 생성
9. 마스터 노드에서 다음 명령어로 도메인 접속
curl -H "Accept-Language: kr" www.app.com:30431/version
-H "Accept-Language: kr"
헤더키와 벨류를 줘서 curl 가능
4. SSL
- 파드를 만들고 Ingress를 생성
- Ingress는 Secret과 연결
- 마지막으로 https로 접속해볼 예정
App V1
apiVersion: v1
kind: Pod
metadata:
name: pod-https
labels:
app: https
spec:
containers:
- name: container
image: kubetm/app
---
apiVersion: v1
kind: Service
metadata:
name: svc-https
spec:
selector:
app: https
ports:
- port: 8080
Ingress - SSL
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: https
spec:
tls:
- hosts:
- www.https.com
secretName: secret-https
rules:
- host: www.https.com
http:
paths:
- backend:
serviceName: svc-https
servicePort: 8080
tls
옵션에 host 이름과 secretName을 넣었음rules
에는 트래픽에 들어올 호스트와 서비스 지정
실습 과정
App V1의 파드와 서비스 생성
Ingress - SSL 생성
Secret 생성
마스터 노드에서 다음 명령어로 인증서 파일 생성openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=www.https.com/O=www.https.com"
생성된 인증서 파일로 Secret 생성
kubectl create secret tls secret-https --key tls.key --cert tls.crt
Windows HostName 등록
C:\Windows\System32\drivers\etc\hosts
파일 열고
192.168.35.30 www.https.com
추가
http로 접근해보고, https로 접근해보기
http로 접근 -->http://www.https.com:30798/hostname
https로 접근 -->https://www.https.com:30798/hostname
출처
인프런 - 대세는 쿠버네티스
'네트워크 > k8s' 카테고리의 다른 글
[k8s] 40. Autoscaler - 실습 (0) | 2021.02.25 |
---|---|
[k8s] 39. Autoscaler - HPA (0) | 2021.02.25 |
[k8s] 37. Ingress - Nginx (0) | 2021.02.25 |
[k8s] 36. StatefulSet - 실습 (0) | 2021.02.25 |
[k8s] 35. StatefulSet (0) | 2021.02.25 |