0부터 시작하는 Kubernetes 공부 - Kubernetes 살펴보기 & 실습 환경 구성

Jaehong Lee·2022년 10월 27일
1
post-thumbnail
post-custom-banner

Kubeconfig 파일

시작하기 전에

root@master:~# k get node
NAME      STATUS   ROLES                  AGE   VERSION
master    Ready    control-plane,master   34m   v1.21.1
worker1   Ready    <none>                 34m   v1.21.1
worker2   Ready    <none>                 34m   v1.21.1
worker3   Ready    <none>                 34m   v1.21.1
root@master:~# k get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-796cc7f49d-5gnrd   1/1     Running   0          11m
calico-node-dfgdw                          1/1     Running   0          11m
calico-node-mq4pm                          1/1     Running   0          11m
calico-node-nw8br                          1/1     Running   0          11m
calico-node-vjb9j                          1/1     Running   0          11m
coredns-558bd4d5db-k9h8f                   1/1     Running   0          34m
coredns-558bd4d5db-kwl77                   1/1     Running   0          34m
etcd-master                                1/1     Running   0          34m
kube-apiserver-master                      1/1     Running   0          34m
kube-controller-manager-master             1/1     Running   0          34m
kube-proxy-5r9v2                           1/1     Running   0          34m
kube-proxy-n9fdm                           1/1     Running   0          34m
kube-proxy-nr5qq                           1/1     Running   0          34m
kube-proxy-xkss6                           1/1     Running   0          34m
kube-scheduler-master                      1/1     Running   0          34m
  • 위 상태까지 구현하자
  • kubeadm init, docker login, calico CNI 설치

Kubeconfig

Kubeconfig 파일을 살펴보자

root@master:~# cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: [인증정보] #권한
    server: https://192.168.8.100:6443 #Cluster 주소
  name: kubernetes
contexts: # Cluster 와 User 의 Mapping 정보
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users: #사용자에 대한 정보
- name: kubernetes-admin
  user:
    client-certificate-data: [인증 정보]
    client-key-data: [key]
  • cluster : 접속하여 이용할 수 있는 Cluster 주소와 권한을 확인할 수 있다. 여기에 원격 Cluster 정보를 추가하여 원격지의 Cluster 도 조작 가능하다
  • user : 사용자들에 대한 정보와 인증 정보 ( Token, x.509 Root CA 하위의 인증서 ) 를 확인할 수 있다
  • context : Cluster 와 user 의 Mapping 정보를 확인할 수 있다

export KUBECONFIG 를 통해 위 파일을 변수로 지정하여 사용할 수 있다


Deployment 배포 & Update

Deployment 배포

yaml 파일은 선언적이다

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-rollout
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-ctn
          image: brian24/testweb:blue
  • Deployment 를 배포할 yaml 파일을 작성하자
kubectl apply -f deploy-nginx.yaml --record
  • 배포하자. 이때, record 옵션을 붙인다
docker pull brian24/testweb:blue
  • 만약, Image 가 잘 다운받아지지 않으면, Worker Node 에서 위 명령어를 통해 수동으로 다운받고 Pod 를 배포하자
root@master:~/lab1# k get pod -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP               NODE      NOMINATED NODE   READINESS GATES
nginx-rollout-5879d8579c-9kdj6   1/1     Running   0          65s   172.16.235.150   worker1   <none>           <none>
nginx-rollout-5879d8579c-cw89g   1/1     Running   0          65s   172.16.182.8     worker3   <none>           <none>
nginx-rollout-5879d8579c-qnt92   1/1     Running   0          65s   172.16.189.68    worker2   <none>           <none>

root@master:~/lab1# curl -L http://172.16.182.8
<h2>HELLO BLUE</h2>
  • 잘 배포되었다

Image Update

root@master:~/lab1# kubectl set image deploy nginx-rollout nginx-ctn=brian24/testweb:green --record
deployment.apps/nginx-rollout image updated
root@master:~/lab1# k get pod
NAME                             READY   STATUS              RESTARTS   AGE
nginx-rollout-5879d8579c-kvt8l   0/1     Terminating         0          10s
nginx-rollout-5879d8579c-n8g92   0/1     Terminating         0          10s
nginx-rollout-5879d8579c-zl2h2   1/1     Running             0          10s
nginx-rollout-b59495fc8-8x2db    0/1     ContainerCreating   0          2s
nginx-rollout-b59495fc8-9qjsz    1/1     Running             0          6s
nginx-rollout-b59495fc8-dpk67    1/1     Running             0          4s
  • set image 를 통해 배포된 Deployment 인 nginx-rollout 의 Container 인 nginx-ctn 의 Image 를 변경해보자
  • 기존에 Blue Image 를 통해 배포한 Pod 는 내려가고, Green Image 를 통해 Pod 가 새로 배포된다
docker pull brian24/testweb:green
  • 만약, 잘 안되면 Image 를 수동으로 다운받자
root@master:~/lab1# curl -L http://172.16.189.72
<h2>HELLO GREEN</h2>
  • 잘 적용되었다

Pod 의 업데이트

  • reCreate : 모두 삭제한 뒤 새로 생성
  • rollingUpdate : maxSerge, maxUnavailable 을 이용하여 기존 Pod 삭제 비율과 새로운 Pod 생성 비율을 결정하여 순차적으로 업데이트를 진행한다. 문제가 있다면 --record 를 이용하여 Rollback 이 가능하다. 단, 동시에 old, new 가 존재하게 된다
  • canary : 오픈소스인 " gloo " 를 이용하여 구현 가능하다. 테스트를 통해 안정성을 확보하고, 이후 새로운 버전으로의 업데이트가 가능하도록 할 수 있다

MetalLB

MetalLB 환경 구성

kubectl create ns metallb-system
  • metallb 를 위한 namespace 생성
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12.1/manifests/metallb.yaml
  • metallb Controller 와 Speacker 설치
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.8.201-192.168.8.239
  • ConfigMap 작성 및 배포
root@master:~/lab1# kubectl get deploy controller -n metallb-system -o wide
NAME         READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                               SELECTOR
controller   1/1     1            1           81s   controller   quay.io/metallb/controller:v0.12.1   app=metallb,component=controller
  • Controller 배포 확인
root@master:~/lab1# k get cm -n metallb-system
NAME               DATA   AGE
config             1      62s
kube-root-ca.crt   1      2m33s
  • ConfigMap 배포 확인

MetalLB 적용 확인

apiVersion: v1
kind: Service
metadata:
  name: nginxlb
  labels:
    app: nginx
spec:
  externalTrafficPolicy: Local
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  • LoadBalancer Service 배포를 위한 Yaml 파일 작성
root@master:~/lab1# k apply -f deploy-nginx.yaml
deployment.apps/nginx-rollout created
root@master:~/lab1# k apply -f lb-nginx.yaml
service/nginxlb created
root@master:~/lab1# k get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>          443/TCP        143m
nginxlb      LoadBalancer   10.96.121.136   192.168.8.201   80:31748/TCP   3s
  • 배포 및 확인

  • EXTERNAL-IP 로 접속하면 페이지가 잘 출력된다

  • update 하면 Green 으로 잘 변경되었다
profile
멋진 엔지니어가 될 때까지
post-custom-banner

0개의 댓글