ingress-container(LB) -> ingress -> VM's port1 or VM's port2 -> Node Port -> target Port
kubectl api-resources | grep ingress
: 버전 확인
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: default
port:
number: 80
- path: /shop
pathType: Prefix
backend:
service:
name: shop
port: 80
- path: /blog
pathType: Prefix
backend:
service:
name: blog
port: 80
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.2/deploy/static/provider/cloud/deploy.yaml
: ingress 컨트롤러 배포
cp shop-deploy-svc.yaml default-deploy-svc.yaml
cp shop-deploy-svc.yaml blog-deploy-svc.yaml
sed -i 's/shop/blog/g' blog-deploy-sve.yaml
sed -i 's/shop/default/g' default-deploy-sve.yaml
nodeport 아래와 같이 수정
배포
kubectl apply -f default-deploy-svc.yaml kubectl apply -f shop-deploy-svc.yaml kubectl apply -f blog-deploy-svc.yaml
master/manager 에서 curl 을 이용하여 노드포트를 통해 각 포드에 접속할 수 있는지 여부를 확인한다. 이는 클러스터 환경 외부(인터넷)에서의 접속을 확인하는 것은 아니고 내부적으로 정상 동작 여부를 확인하기 위한 것이다.
curl http://211.183.3.101:30000 -> nginx
curl http://211.183.3.101:30001 -> nginx
curl http://211.183.3.101:30002 -> httpd
마지막으로 위에서 작성했던 ingress-config.yaml을 배포한 뒤, kubectl get ing를 확인해 본다.
root@manager:~/k8slab/lab2# k get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-nginx none * 211.183.3.201 80 50s
윈도우에서 http://211.183.3.201 , http://211.183.3.201/shop, http://211.183.3.201/blog 확인
default: https://www.naver.com
shop: https://www.musinsa.com/app/
blog: https://www.kakaocorp.com
nginx -> default, shop
httpd -> blog
각각의 페이지는 configmap 을 이용하여 붙여넣기 해 보세요!!!
default(nginx) -> https://www.naver.com/
shop(nginx) -> https://www.coupang.com/
blog(httpd) -> https://www.kakaocorp.com/
아래와 같은 형태로 구조를 변경해 둔다.
├── blog │ ├── blog-deploy-svc.yaml │ └── index.html ├── default │ ├── default-deploy-svc.yaml │ └── index.html ├── ingress-config.yaml └── shop ├── index.html └── shop-deploy-svc.yaml curl -L http://www.naver.com > index.html
- vi default-deploy-svc.yaml: default 예시. shop, blog도 각각 맞게 적용
apiVersion: apps/v1 kind: Deployment metadata: name: default spec: replicas: 3 selector: matchLabels: app: default template: metadata: name: default labels: app: default spec: containers: - name: default image: nginx ports: - containerPort: 80 volumeMounts: - name: defaultvol mountPath: /usr/share/nginx/html volumes: - name: defaultvol configMap: name: defaultcm --- apiVersion: v1 kind: Service metadata: name: default spec: ports: - name: default-port port: 80 # service's port targetPort: 80 # Pod's Port nodePort: 30000 selector: app: default type: NodePort
서비스는 변경 내용 없음
kubectl create configmap defaultcm --from-file=index.html
: configmap 생성 후 재배포
- 일반적인 사용방법은 configMap과 거의 동일하지만, 저장된 secret을 describe를 통해 확인할 수는 없다.
- ssh, key, 인증서, username/password 등을 Pod 내에 전달할 때 주로 사용한다.
- 사설 저장소를 사용하는 경우 각 노드는 사설 저장소로 접속하기 위한 인증정보를 보유하고 있어야 한다. 인증정보에 포함되는 요소들은 username, password, 저장소의 주소
kubectl create secret generic dockerhub1 \ --from-file=.dockerconfigjson=/root/.docker/config.json \ --type=kubernetes.io/dockerconfigjson
docker-registry -> 현재 만드는 secret 은 일반적인 generic 이 아니라 도커 저장소에 접속을 위한 secret 으로 사용된다.(type 지정)
regcred -> secret 이름
--docker-server=사설저장소주소
[활용]
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: test-oracle
image: oraclelinux:latest
imagePullSecrets:
- name: dockerhub1
kubectl create secret generic dockerhub1 \ --from-file=.dockerconfigjson=/root/.docker/config.json \ --type=kubernetes.io/dockerconfigjson
: secret 파일생성