실습 환경
k8s-master-1 CentOS 7.8 IP : 192.168.56.102 |
k8s-master-2 CentOS 7.8 IP : 192.168.56.106 |
k8s-worker-1 CentOS 7.8 IP : 192.168.56.107 |
k8s-worker-2 CentOS 7.8 IP : 192.168.56.108 |
kubernetes cluster 구성은 아래 글을 참고해 주세요.
https://sh-safer.tistory.com/45
kubernetes cluster의 node 확인
쿠버네테스 클러스터가 마스터 노드 2개 워커 노드 2개로 이루어져 있는 상태입니다.
[root@k8s-master-1 kubespray]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 61m v1.18.5
k8s-master-2 Ready master 60m v1.18.5
k8s-worker-1 Ready worker 58m v1.18.5
k8s-worker-2 Ready worker 58m v1.18.5
Deployment 생성 및 확인
쿠버네티스에 어플리케이션 배포를 위해 deployment object를 사용합니다.
아래 코드를 nginx-deployment.yml 이름으로 생성합니다.
apiVersion: apps/v1 # 쿠버네티스 api 버전
kind: Deployment # 생성할 오브젝트 종류
metadata:
name: nginx-deployment # deployment의 이름
labels:
app: nginx # label 지정
spec: # deployment의 스펙을 정의
replicas: 3 # 3개의 pod 설정
selector: # deployment가 관리할 pod를 찾는 방법을 정의
matchLabels:
app: nginx
template:
metadata:
labels: # pod의 label
app: nginx
spec:
containers: # 컨테이너 설정
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
kubectl apply로 deployment 오브젝트를 생성합니다.
[root@k8s-master-1 task]# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
nginx-deployment를 확인해보면 pod 3개가 모두 실행 중인 것을 확인할 수 있습니다,
[root@k8s-master-1 task]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 50s
이번엔 pod를 조회해 보겠습니다. 3개 모두 정상적으로 Running 상태네요
[root@k8s-master-1 task]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-6b474476c4-5282f 1/1 Running 0 2m4s
nginx-deployment-6b474476c4-hxwms 1/1 Running 0 2m4s
nginx-deployment-6b474476c4-kgkv4 1/1 Running 0 2m4s
좀 더 상세히 확인해보면, 3개의 pod은 모두 k8s-worker-2 node에 올라가 있고 각각의 ip는 아래와 같습니다.
[root@k8s-master-1 task]# kubectl get pod -o yaml | grep worker
nodeName: k8s-worker-2
nodeName: k8s-worker-2
nodeName: k8s-worker-2
[root@k8s-master-1 task]# kubectl get pod -o yaml | grep " podIP: "
podIP: 10.233.88.5
podIP: 10.233.88.6
podIP: 10.233.88.7
현재 구성도는 아래와 같겠네요.
pod IP로 접속하면 정상적으로 nginx 디폴트 페이지가 뜨는 것을 확인할 수 있습니다.
하지만 pod는 언제든 죽고 다시 살아날 수 있는 오브젝트이기 때문에 그때마다 ip가 변경되어 해당 IP로는 서비스 용도로는 사용을 할 수 없습니다.
[root@k8s-master-1 task]# curl 10.233.88.5 | grep title
<title>Welcome to nginx!</title>
[root@k8s-master-1 task]# curl 10.233.88.6 | grep title
<title>Welcome to nginx!</title>
[root@k8s-master-1 task]# curl 10.233.88.7 | grep title
<title>Welcome to nginx!</title>
Service 생성 및 확인
생성한 deployment 오브젝트를 서비스 할 수 있도록 service 오브젝트를 생성합니다.
yaml 파일을 생성하여 아래 내용을 입력합니다.
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
type: NodePort # 서비스 타입
ports:
- port: 8080 # 서비스 포트
targetPort: 80 # 타켓, 즉 pod의 포트
protocol: TCP
name: http
selector:
app: nginx
kubectl apply로 service 오브젝트를 생성합니다.
[root@k8s-master-1 task]# kubectl apply -f nginx-svc.yaml
service/my-nginx created
서비스 확인
cluster ip를 통해 클러스터 내부에서 서비스에 접속할 수 있습니다.
[root@k8s-master-1 task]# kubectl get svc | grep my-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx NodePort 10.233.5.210 <none> 8080:32382/TCP 17s
NodePort는 Node의 임의의 Port 또는 지정된 Port를 통하여 외부에서 서비스에 접근이 가능합니다.
즉, 모든 호스트의(k8s-*) 32382 포트를 통해 서비스에 접근이 가능하다는 것입니다.
'IT > Docker & Kubernetes' 카테고리의 다른 글
[k8s] kubernetes(쿠버네티스) cordon drain uncordon (0) | 2020.12.30 |
---|---|
[k8s] kubernetes(쿠버네티스) node 추가 제거 (1) | 2020.07.18 |
[k8s] kubespray로 kubernetes(쿠버네티스) 설치하기 (2) | 2020.07.01 |
[Docker] 도커 학습 - 4. Dockerfile을 사용하여 이미지 생성 (0) | 2020.05.19 |
[Docker] 도커 학습 - 3. 이미지 & 컨테이너 삭제 명령어 (0) | 2020.05.12 |