CICD

쿠버네티스

dbfl9911 2024. 6. 10. 23:54
반응형

쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다.

쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다. 쿠버네티스는 크고, 빠르게 성장하는 생태계를 가지고 있다. 쿠버네티스 서비스, 기술 지원 및 도구는 어디서나 쉽게 이용할 수 있다.

 


 

① 쿠버네티스 설정

https://github.com/tangt64/training_memos/blob/main/opensource-101/kubernetes-101/command-collection.md

 

training_memos/opensource-101/kubernetes-101/command-collection.md at main · tangt64/training_memos

collection of training text memo . Contribute to tangt64/training_memos development by creating an account on GitHub.

github.com

 

- 마스터 및 노드 공통 설정

# /etc/ 환경 설정 파일 폴더에 yum.repos.d 안에 쿠버네티스 설정 파일(kubernetes.reop)이 있다.
master/node]# cat <<EOF> /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.26/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.26/rpm/repodata/repomd.xml.key
# exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
master/node]# dnf search --disableexcludes=kubernetes kubectl kubeadm kubelet
# 쿠버네티스 클러스터 구성 주요 패키지
master/node]# dnf install --disableexcludes=kubernetes kubectl kubeadm kubelet 
master/node]# setenforce 0
master/node]# vi /etc/selinux/config
> permissive

 

② 마스터 노드에서 쿠버네티스 구동하기

$ hostnamectl set-hostname master.example.com
$ kubeadm reset --force # init이 안된다면 reset하고 하면 된다.
$ kubeadm init --apiserver-advertise-address=192.168.10.10 --pod-network-cidr=192.168.0.0/16 --service-cidr=10.90.0.0/16

 

③ 쿠버네티스 클러스터 네트워크 구성하기

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/tigera-operator.yaml

                                                                                      ↓

[root@node1 ~]# kubectl get pods -A
tigera-operator   tigera-operator-7795f5d79b-w852z             1/1     Running   0          15s

                                                                                      ↓

 

curl -o calico-crd.yaml https://raw.githubusercontent.com/tangt64/training_memos/main/opensource-101/kubernetes-101/files/calico-quay-crd.yaml

                                                                                      ↓

[root@node1 ~]# ls
anaconda-ks.cfg  calico-crd.yaml

                                                                                      ↓

 

kubectl taint node master.example.com node-role.kubernetes.io/control-plane:NoSchedule-

                                                                                      ↓

 

kubectl apply -f calico-crd.yaml

                                                                                      ↓

 

kubectl get pods -A
calico-system     calico-kube-controllers-6ddc79c6c6-kl7d6     1/1     Running   0          48s
calico-system     calico-node-9xxmx                            0/1     Running   0          48s
calico-system     calico-typha-56d4f8b5b5-zf2wm                1/1     Running   0          48s

 

④ 쿠버네티스 배포 테스트 (사용자에게 배포 app 접속 port 열어주기)

kubectl run test-nginx --image=quay.io/redhattraining/hello-world-nginx:latest

여기서 app(nginx)은 node를 따로 만들지 않고 master node에서 직접 제공하였다.

kubectl get svc # 쿠버네티스에서 열린 port를 확인할 수 있다.
kubectl expose pod/test-nginx --name=nginx-8080 --type=NodePort --port=8080 # 원하는 포드를 원하는 포트번호, 이름으로 노출시킨다. 여기선 위에서 만든 nginx 포드를 열었따.
[root@node1 ~]# kubectl get svc # 확인했을때 임의로 30292 포트로 열린 걸 확인할 수 있고 사용자는 이 포트로 접속할 수 있다.
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.90.0.1      <none>        443/TCP          54m
nginx-8080   NodePort    10.90.31.50    <none>        8080:30292/TCP   4s

  kubectl (인프라 구축하는 사람?) 이 pod를 만든다. 여기서는 nginx를 이용하였다.

 

⑤ deployment, replicaset을 이용한 여러 개의 nginx서버 배포 테스트하기

kubectl create deployment release-nginx-service --dry-run=client --image=quay.io/redhattraining/hello-world-nginx:latest --port=8080 -o yaml > release-nginx-service.yaml

   yaml 파일을 만드는 과정

kubectl scale deployment release-nginx-service --replicas=10

   위처럼 하거나 오른쪽처럼 yaml파일 수정하고 delete했다가 create다시 해서 해도 됨. (replicas 개수를 조정하는 과정)

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: "2024-06-10T05:33:06Z"
  generation: 1
  labels:
    app: release-nginx-service
  name: release-nginx-service
  namespace: default
  resourceVersion: "18160"
  uid: de1612cf-e8f5-4ae9-a9c7-1ac55c738675
spec:
  progressDeadlineSeconds: 600
  replicas: 10 ######### 이걸 10개로 하면 10개의 서버 배포
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: release-nginx-service
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: release-nginx-service
    spec:
      containers:
      - image: quay.io/redhattraining/hello-world-nginx:latest
        imagePullPolicy: Always
        name: hello-world-nginx
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status: {}

 

vi release-nginx-service.yaml

kubectl delete -f release-nginx-service.yaml
kubectl create -f release-nginx-service.yaml

 

 

[root@node1 ~]# kubectl expose deployment/release-nginx-service --type=NodePort
service/release-nginx-service exposed
[root@node1 ~]# kubectl get svc
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes              ClusterIP   10.90.0.1      <none>        443/TCP          3h9m
nginx-8080              NodePort    10.90.31.50    <none>        8080:30292/TCP   135m
release-nginx-service   NodePort    10.90.52.195   <none>        8080:31960/TCP   4s
test-nginx              NodePort    10.90.208.94   <none>        80:31247/TCP     136m

                                                                                             ↓

 

    yaml파일에 containerPort를 명시했기 때문에 pod의 이름만 써서 열 수 있다.

       pod를 svc를 이용해 port 열어서 노출시키기

kubectl get pods

     pod가 잘 동작하는지 확인

 

⑥ podman에서 여러 버전의 컨테이너 실행하기

- master node에서 이미지를 생성

Containerfile-php

FROM quay.io/startx/php:latest
COPY ip.php /app

 

ip.php

<?php
$ip_server = $_SERVER['SERVER_ADDR'];
$hostname_server = gethostname();
echo $ip_server;
echo $hostname_server;
?>

 

- buildah로 이미지 생성하기 (master node에서 시행)

dnf install buildah skopeo -y
buildah bud -f Containerfile-php -t 192.168.10.250:5000/tang/php-ip:v1
buildah push --tls-verify=false 192.168.10.250:5000/tang/php-ip:v1
skopeo list-tags --tls-verify=false docker://192.168.10.250:5000/tang/php-ip

 

- 개발자가 생성한 이미지를 10개의 replica로 생성 (node1에서 실행)

podman pull --tls-verify=false 192.168.10.250:5000/tang/php-ip:v1

kubectl create deployment php-info-v1 --dry-run=client --replicas=10 --image=192.168.10.250:5000/tang/php-ip:v1 --port=8080 -o yaml > php-info-v1.yaml

kubectl apply -f php-info-v1.yaml

kubectl get deploy

 

- pod를 svc에 배포

kubectl expose deployment/php-info-v1 --type=NodePort

 

- swap이 켜져있으면 쿠버네티스가 잘 동작하지 않는다.

swapon -s ## 켜져있는지 확인
swapoff -a ## swap 종료하기
vi /etc/fstab ## 마지막줄 주석처리하면 영구적으로 끌 수 있다.
getenforce ## 확인
setenforce 0 ## permissive로 변경

 

⑦ deployment, replicaset을 이용한 여러 개의 nginx서버 배포 테스트하기

-  yaml 파일을 만드는 과정

kubectl create deployment release-nginx-service --dry-run=client --image=quay.io/redhattraining/hello-world-nginx:latest --port=8080 -o yaml > release-nginx-service.yaml

 

(replicas 개수를 조정하는 과정)

m1) 

kubectl scale deployment release-nginx-service --replicas=10

m2)

yaml파일 수정하고 delete했다가 create다시 하기

vi release-nginx-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: "2024-06-10T05:33:06Z"
  generation: 1
  labels:
    app: release-nginx-service
  name: release-nginx-service
  namespace: default
  resourceVersion: "18160"
  uid: de1612cf-e8f5-4ae9-a9c7-1ac55c738675
spec:
  progressDeadlineSeconds: 600
  replicas: 10 ######### 이걸 10개로 하면 10개의 서버 배포
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: release-nginx-service
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: release-nginx-service
    spec:
      containers:
      - image: quay.io/redhattraining/hello-world-nginx:latest
        imagePullPolicy: Always
        name: hello-world-nginx
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status: {}

 

yaml파일에 containerPort를 명시했기 때문에 pod의 이름만 써서 열 수 있다.

pod를 svc를 이용해 port 열어서 노출시키기

[root@node1 ~]# kubectl expose deployment/release-nginx-service --type=NodePort
service/release-nginx-service exposed
[root@node1 ~]# kubectl get svc
NAME                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes              ClusterIP   10.90.0.1      <none>        443/TCP          3h9m
nginx-8080              NodePort    10.90.31.50    <none>        8080:30292/TCP   135m
release-nginx-service   NodePort    10.90.52.195   <none>        8080:31960/TCP   4s
test-nginx              NodePort    10.90.208.94   <none>        80:31247/TCP     136m

- pod가 잘 동작하는지 확인

kubectl get pods

 

⑧ CRIO런타임 이미지 다운로드 설정

nano /etc/crio/crio.conf.d/10-crio.conf
> [crio.image]
> ...
> insecure_registries = [ "192.168.10.250:5000" ]
> registries = [ "192.168.10.250:5000" ]    
> ...
systemctl restart crio
반응형