티스토리 뷰
● 쿠버네티스는 다른 장비에서 실행되기 때문에, 백그라운드 실행 개념이 없다
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 |