master1 접속
deployment 폴더 생성 후 deployment.yaml 파일 생성
vi deployment.yaml # manifest 작성(: yaml파일로 작성해 놓은 선언적 API)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
name: nginx-deployment
labels:
app: nginx-deployment # selector는 이 라벨과 일치하는 것을 찾는다.
spec:
containers:
- name: nginx-deployment-container
image: nginx
ports:
- containerPort: 80
pod간에 통신할 수 있음
apply로 create 한다.
vi clusterip-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: clusterip-service-deployment
spec:
type: ClusterIP
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
cluster간에 소통할 수 있는 ip
이 ip는 웹브라우저에서는 접속 못하고 curl로만 접속 여부를 확인할 수 있다.
vi nodeport-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: nodeport-service-deployment
spec:
type: NodePort
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30088
nodePort를 내가 원하는 포트로 바꿀 수 있다.
만약 없으면 랜덤한 포트가 잡힌다.
clusterIP와 포트번호가 보인다.
worker1, worker2 노드에 :30088 포트로 접속 가능하다. (master에는 pod가 설치돼있지 않기 때문에)
3개의 엔드 포인트가 연결되어 있다.
vi loadbalancer-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: loadbalancer-service-deployment
spec:
type: LoadBalancer
externalIPs:
- 192.168.0.50
- 192.168.0.51
- 192.168.0.52
selector:
app: nginx-deployment
ports:
- protocol: TCP
port: 80
targetPort: 80
3개의 ip를 둔다.
롤링 업데이트
kubectl edit deployments.apps
kubectl edit deployment nginx-deployment
로 해도 된다.
replica의 개수를 4개로 늘린다.
4개로 늘어났다.
롤백하기
들어가면 이런 홈페이지가 뜬다.
1번에 대한 정보를 알 수 있다.
이거를 하고 다시 돌아가면 되어야 하는데 안된다.
레지스트리 만들기
docker login
master와 worker노드에 docker login 한다.
docker run -d -p 5000:5000 --restart=always --name private-docker-registry registry
vi etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"insecure-registries":["192.168.0.50:5000"]
}
insecure 부분을 추가한다. 이를 master, worker 노드에 다 추가한다.
docker tag~
docker push 192.168.0.50:5000/test_commit:v1.0
vi deployment.yaml 에서 192.168.0.50:5000/test_commit:v1.0 로 바꾸기
kubectl apply -f deployment.yaml
kubectl apply -f loadbalancer-deployment.yaml
kubectl get pod po -o wide
kubectl get no -o wide
kubectl set image deployment.apps/nginx-deployment nginx-deployment-container=192.168.0.50:5000/test_commit:v1.0
들어가면 foodwagon 뜬다
kubectl rollout history deployment nginx-deployment
kubectl rollout history deployment nginx-deployment --revision=2
kubectl rollout undo deployment nginx-deployment
kubectl rollout undo deployment nginx-deployment --to--revision=2 //특정 리비전으로 돌아갈 수 있음
kubectl get all
그려면 nginx로 바뀐다.
Ingress
일종의 서비스
nginx에서 만든 도구를 가져다 쓰는 것
# yum install git
# git clone https://github.com/hali-linux/_Book_k8sInfra.git
# kubectl apply -f /root/_Book_k8sInfra/ch3/3.3.2/ingress-nginx.yaml
# kubectl get pods -n ingress-nginx
nginx의 컨트롤러가 생성되어있다.
# mkdir ingress && cd $_
# vi ingress-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: foods-deploy
spec:
replicas: 1
selector:
matchLabels:
app: foods-deploy
template:
metadata:
labels:
app: foods-deploy
spec:
containers:
- name: foods-deploy
image: halilinux/test-home:v1.0
---
apiVersion: v1
kind: Service
metadata:
name: foods-svc
spec:
type: ClusterIP
selector:
app: foods-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sales-deploy
spec:
replicas: 1
selector:
matchLabels:
app: sales-deploy
template:
metadata:
labels:
app: sales-deploy
spec:
containers:
- name: sales-deploy
image: halilinux/test-home:v2.0
---
apiVersion: v1
kind: Service
metadata:
name: sales-svc
spec:
type: ClusterIP
selector:
app: sales-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: home-deploy
spec:
replicas: 1
selector:
matchLabels:
app: home-deploy
template:
metadata:
labels:
app: home-deploy
spec:
containers:
- name: home-deploy
image: halilinux/test-home:v0.0
---
apiVersion: v1
kind: Service
metadata:
name: home-svc
spec:
type: ClusterIP
selector:
app: home-deploy
ports:
- protocol: TCP
port: 80
targetPort: 80
---로 구분해서 하나의 파일에 넣을 수 있다.
pod의 ip로 접속할 수 있다.
pod의 ip 범위를 처음에 init할 때 10.244.0.0/16 으로 했으므로 이 범위 내에 있다
foods-deploy~ 로 접속한다.
# vi ingress-config.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations: # 주석 : 예: 저자, 연락처…
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http: #타겟 그룹 세팅과 유사하다.
paths:
- path: /foods
backend:
serviceName: foods-svc
servicePort: 80
- path: /sales
backend:
serviceName: sales-svc
servicePort: 80
- path:
backend:
serviceName: home-svc # /뒤 -> 디폴트 값은 home
servicePort: 80
/ 다음에 food가 들어오면 food의 service로, sales는 sales로, 아무것도 아니면 home으로 가도록 설정한다.
vi ingress-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx #기재 안하면 디폴트값
spec:
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
selector:
app.kubernetes.io/name: ingress-nginx # 예약키 - value
type: LoadBalancer
externalIPs:
- 192.168.0.50
경로 기반 라우팅이 가능해진다.
kubectl set image deployment.apps/foods-deploy foods-deploy=hyun141/web-site:v1.0
Volume 관리
PV = Persistent volume
pod가 사라지더라도 그 volume이 손실되지 않도록 한다. AWS의 EC2와 EBS간의 관계와 비슷하다.
pv-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Mi
accessModes:
- ReadWriteOnce #ReadWriteMany도 있음
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Mi
selector:
matchLabels:
type: local
---
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
labels:
app: task-pv-pod
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim #위에 metadata의 name을 참조함
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
경로에 아무것도 없어서 403 forbidden이 뜬다.
task-pv-pod는 worker2에 있다.
data2에 마운트 되어 있다.
img 파일을 wokrer2 mnt에 옮긴다.
Vbox에서 설정 - 10MB로 만든다.
10MB이상의 img파일을 넣으면 어떻게 될까?
파일의 일부만 가기 때문에 쓸모없는 파일이 된다.
kubectl edit pv task-pv-volume
persistentVolumeReclaimPolicy : Delete
로 바꾸면 task-pv-pod를 지웠을 때 그 안의 데이터도 같이 지워지는가?
kubectl delete pod task-pv-pod
'Infra > Kubernetes' 카테고리의 다른 글
kubernetes 7 (0) | 2022.07.21 |
---|---|
kubernetes 5 (0) | 2022.07.20 |
kubernetes 4 (0) | 2022.07.19 |
kubernetes 2 (0) | 2022.07.16 |
Kubernetes 1 (0) | 2022.07.14 |