ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스
    CICD 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

    'CICD' 카테고리의 다른 글

    레지스트리 서버 만들기  (0) 2024.06.13
    테크톤  (0) 2024.06.12
    pod, deploment, replicaset  (0) 2024.06.11
    pod, application container  (0) 2024.06.11
    CI/CD  (0) 2024.06.10
Designed by Tistory.