클러스터 내부 통신을 위한 서비스 (ClusterIP):
클러스터 내부 통신을 위해 서비스를 생성합니다. 이 서비스는 ClusterIP를 사용하여 클러스터 내에서 내부 통신을 지원합니다.
외부 노드 포트 밸런싱을 위한 서비스 (NodePort):
외부 노드 포트 밸런싱을 설정하기 위해 서비스를 생성합니다. NodePort 서비스를 사용하여 외부 트래픽을 클러스터 내부 서비스로 라우팅합니다
대규모 인그레스를 설정하기 위해 Ingress 리소스를 생성합니다. 이 예제에서는 Nginx Ingress Controller를 사용하겠습니다.
먼저, Ingress Controller를 설치하고 설정해야 합니다
minikube를 시작해줍니다.
mimikube 상태를 확인 합니다.
minikube ip를 확인하고, ssh로 로그인해 줍니다.
로그인 해서 docker ps로 상태를 확인하면 여러가지 쿠버네티스 내의 컨테이너들을 볼 수 있습니다.
다시 나가서 kubectl 버전을 확인해 줍니다.
디렉터리를 하나 만들고 yml 파일을 만들어 docker compose로 구동해 보겠습니다.
docker-compose.yml
version: "3"
services:
wordpress:
image: wordpress:5.5.3-apache
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: password
ports:
- "30000:80"
mysql:
image: mysql:5.6
environment:
MYSQL_ROOT_PASSWORD: password
구동을 한 뒤 30000번 대역으로 외부에서 접속해주겠습니다.
아래에 보면 접속이 잘 되는 것을 볼 수 있습니다.
이번엔 kubenete를 사용해 wordpress를 실행해보겠습니다.
yml파일을 하나 만들어 주고 아래의 코드를 넣습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mariadb:10.7
name: mysql
env:
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_ROOT_PASSWORD
value: password
ports:
- containerPort: 3306
name: mysql
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:5.9.1-php8.1-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_NAME
value: wordpress
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
value: password
ports:
- containerPort: 80
name: wordpress
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
type: NodePort
ports:
- port: 80
selector:
app: wordpress
tier: frontend
kubectl을 이용해서 적용시킵니다.
ubuntu@ubuntu:~/test$ kubectl apply -f wordpresss-kubenetes.yml
deployment.apps/wordpress-mysql created
service/wordpress-mysql created
deployment.apps/wordpress created
service/wordpress created
kubectl get all을 통해 확인을 할 수 있습니다.
ubuntu@ubuntu:~/test$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/wordpress-6b75557cc6-gcdjk 0/1 ContainerCreating 0 16s
pod/wordpress-mysql-848dfdb5c5-fjn68 0/1 ContainerCreating 0 16s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18d
service/wordpress NodePort 10.108.154.57 <none> 80:32096/TCP 16s
service/wordpress-mysql ClusterIP 10.96.206.239 <none> 3306/TCP 16s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/wordpress 0/1 1 0 16s
deployment.apps/wordpress-mysql 0/1 1 0 16s
시간이 조금 지나서 다시 확인해보면 상태가 다 Running으로 바뀐 것을 알 수 있습니다.
외부포트 32096으로 접속하면 잘 접속이 되는 것을 확인 할 수 있습니다.
이제 docker compose와 무엇이 다른 지 확인해 보겠습니다. kubectl을 통해 pod를 지우고
다시 확인하면 다른 pod가 생성됨을 볼 수 있습니다.
이것이 쿠버네티스의 장점입니다. 지워도 새로운 것으로 다시 만들어 줍니다.
이번엔 pod를 늘려보게씁니다. 아래와 같이 spec부분에 replicas를 설정해주면
아래와 같이 총 5대의 pod가 작동하는 것을 볼 수 있습니다.
kubectl을 통해 node명을 확인할 수 있습니다.
kubectl을 통해 label의 이름을 확인할 수 있습니다.
kubectl describe명령어를 통해 다양한 것을 확인할 수 있는데 Events를 통해서는
어디서 오류가 났는지 확인할 수 있습니다..
log도 확인할 수 있는데 wordpress접속 후 언어 선택하고 들어가면 다양한 로그를 확인할 수 있습니다.
도커 허브에서 가져오기
도커허브에서 가져오기
ubuntu@ubuntu:~/test$ docker pull myoungseok/echo:v1
ubuntu@ubuntu:~/test$ docker tag myoungseok/echo:v1 cloudwoong/echo:v1
ubuntu@ubuntu:~/test$ docker push cloudwoong/echo:v1
컨테이너 구동하기
지우고 echo-app.yml파일 작성하고 확인하기
apiVersion: v1
kind: Pod
metadata:
name: echo
labels:
app: echo
spec:
containers:
- name: app
image: myoungseok/echo:v1
healthing check -> probe-> http get
[livenessProbe]
살아있는지 확인하는 경우
/[readinessProbe]
준비가 안됬는데 확인하는 경우
livenessprobe
ubuntu@ubuntu:~/test$ nano livenessprobe.yml
ubuntu@ubuntu:~/test$ kubectl apply -f liveprobeness.yml
pod/echo-lp created
ubuntu@ubuntu:~/test$ kubectl get po
NAME READY STATUS RESTARTS AGE
echo-lp 1/1 Running 1 (6s ago) 16s
ubuntu@ubuntu:~/test$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
echo-lp 0/1 CrashLoopBackOff 2 (5s ago) 30s 10.244.0.27 minikube <none> <none>
ubuntu@ubuntu:~/test$ kubectl logs echo-lp
{"level":30,"time":1698029881232,"pid":8,"hostname":"echo-lp","msg":"Server listening at http://0.0.0.0:3000"}
{"level":30,"time":1698029881233,"pid":8,"hostname":"echo-lp","msg":"server listening on http://0.0.0.0:3000"}
ubuntu@ubuntu:~/test$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
echo-lp 1/1 Running 4 (6s ago) 51s 10.244.0.27 minikube <none> <none>
readinessProbe
ubuntu@ubuntu:~/test$ kubectl get po
NAME READY STATUS RESTARTS AGE
echo-rp 0/1 Running 0 8s
ubuntu@ubuntu:~/test$ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
echo-rp 0/1 Running 0 18s 10.244.0.28 minikube <none> <none>
liveness&readiness 구동
echo-lp-rp.yml
apiVersion: v1
kind: Pod
metadata:
name: echo-health
labels:
app: echo
spec:
containers:
- name: app
image: myoungseok/echo:v1
livenessProbe:
httpGet:
path: /
port: 3000
readinessProbe:
httpGet:
path: /
port: 3000
counter-redis만들기
apiVersion: v1
kind: Pod
metadata:
name: counter
labels:
app: counter
spec:
containers:
- name: app
image: myoungseok/counter-redis:latest
env:
- name: REDIS_HOST
value: "localhost"
- name: db
image: redis
다른 것과 다르게 pod안에 2개의 컨테이너가 들어간다.
db app 둘다 따로따로 들어가서 확인할 수 있다.
ubuntu@ubuntu:~/test$ kubectl logs counter db
ubuntu@ubuntu:~/test$ kubectl exec -it counter -c app -- sh
/app # curl localhost 30000
/app # curl localhost:3000
1
/app # curl localhost:3000
2
/app # curl localhost:3000
3
/app # curl localhost:3000
4
/app # curl localhost:3000
5
/app # telnet localhost:6379
Connected to localhost:6379
keys *
*1
$5
count
get count
$1
5