Infra/Kubernetes

kubernetes 3

서머스 2022. 7. 18. 18:09

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

 

master의 ip로 접속했을 때

 

 

/foods /sales 하면 다르게 나옴

 

경로 기반 라우팅이 가능해진다.

 

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