-
쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다.
쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다. 쿠버네티스는 크고, 빠르게 성장하는 생태계를 가지고 있다. 쿠버네티스 서비스, 기술 지원 및 도구는 어디서나 쉽게 이용할 수 있다.
① 쿠버네티스 설정
- 마스터 및 노드 공통 설정
# /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