# LoadBalancer
# vi loadbalancer-pod.yaml
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-pod
labels:
svc: nginx-pod-slb
spec:
type: LoadBalancer
externalIPs:
- 192.168.2.105
- 192.168.2.96
- 192.168.2.97
selector:
app: nginx-pod
ports:
- protocol: TCP
port: 7890
targetPort: 80
# kubectl apply -f loadbalancer-pod.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-pod
# Replicaset Pod
# vi replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
spec:
replicas: 3 # desired state (kube-controller-manager) # 파드의 갯수
selector:
matchLabels:
app:
nginx-replicaset
template:
metadata:
name: nginx-replicaset
labels:
app: nginx-replicaset
spec:
containers:
- name: nginx-replicaset-container
image: nginx
ports:
- containerPort: 80
name: http-web-svc # 태그와 같다
- template에는 사용하는 이미지나 contaienrPort 혹은 metatdata가 들어있기 때문에 pod의 정보가 들어있는 matchLabels와 labels의 이름을 갖게 해주어야한다.
# kubectl apply -f replicaset.yaml
# kubectl get replicasets.apps -o wide
# kubectl describe replicasets.apps nginx-replicaset
## clusterIP
# vi clusterip-replicaset.yaml # 클러스터아이피 야믈
apiVersion: v1
kind: Service
metadata:
name: clusterip-service-replicaset
spec:
type: ClusterIP
selector:
app: nginx-replicaset
ports:
- protocol: TCP
port: 20080
targetPort: http-web-svc # replicaset.yaml에서 정의 컨테이너 포트의 태그 이름
# kubectl apply -f clusterip-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-service-replicaset
- clusterIP는 외부 아이피를 제공하면 접근이 가능하다.
- 외부에서 pod에 접근하여 확인하고 싶은 내용이 있을때 쓰면 좋다
## nodePort
# vi nodeport-replicaset.yaml # 노드포트 야믈
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-replicaset
spec:
type: NodePort
selector:
app: nginx-replicaset
ports:
- protocol: TCP
port: 10080 # clusterIP-pod와의 포트 충돌을 막기위해 변경
targetPort: 80
nodePort: 32080 # (30000 ~ 32768)
# kubectl apply -f nodeport-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc nodeport-service-replicaset
- nodePort는 외부IP를 부여해도 접속이 안된다.
- 반드시 포트로 접근한다.
## LoadBalancer
# vi loadbalancer-replicaset.yaml # 로드밸런서 야믈
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-replicaset
spec:
type: LoadBalancer
externalIPs:
- 192.168.2.105
- 192.168.2.96
- 192.168.2.97
selector:
app: nginx-replicaset
ports:
- protocol: TCP
port: 8080
targetPort: http-web-svc
# kubectl apply -f loadbalancer-replicaset.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-replicaset
# Deployment Pod
# vi deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 4
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
spec:
containers:
- name: nginx-deployment-container
image: hyeongyun/web-site:aws
ports:
- containerPort: 80
# kubectl apply -f deployment.yaml
# kubectl get deployments.apps -o wide
# kubectl describe deployments.apps nginx-deployment
## clusterIP
apiVersion: v1
kind: Service
metadata:
name: clusterip-service-deployment
spec:
type: ClusterIP
externalIPs:
- 192.168.2.105
- 192.168.2.96
- 192.168.2.97
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 81
targetPort: 80
# kubectl apply -f clusterip-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc clusterip-service-deployment
## nodePort
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-deployment
spec:
type: NodePort
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 10080
targetPort: httpd-web-svc
nodePort: 30080
# kubectl apply -f nodeport-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc nodeport-service-deployment
## LoadBalancer
vi loadbalancer-deployment.yaml # 로드밸런서 야믈
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-deployment
spec:
type: LoadBalancer
externalIPs:
- 192.168.2.105
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 8081
targetPort: 80
# kubectl apply -f loadbalancer-deployment.yaml
# kubectl get svc -o wide
# kubectl describe svc loadbalancer-service-deployment
# 지우기
kubectl delete pod --grace-period=0 --force nginx-pod # nginx-pod지우기
kubectl delete rs nginx-replicaset # replicaset 지우기
# Deployment scaling
kubectl scale --current-replicas=4 --replicas=5 deployment/nginx-deployment
- 수동 스케일링; pod의 숫자가 4 -> 5
kubectl scale --replicas=6 deployment/nginx-deployment
- current를 쓰지 않을 때는 무작정 replicas를 해당 갯수로 만든다.
- 현재는 scaleOut
kubectl scale --replicas=4 deployment/nginx-deployment
- scaleIn
# Deployment 롤링 업데이트 제어
kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=hyeongyun/web-site:food
kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=nginx
- 1: aws
- 2: food
- 3: nginx
kubectl rollout undo deployment nginx-deployment
- 직전으로 돌아가기( 현재 nginx -> food)
- 새롭게 버전이 생성된다.
- 1: aws
- 3: food
- 4: food
# 도커 사설 스토리지
docker run -d -p 5000:5000 --restart=always --name private-docker-registry registry
- 도커 VM에 사설 스토리지 설치
- vi /etc/docker/daemon.json
- 해당 경로에 다음과 같이 편집(master1, worker1, worker2)
- food, aws 이미지의 태그를 지정하고 푸시
- 정상적으로 이미지가 올라간걸 확인하고
- curl을 통해 레지스트리에서 이미지가 있는걸 확인
- curl -X GET http://192.168.1.148:5000/v2/_catalog: repository 확인
- curl -X GET http://192.168.1.148:5000/v2/web-site/tags/list: tags의 리스트들 확인
- "docker pull 192.168.1.148:5000/web-site:aws" 이미지 Pull로 가져오기
# multi - container
Pod 안에 container를 두개 만드는 것
# vi multipod.yaml
apiVersion: v1
kind: Pod
metadata:
name: multipod
spec:
containers:
- name: nginx-container #1번째 컨테이너
image: nginx:1.14
ports:
- containerPort: 80
- name: centos-container #2번째 컨테이너
image: centos:7 # base image
command: # 실행할 명령어
- sleep
- "10000"
- centos:7의 이미지를 pull로 가져오고 tag를 지정한 후 push
- nginx도 마찬가지로 수행한다.
- docker pull nginx
- nginx latest로 tag 후 push
- vi multipod.yaml
- 위와 같이 multipod.yaml 파일 수정
- mutilpod로 접근했을 때는 어느 컨테이너에 위치에 있는지 모른다.
- cat /etc/os-release 명령어로 OS 확인 ; nginx
- cat /etc/redhat-release
- centos-container로 접근해서 루프백 주소로 curl 실행
- 이때 nginx 컨테이너가 이미 80포트를 열고있기 때문에 nginx의 페이지가 나온다
- 같은 pod안에 있으면 127.0.0.1 주소로 통신하고 있음을 알 수 있다.
- pod의 이름이 IP주소 역할을 해서 ping 통신이 가능하다
# multi-container안에 워드프레스 설치
## mysql:5.7 이미지
- mysql:5.7 이미지를 pull 가져오고 tag를 지정한다.
- mysql:5.7 이미지 사설 레지스트리에 push
## wordpress 이미지
kubectl pull wordpress
docker tag wordpress:latest 192.168.1.148:5000/wordpress:latest
docker push 192.168.1.148:5000/wordpress:latest
apiVersion: v1
kind: Pod
metadata:
name: wordpress-pod
labels:
app: wordpress-pod
spec:
containers:
- name: mysql-container
image: 192.168.1.148:5000/mysql:5.7
env:
- name: MYSQL_ROOT_HOST
value: '%' # wpuser@%
- name: MYSQL_ROOT_PASSWORD
value: mode1752
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wpuser
- name: MYSQL_PASSWORD
value: wppass
ports:
- containerPort: 3306
- name: wordpress-container
image: 192.168.1.148:5000/wordpress:latest
env:
- name: WORDPRESS_DB_HOST
value: wordpress-pod:3306
- name: WORDPRESS_DB_USER
value: wpuser
- name: WORDPRESS_DB_PASSWORD
value: wppass
- name: WORDPRESS_DB_NAME
value: wordpress
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-deployment-wordpress
spec:
type: LoadBalancer
externalIPs:
- 192.168.2.105
selector:
app: wordpress-pod
ports:
- protocol: TCP
port: 80
targetPort: 80
kubectl apply -f wp-multi-container.yaml
kubectl get pod
- master1의 주소로 워드프레스 접근(container 포트르 80으로 했기 때문에 바로 접근 가능)
- wp-multi-container.yaml의 포트 부분을 수정하고
- 이전에 워드프레스에서 수정한 Hello World 댓글을 확인한다.
- kubectl edit svc clusterip-pod
- clusterip-pod의 파일을 위와 같이 수정
- worker1의 주소를 넣어준다
- woker1의 주소로 3306 포트를 향해 접근
'Cloud Solution Architect > 쿠버네티스' 카테고리의 다른 글
Kubernetes6 (0) | 2023.06.09 |
---|---|
Kubernetes5 (0) | 2023.06.07 |
Kubernetest4 (0) | 2023.06.05 |
Kubernetes2 (0) | 2023.05.31 |
Kubernetes1 (0) | 2023.05.30 |