Kubeconfig 파일
시작하기 전에
root@master:~
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:~
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:~
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: [인증정보]
server: https://192.168.8.100:6443
name: kubernetes
contexts:
- 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
docker pull brian24/testweb:blue
- 만약, Image 가 잘 다운받아지지 않으면, Worker Node 에서 위 명령어를 통해 수동으로 다운받고 Pod 를 배포하자
root@master:~/lab1
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
<h2>HELLO BLUE</h2>
Image Update
root@master:~/lab1
deployment.apps/nginx-rollout image updated
root@master:~/lab1
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
<h2>HELLO GREEN</h2>
Pod 의 업데이트
- reCreate : 모두 삭제한 뒤 새로 생성
- rollingUpdate : maxSerge, maxUnavailable 을 이용하여 기존 Pod 삭제 비율과 새로운 Pod 생성 비율을 결정하여 순차적으로 업데이트를 진행한다. 문제가 있다면 --record 를 이용하여 Rollback 이 가능하다. 단, 동시에 old, new 가 존재하게 된다
- canary : 오픈소스인 " gloo " 를 이용하여 구현 가능하다. 테스트를 통해 안정성을 확보하고, 이후 새로운 버전으로의 업데이트가 가능하도록 할 수 있다
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
root@master:~/lab1
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
root@master:~/lab1
NAME DATA AGE
config 1 62s
kube-root-ca.crt 1 2m33s
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
deployment.apps/nginx-rollout created
root@master:~/lab1
service/nginxlb created
root@master:~/lab1
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 으로 잘 변경되었다