티스토리 뷰

● 쿠버네티스는 다른 장비에서 실행되기 때문에, 백그라운드 실행 개념이 없다

ex> docker run -d ~ 같은 -d 옵션이 옵션이 없다

 

● 전에 사용하던 Pods 제거

[vagrant@ms ~]$ kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS      AGE     IP            NODE              NOMINATED NODE   READINESS GATES
nginx   1/1     Running   1 (11h ago)   2d22h   10.244.1.63   wk1.example.com   <none>           <none>
test    2/2     Running   6 (14m ago)   2d20h   10.244.1.64   wk1.example.com   <none>           <none>

 

 

● apache.yml 생성

# 셀렉터의 내용이 파드의 내용과 같아야된다

 

[vagrant@ms work]$ cat apache.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: apache-pod
  labels:
    myapp: myweb
spec:
  containers:
  - name: myweb-container
    image: httpd:2.4
    ports:
      - containerPort: 80

 

 

 

● 윈도우에서 접속하기 위해 서비스 생성

# 서비스의 기본값은 ClusterIP

# NodePort 로 바꾸면 외부에서도 접속 가능

[vagrant@ms work]$ cat myweb-service.yml
---
apiVersion: v1
kind: Service
metadata:
  name: myweb-service
spec:
  ports:
  - port: 8001
    targetPort: 80


  selector:
    myapp: myweb
  type: NodePort

 

 

 

● apache.yaml 실행하여 pods 생성

[vagrant@ms work]$ kubectl create -f apache.yml
pod/apache-pod created

 

 

 

● 서비스 실행

[vagrant@ms work]$ kubectl create -f myweb-service.yml
service/myweb-service created

 

 

 

● 확인 내용

# 3대를 묶었을 때 ClusterIP

[vagrant@ms work]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
:1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.98.10   ms.example.com      ms
192.168.98.20   wk1.example.com     wk1
192.168.98.30   wk2.example.com     wk2
[vagrant@ms work]$ kubectl get service
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
myweb-service   NodePort   10.101.227.90   <none>        8001:32258/TCP   8s
[vagrant@ms work]$ kubectl get pods -o wide
NAME         READY   STATUS    RESTARTS   AGE     IP            NODE              NOMINATED NODE   READINESS GATES
apache-pod   1/1     Running   0          3m46s   10.244.1.65   wk1.example.com   <none>           <none>

 

 

● service 가 사용하는 IP 가 Cluster IP

>> 파드 IP 를 찾아서 보낸다  ( 파드 IP 는 해당 노드에서 밖에 사용 못하는 IP )

[vagrant@ms work]$ kubectl describe svc myweb-service
Name:                     myweb-service
Namespace:                myns
Labels:                   <none>
Annotations:              <none>
Selector:                 myapp=myweb
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.101.227.90
IPs:                      10.101.227.90
Port:                     <unset>  8001/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  32258/TCP
Endpoints:                10.244.1.65:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

 

 

● 접속 완료

# [ Node IP ] : Node Port 
>>> [ Cluster IP ] : Service Port
>>> [ Endpoint (pod 주소) : container Port

# 192.168.98.10:32258 >>>> 10.101.227.90:8001 >>>> 10.244.1.65:80

 

 

 

 

● Selector 와 Label 확인

 

○ 파드의 라벨

kubectl get pod --show-labels

NAME         READY   STATUS    RESTARTS   AGE   LABELS
apache-pod   1/1     Running   0          19m   myapp=myweb

 

서비스의 셀렉터

kubectl get service -o wide

NAME            TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE   SELECTOR
myweb-service   NodePort   10.96.136.5   <none>        8001:32611/TCP   17s   myapp=myweb

 

 

 

 

● sample namespace 만들기

# ns 는 리소스를 분할하고 권한을 각자 지정해주기 위해 사용한다 ex> project1 / project2

[vagrant@ms work]$ kubectl create ns sample
namespace/sample created

[vagrant@ms work]$ kubectl get ns
NAME              STATUS   AGE
default           Active   4d
kube-flannel      Active   3d23h
kube-node-lease   Active   4d
kube-public       Active   4d
kube-system       Active   4d
myns              Active   3d1h
sample            Active   3s

 

 

 

● sample namespace 로 변경

kubectl config set-context --current --namespace sample
kubectl config view
[vagrant@ms work]$ kubectl config set-context --current --namespace sample
Context "kubernetes-admin@kubernetes" modified.
[vagrant@ms work]$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://192.168.98.10:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    namespace: sample
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: DATA+OMITTED
    client-key-data: DATA+OMITTED

 

 

● namespace myns 에 있는 pod 지우기

kubectl delete pod --all --namespace myns

 

 

 

● 없으면 만들고 / 있으면 갱신

kubectl apply -f apache.yml

 

 

 

 

● Deployment >> Rolling Update / Roll Back

>> ng.dep.yaml 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14
        name: nginx
        ports:
        - containerPort: 80

 

 

 

● kubectl deployment 실행 

kubectl apply -f ng.dep.yml
kubectl get deployments.apps

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   10/10   10           10          65s

 

 

 

 

● 커맨드로 deployment 의 rolling upgrade

kubectl set image deployment/nginx nginx=nginx:1.15

 

# --record=true 는 추후 버전이 올라가면 사용 못한다

kubectl set image deployment/nginx nginx=nginx:1.15 --record=true
kubectl get replicasets.apps

NAME               DESIRED   CURRENT   READY   AGE
nginx-56496f7bdd   0         0         0       5m40s
nginx-847cd7fd69   10        10        10      18s

 

>> Rollback 할 수 있는 목록

 kubectl rollout history deployment
 
deployment.apps/nginx
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/nginx nginx=nginx:1.15 --record=true

 

 

▩ --record=true 를 안쓰는 이유

# yaml 파일로 버전을 계속 올려서 apply -f 를 사용했는데, --record=true 를 사용하니 오히려 더 헷갈린다

[vagrant@ms work]$ kubectl rollout history deployment
deployment.apps/nginx
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/nginx nginx=nginx:1.15 --record=true
3         kubectl set image deployment/nginx nginx=nginx:1.15 --record=true
4         kubectl set image deployment/nginx nginx=nginx:1.15 --record=true

 

 

● replicasets.apps 로 보면 제대로 볼 수 있다

 kubectl get replicasets.apps
NAME               DESIRED   CURRENT   READY   AGE
nginx-56496f7bdd   0         0         0       19m
nginx-6b8f6d655f   10        10        10      111s
nginx-847cd7fd69   0         0         0       14m
nginx-854bc88786   0         0         0       2m47s

 

 

 

 

● maxUnavailable 과 rollingUpdate 설정

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailabe: 1
      rollingUpdate: 10
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14
        name: nginx
        ports:
        - containerPort: 80

 

 

 

● 롤링 업데이트동안 동작하지 않아도 되는 pod 개수 지정 / 추가 실행될 수 있는 파드 개수 지정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 10
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.17
        name: nginx
        ports:
        - containerPort: 80

 

 

● 자세하게 deployments.apps 의 내용 확인시, 1.17 버전임을 확인할 수 있었다

kubectl describe deployments.apps

 

 

 

 

 

● rollout history 에 있는 Revision 번호에 따라 rollout 이 가능하다

kubectl rollout history deployment
 kubectl rollout undo deployment --to-revision=4

 

 

 

 

 

● 서비스까지 올려서 NodePort 까지 설정하기

# 마지막의 type: NodePort 를 입력하지 않으면 외부 접속이 안된다

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 8001
    targetPort: 80

  selector:
    app: nginx
  type: NodePort

 

 

 

● twoseven1408/test-nginx 이미지로 돌리니까 라운드로빈 확인할 수 있었다

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 10
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: twoseven1408/test-nginx
        name: nginx
        ports:
        - containerPort: 80

 

https://hub.docker.com/r/twoseven1408/test-nginx/tags

 

Docker

 

hub.docker.com

 

 

'Kubernetes [ 쿠버네티스 ]' 카테고리의 다른 글

Kubernetes - 볼륨  (1) 2024.03.11
Kubernetes 멀티 컨테이너 사용  (0) 2024.03.11
Kubernetes 시작 전 점검 사항  (0) 2024.03.11
Kubernetes LoadBalacer Type  (0) 2024.03.08
Kubernetes deployment  (0) 2024.03.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함