2021-03-18 DockerHub Image Push & Pull
DockerHub로 image를 push 하고, 다른 node에서 image를 pull해봄.
DockerHub를 이용하여 Kubernetes Cluster에 POD 생성.
Kubernetes Cluster에 POD, Deployment, Service 생성 및 배포
PUSH: (push 작업은 저번에 time 이미지를 만들었던 worker node에서 작업한다.)
DockerHub 로그인 docker login
docker image tag 걸기
docker tag [이미지명] [DockerHub ID]/[repository명]:[tag명]
repository명은 DockerHub에 생성할 repository 이름을 작성해주면 됨.
docker image push
docker push [DockerHub ID]/[repository명]:[tag명]
이렇게 해주면 DockerHub에 실제로 repository가 생성되고, image가 올라간다. (시간 조금 소요)
PULL: (pull 은 반대로 time 이미지가 아직 존재하지 않는 master node에서 진행.)
docker pull [DockerHub ID]/[repository명]:[tag명]
성공적으로 time (1.0 ver) image 가 push 되고 pull 받아졌다.
kubectl [Command] [Type]/[Name] [Flags]
Command : 자원에 실행하려는 동작
create
: 자원 생성get
: 정보 가져오기describe
: 자세한 상태 정보delete
: 자원 삭제 logs
: describe 명령어와 함께 오류 처리 시 사용Type : 자원의 type
pod
: 하나의 container 또는 비슷한 container들의 집합.service
: pod는 DHCP로 IP가 할당되어 계속 IP가 바뀌게 되는데, service가 anchor 역할을 하게 되어(service는 고정IP) pod로의 접근을 가능하게 해 준다. 즉 pod를 가리키는 포인터 역할을 함.namespace
: 논리적으로 pod들을 구분하기 위함.deployment
: pod가 특정상태를 벗어나게 되면, 다시 정상상태로 되돌려줌.Name : 자원 이름
Flag : 옵션
쉬운 yaml file editing 을 위한 .vimrc
설정
set expandtab autoindent
kubernetes pod yaml 파일 생성 (test_pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: time
labels:
app: time
namespace: default
spec:
containers:
- name: time
image: dohyunkim12/time:1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8888
Pod 생성
kubectl apply -f test_pod.yaml
Pod 확인
kubectl get pod -o wide | grep time
( -o wide option은 Pod에 대한 전체적인 정보를 표시해줌. IP주소 포함.)
Pod 동작 확인
curl http://pod_ip:8888
*만약, 동작이 정상적으로 되지 않는다면 kubectl이나 kube-flannel 등이 문제일 수 있음. (time image는 정상이라는 가정 하에)
이럴 경우, kubectl get pod -A
해서 pod상태들을 확인해 보면, READY 되지 않은 pod들이 보임. 예를 들어 kube-flannel 이 정상작동하지 않는 경우, 이전에 작성했던 kube-flannel.yml 파일이 문제일 수 있음(syntax error). 따라서 파일을 다시 작성할 경우, kubectl delete -f kube-flannel.yml
로 먼저 pod를 삭제한 다음, 파일 수정 후, 다시 kubectl apply -f kube-flannel.yml
로 Pod를 생성시켜줌. 이후 kubectl get pod -A
로 다시 상태 확인.
apiVersion: apps/v1
kind: Deployment
metadata:
name: time
labels:
app: time
namespace: default
spec:
selector:
matchLabels:
app: time
replicas: 2 # 포드 생성 수. (과부하시 분산을 위한 목적)
template:
metadata:
labels:
app: time
spec:
containers:
- name: time
image: dohyunkim12/time:1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8888
kubectl apply -f test_deployment.yaml
kubectl get deployment
kubectl get pod
kubernetes pod yaml 파일 생성 (test_service.yaml)
apiVersion: v1
kind: Service
metadata:
name: time
spec:
selector:
app: time
ports:
- name: http
protocol: TCP
port: 8888
targetPort: 8888
Service 생성
kubectl apply -f test_service.yaml
Kubernetes Service 확인
kubectl get service
Service 요청 확인
curl http://ClusterIP:port