[Kubernetes] 2일차 수업 정리

soyeon·2022년 9월 30일
0
post-thumbnail

VM-k8s : 1.24.5에서 1.24.6으로 upgrade 예정
6443 port - kube-apiserver(kubernetes의 center) port
6443 port를 이용해서 보안접근을 한다.

GKE : 1.22.12
GKE는 localhost:8001로 접근한다. 8001 port - kubernetes proxy port

Kubernetes for microservice

  • Google Cloud SDK에서 dashboard v2.4
## dashboard 설치
C:\Users\user\AppData\Local\Google\Cloud SDK>kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
C:\Users\user\AppData\Local\Google\Cloud SDK>kubectl get po -A

## rollbinding 필요
C:\Users\user\AppData\Local\Google\Cloud SDK>kubectl get sa -n kubernetes-dashboard
NAME                   SECRETS   AGE
default                1         93s
kubernetes-dashboard   1         92s

## * 권한 가지고 있는지 확인
C:\Users\user\AppData\Local\Google\Cloud SDK>kubectl describe clusterrole cluster-admin
Name:         cluster-admin
Labels:       kubernetes.io/bootstrapping=rbac-defaults
Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  *.*        []                 []              [*]
             [*]                []              [*]
             
C:\k8s\dashboard_token>kubectl apply -f ClusterRoleBind.yaml
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard2 created

C:\k8s\dashboard_token>kubectl -n kubernetes-dashboard get sa
NAME                   SECRETS   AGE
default                1         6m55s
kubernetes-dashboard   1         6m54s

## 여기에는 token이 존재한다.
C:\k8s\dashboard_token>kubectl -n kubernetes-dashboard get secret
NAME                               TYPE                                  DATA   AGE
default-token-7chpc                kubernetes.io/service-account-token   3      7m9s
kubernetes-dashboard-certs         Opaque                                0      7m7s
kubernetes-dashboard-csrf          Opaque                                1      7m7s
kubernetes-dashboard-key-holder    Opaque                                2      7m6s
kubernetes-dashboard-token-8fjlh   kubernetes.io/service-account-token   3      7m9s

C:\k8s\dashboard_token>kubectl -n kubernetes-dashboard describe secret kubernetes-dashboard-token-8fjlh
eyJhbGciOiJSUzI1NiIsImtpZCI6Ik9PLUpKcUNCSzhMMHRDZlBCTm9Vd1lOQmctenJYcy1fNGlxdE92aDdBUDgifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi04ZmpsaCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjQ2ZTdjYjNkLTY2YmYtNDQzZS1hMzlmLThkYTBlMWViOWFkYyIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.j7jUQTTFONdWutTpUwQ0dCZwbG_3zri6zjy3EOqoxPZwjXwWJKhsJKQxfRI-m2MTlnEjUFjsdA9cTWIDELkeVXSCb81CY6Jl_ylgLFbHcaCHQbRwx7P3weKDvA-JrrfoSMQlttST_3w9JQPlGNrvWznMNXfulPSggP3kFL2rLeIY3RDhJJDILgYG98ZxF4gF6GHIJ0W9BVjonRmWeaLzzkBaG11MaSE3HIHkTY0Fye9eX9dfpsl92Tu6cuxEIZ7BnSwLDQiVXlPBk7Vnl-nkwl_odLWiBnKL0GS6VqX9H1QIO9w5eRePa8dWgFEvvmMYhAd8GvVIuDIVrnxjN4e8Ww

C:\Users\user>kubectl proxy
Starting to serve on 127.0.0.1:8001

## http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login 접속

prometheus + grafana

Prometheus
: node 각각에 exporter를 붙여놓고, metric 정보(해당 서버의 자원 소비 정보 = utilization)를 알아낸다.
PromQL
: 쿼리 언어로 Prometheus에 질문하는 쿼리 언어이다. Prometheus도 DBMS 중의 하나이다.(Time series database)

Grafana
: Prometheus와 연결되어서 시각화된다. metric 정보를 뿌려준다.(dashboard)

## mater, node1, node2에서 시간 동기화
kevin@k8s-master:~/LABs$ sudo apt -y install rdate
kevin@k8s-master:~/LABs$ sudo rdate -s time.bora.net
kevin@k8s-master:~/LABs$ date
2022. 09. 30. () 09:49:59 KST

## git clone
kevin@k8s-master:~/LABs$ git clone https://github.com/brayanlee/k8s-prometheus.git

## 들어가기
kevin@k8s-master:~/LABs$ cd k8s-prometheus/

## Prometheus
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create namespace monitoring
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f prometheus/prometheus-ConfigMap.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f prometheus/prometheus-ClusterRoleBinding.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f prometheus/prometheus-ClusterRole.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f prometheus/prometheus-Deployment.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f prometheus/prometheus-Service.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f prometheus/prometheus-DaemonSet-nodeexporter.yaml

## kube-state
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f kube-state/kube-state-ClusterRoleBinding.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f kube-state/kube-state-ClusterRole.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f kube-state/kube-state-ServiceAccount.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f kube-state/kube-state-Deployment.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f kube-state/kube-state-Service.yaml

## grafana
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f grafana/grafana-Deployment.yaml
kevin@k8s-master:~/LABs/k8s-prometheus$ kubectl create -f grafana/grafana-Service.yaml

## http://192.168.56.100:30003/ 접속해서 Prometheus 확인
## http://192.168.56.101:30004/ 접속해서 Grafana 확인

: Prometheus

: Grafana

  • 설정 들어가기

  • Add data source로 Prometheus 추가

  • dashboard 들어가기

  • import

  • 10000 load

  • JSON을 옮겨서 사용할 수도 있다.

kubernetes architecture

taint = NoSchedule. 마스터에는 할당을 하지 않는다.
허용을 하고 싶으면 => toleration

k8s object = k8s api-resource

  • object 종류 확인
kevin@k8s-master:~$ kubectl api-resources | grep -i network

과정

  • 1단계
    사용자가 yaml 파일을 만들고, kubectl apply를 치고 엔터를 친다.
    요청이ㅣTLS 암호화 되어서 API Server로 전달된다.
    API Server는 받아서 복호화를 한다. 복호화를 하고 3가지 일을 진행한다.
    1) Authentication check(인증)
    : 지금 던진 사람의 계정이 알고 있는 계정인지 확인한다.
    2) Authorization check(인가)
    : 권한이 있는지 확인한다.
    3) Admission controller(승인 제어 시스템)
    : 인증과 인가가 둘 다 ok 되었는지 확인한다. admission controller에서 deny 되면 아무 것도 할 수 없다.

  • 2단계
    API Server는 REST API를 사용한다.
    pod를 만들어 달라는 요청이 오면 바로 만들지 않고 etcd에 기록을 먼저 한다.
    누가 언제 어떤 종류의 리소스를 생성해달라고 요청했는지 기록한다.
    etcd는 API Server에게 기록했다는 신호만 보낸다. 기록했다는 신호를 받아야 다음으로 넘어갈 수 있다.

    etcd(pod=container)
    : Datastore(DB)로 데이터를 key:value 구조로 저장한다.
    데이터의 모든 상태값을 저장한다.

    B+tree 구조로 되어 있다.
    root와 branch는 길을 알려주고, leaf에 데이터가 저장되어 있다. 규칙에 의해서 데이터가 저장된다.

  • 3단계
    API Server는 Scheduler(계산 알고리즘을 가지고 있다.)에게 worker node 중 어떤 node에 pod를 배치할지 request를 보낸다.
    현재 돌리고자 하는 작업의 우선순위와 node들의 자원 사용량을 따져서 점수를 매긴다.
    점수가 높은 node를 선택한다. API Server에게 선택한 것을 알려준다.

  • 4단계
    API Server가 etcd에 어떤 node에 배치할지를 저장한다.
    etcd가 기록이 잘 되면 기록했다는 신호를 보낸다.

  • 5단계
    API Server가 master kubelet을 통해 선택된 Node의 kubelet에 들어간다.

  • 6단계
    node의 kubelet이 container runtime에 명령을 실행시킨다.

  • 7단계
    container runtime이 pod를 만든다.

  • 8단계
    node의 kubelet이 다 만들었다고 현재 상태를 보내준다.

  • 9단계
    API Server가 status를 etcd에 기록한다.

pod 생성과정

kubernetes network

daemon set : node가 하나 더 추가되면 알아서 인식한다.

라우팅 정보를 이용하여 network를 수행한다.
-> 라우팅 정보는 etcd에 저장되어 있다.

node들에 calico(BGP)가 붙어있고, BIRD를 통해 통신한다.

calico network plugin : 여러개의 interface(tool), module로 구성되어 있다.

kubeadm init --pod-network-cidr=10.96.0.0/12 --advertise-address=192.168.56.100

위와 같이 init 할 때 10.96.0.0/12 CIDR로 전체 ip 대역을 설정하였다. pod들은 이 ip 대역 안에서 ip를 할당 받을 수 있다.
node의 IPAM에는 할당 받을 수 있는 ip가 기록되어 있고, IPAM Block에는 각 node가 할당 받을 수 있는 ip가 기록되어 있다.
node 안에는 통신할 수 있는 Iptables과 route table이 있는데 이것은 felix가 작성한다.
route table을 bird를 통해 BGP를 이용하여 node끼리 공유한다.
데이터 실제 통신은 overlay로 이루어진다.

위의 과정들을 pod를 생성하면 calico가 해주는 것이다.

  • calicoctl
kevin@k8s-master:~$ pall | grep -i calico
## master에 있는 것. 아래 노드들을 관리
kube-system            calico-kube-controllers-6799f5f4b4-rm2mx    1/1     Running   1 (5h9m ago)   23h
## 아래는 node 각각에 있는 BGP. DaemonSet(pod를 모든 노드에 하나씩 배포)
kube-system            calico-node-gv25g                           1/1     Running   1 (5h8m ago)   23h
kube-system            calico-node-qkwj7                           1/1     Running   1 (5h9m ago)   23h
kube-system            calico-node-vqmc7                           1/1     Running   1 (5h9m ago)   23h

## 어느 node 것인지 확인하기
kevin@k8s-master:~$ kubectl describe po calico-node-gv25g -n kube-system | grep 192
Node:                 k8s-node2/192.168.56.102
IP:                   192.168.56.102
  IP:           192.168.56.102
calico/node is not ready: BIRD is not ready: BGP not established with 192.168.56.100,192.168.56.101
calico/node is not ready: BIRD is not ready: BGP not established with 192.168.56.100,192.168.56.101

## calicoctl 설치
kevin@k8s-master:~/LABs/mynode$ curl -L https://github.com/projectcalico/calico/releases/download/v3.24.1/calicoctl-linux-amd64 -o calicoctl
kevin@k8s-master:~/LABs/mynode$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
kevin@k8s-master:~/LABs/mynode$ sudo mv calicoctl /usr/bin/calicoctl
kevin@k8s-master:~/LABs/mynode$ sudo chmod +x /usr/bin/calicoctl
kevin@k8s-master:~/LABs/mynode$ calicoctl ipam show
+----------+--------------+------------+------------+-------------------+
| GROUPING |     CIDR     | IPS TOTAL  | IPS IN USE |     IPS FREE      |
+----------+--------------+------------+------------+-------------------+
| IP Pool  | 10.96.0.0/12 | 1.0486e+06 | 13 (0%)    | 1.0486e+06 (100%) |
+----------+--------------+------------+------------+-------------------+

kevin@k8s-master:~/LABs/mynode$ calicoctl ipam show --show-blocks
+----------+------------------+------------+------------+-------------------+
| GROUPING |       CIDR       | IPS TOTAL  | IPS IN USE |     IPS FREE      |
+----------+------------------+------------+------------+-------------------+
| IP Pool  | 10.96.0.0/12     | 1.0486e+06 | 13 (0%)    | 1.0486e+06 (100%) |
| Block    | 10.108.82.192/26 |         64 | 1 (2%)     | 63 (98%)          |
| Block    | 10.109.131.0/26  |         64 | 5 (8%)     | 59 (92%)          |
| Block    | 10.111.156.64/26 |         64 | 7 (11%)    | 57 (89%)          |
+----------+------------------+------------+------------+-------------------+

kevin@k8s-master:~/LABs/mynode$ route
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.109.131.0    k8s-node2       255.255.255.192 UG    0      0        0 tunl0
10.111.156.64   k8s-node1       255.255.255.192 UG    0      0        0 tunl0
...
## node2에서도 route로 확인할 수 있다.

kevin@k8s-master:~/LABs/mynode$ calicoctl get workloadendpoints
WORKLOAD     NODE        NETWORKS          INTERFACE
mynode-pod   k8s-node2   10.109.131.9/32   calif3d7c5625ac

## pod 생성하기
kevin@k8s-master:~/LABs/mynode$ cp mynode.yaml mynode3.yaml
kevin@k8s-master:~/LABs/mynode$ kubectl apply -f mynode3.yaml
kevin@k8s-master:~/LABs/mynode$ kubectl get po -o wide
NAME          READY   STATUS             RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
mynode-pod    0/1     ImagePullBackOff   0          54m   10.109.131.9    k8s-node2   <none>           <none>
mynode-pod3   0/1     ErrImagePull       0          58s   10.109.131.10   k8s-node2   <none>           <none>

kubectl 명령어

kubectl {create | apply | delete} -f pod.yaml

  • create
    : yaml 코드에 지정된 object를 생성한다. update가 안된다.
  • apply
    : yaml 코드에 지정된 object를 생성한다. 일부에 대해서 update도 된다.
  • delete
    : yaml 코드에 지정된 object를 삭제한다.

kubectl {get | describe} {object type} object_name [-n namespace | default]

  • get
  • describe

etcd

kevin@k8s-master:~$ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
controller-manager   Healthy   ok
etcd-0               Healthy   {"health":"true","reason":""}
scheduler            Healthy   ok

kevin@k8s-master:~$ sudo vi /etc/kubernetes/manifests/etcd.yaml
...
 image: k8s.gcr.io/etcd:3.5.3-0
...

## etcd 안으로 들어가기
## 명령어가 많이 설치되어 있지 않다.
kevin@k8s-master:~$ pall | grep -i etcd
kube-system            etcd-k8s-master                             1/1     Running   1 (3h10m ago)   22h
kevin@k8s-master:~$ kubectl -n kube-system exec -it etcd-k8s-master -- sh
sh-5.1#
sh-5.1# etcdctl -h

## health chek 방법 1
kevin@k8s-master:~$ kubectl -n kube-system exec -it etcd-k8s-master -- sh \
> -c "ETCDCTL_API=3 \
> ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt \
> ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt \
> ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key \
> etcdctl endpoint health"
127.0.0.1:2379 is healthy: successfully committed proposal: took = 23.903513ms

## health chek 방법 2
kevin@k8s-master:~$ kubectl -n kube-system exec -it etcd-k8s-master -- sh \
> -c "ETCDCTL_API=3 etcdctl \
> --cacert=/etc/kubernetes/pki/etcd/ca.crt \
> --cert=/etc/kubernetes/pki/etcd/server.crt \
> --key=/etc/kubernetes/pki/etcd/server.key \
> member list"
76335a6259872c1a, started, k8s-master, https://192.168.56.100:2380, https://192.168.56.100:2379, false

## snapshot
kevin@k8s-master:~$ kubectl -n kube-system exec -it etcd-k8s-master -- sh \
> -c "ETCDCTL_API=3 etcdctl \
> --cacert=/etc/kubernetes/pki/etcd/ca.crt \
> --cert=/etc/kubernetes/pki/etcd/server.crt \
> --key=/etc/kubernetes/pki/etcd/server.key \
> snapshot save /var/lib/etcd/snapshot.db"
{"level":"info","ts":"2022-09-30T03:26:39.442Z","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"/var/lib/etcd/snapshot.db.part"}
{"level":"info","ts":"2022-09-30T03:26:39.459Z","logger":"client","caller":"v3/maintenance.go:211","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2022-09-30T03:26:39.460Z","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"127.0.0.1:2379"}
{"level":"info","ts":"2022-09-30T03:26:39.582Z","logger":"client","caller":"v3/maintenance.go:219","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2022-09-30T03:26:39.659Z","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"127.0.0.1:2379","size":"3.7 MB","took":"now"}
{"level":"info","ts":"2022-09-30T03:26:39.659Z","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"/var/lib/etcd/snapshot.db"}
Snapshot saved at /var/lib/etcd/snapshot.db

## 확인하기
kevin@k8s-master:~$ sudo ls -lh /var/lib/etcd/
total 3.6M
drwx------ 4 root root   29  930 09:01 member
-rw------- 1 root root 3.6M  930 12:26 snapshot.db

## 이런 방법으로는 snapshot이 계속 덮어쓰게 된다.
## -> CronJob으로 정기적으로 백업하는 명령을 스케줄링한다.
kevin@k8s-master:~$ mkdir backup
kevin@k8s-master:~$ sudo cp /var/lib/etcd/snapshot.db $HOME/backup/snapshot.db~$(date +%m-%d-%y)
kevin@k8s-master:~$ cd backup/
kevin@k8s-master:~/backup$ ls -lh
total 3.6M
-rw------- 1 root root 3.6M  930 12:31 snapshot.db~09-30-22

## 정기적으로 이 폴더에 만들어지게 하고, backup server에 전달하고 여기의 파일은 삭제하여 백업한다.

kubelet

## kubelet 살아있는지 확인
kevin@k8s-master:~/LABs$ sudo systemctl status kubelet.service
[sudo] password for kevin:
● kubelet.service - kubelet: The Kubernetes Node Agent
     Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/kubelet.service.d
             └─10-kubeadm.conf
     Active: active (running)

실습

kubernetes 서비스 구현 시나리오

node, nodejs script를 이용해서 웹 서비스를 수행하고자 한다. 그 환경을 container로 제공한다.

## 기존 pod 지우기
kevin@k8s-master:~/LABs/mynode$ kubectl get po
NAME          READY   STATUS             RESTARTS   AGE
mynode-pod    0/1     ImagePullBackOff   0          61m
mynode-pod3   0/1     ImagePullBackOff   0          8m21s
kevin@k8s-master:~/LABs/mynode$ kubectl delete po mynode-pod mynode-pod3
pod "mynode-pod" deleted
pod "mynode-pod3" deleted

## node 파일 작성
kevin@k8s-master:~/LABs/mynode$ vi runapp.js
var http = require('http');
var content = function(req, resp) {
        resp.end("Welcome to kubernetes~! soyeon" + "\n");
        resp.writeHead(200);
}
var web = http.createServer(content);
web.listen(8000);

## Dockerfile 작성
kevin@k8s-master:~/LABs/mynode$ vi Dockerfile
FROM node:slim
EXPOSE 8000
COPY runapp.js .
CMD node runapp.js

## image build
kevin@k8s-master:~/LABs/mynode$ sudo docker build -t mynode:1.0 .

## tag 붙이기
kevin@k8s-master:~/LABs/mynode$ sudo docker tag mynode:1.0 oeckikekk/mynode:1.0

## container run test
kevin@k8s-master:~/LABs/mynode$ sudo docker run -it --name=mynode -p 10000:8000 oeckikekk/mynode:1.0

## 연결 확인
kevin@k8s-master:~$ curl localhost:10000
Welcome to kubernetes~! soyeon

## docker login 하고 push
kevin@k8s-master:~/LABs/mynode$ sudo docker login
kevin@k8s-master:~/LABs/mynode$ sudo docker push oeckikekk/mynode:1.0

## yaml 파일 작성
kevin@k8s-master:~/LABs/mynode$ cp mynode.yaml mynode-pod1.yaml
kevin@k8s-master:~/LABs/mynode$ vi mynode-pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mynode-pod1
spec:
  containers:
  - image: oeckikekk/mynode:1.0
    name: mynode-container
    ports:
    - containerPort: 8000
    
## apply
kevin@k8s-master:~/LABs/mynode$ kubectl apply -f mynode-pod1.yaml

## 정보 확인
kevin@k8s-master:~/LABs/mynode$ kubectl get po -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
mynode-pod1   1/1     Running   0          5s    10.109.131.13   k8s-node2   <none>           <none>

## 연결 확인
kevin@k8s-master:~/LABs/mynode$ curl 10.109.131.13:8000
Welcome to kubernetes~! soyeon
## 모든 노드에서 연결이 된다.
## 윈도우에서는 연결을 할 수 없다. 외부에서도 되게 하고 싶다.
## -> -p(service) 필요하다.

kevin@k8s-master:~/LABs/mynode$ vi mynode-pod1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mynode-pod1
  labels:
    run: nodejs
spec:
  containers:
  - image: oeckikekk/mynode:1.0
    name: mynode-container
    ports:
    - containerPort: 8000
kevin@k8s-master:~/LABs/mynode$ kubectl apply -f mynode-pod1.yaml

## label이 붙었다.
kevin@k8s-master:~/LABs/mynode$ kubectl get po -o wide --show-labels
NAME          READY   STATUS    RESTARTS   AGE     IP              NODE        NOMINATED NODE   READINESS GATES   LABELS
mynode-pod1   1/1     Running   0          8m19s   10.109.131.13   k8s-node2   <none>           <none>            run=nodejs

kevin@k8s-master:~/LABs/mynode$ vi mynode-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mynode-svc
spec:
  selector:
    run: nodejs
  ports:
  - port: 10001
    targetPort: 8000
  externalIPs:
  - 192.168.56.102

kevin@k8s-master:~/LABs/mynode$ kubectl apply -f mynode-svc.yaml
kevin@k8s-master:~/LABs/mynode$ kubectl get po,svc -o wide
NAME              READY   STATUS    RESTARTS   AGE    IP              NODE        NOMINATED NODE   READINESS GATES
pod/mynode-pod1   1/1     Running   0          2m1s   10.109.131.21   k8s-node2   <none>           <none>

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP      PORT(S)     AGE    SELECTOR
service/kubernetes   ClusterIP   10.96.0.1       <none>           443/TCP     9m4s   <none>
service/mynode-svc   ClusterIP   10.108.24.209   192.168.56.102   10001/TCP   6s     run=nodejs

kevin@k8s-master:~/LABs/mynode$ curl 192.168.56.102:10001
Welcome to kubernetes~! soyeon
kevin@k8s-master:~/LABs/mynode$ curl 10.108.24.209:10001
Welcome to kubernetes~! soyeon
kevin@k8s-master:~/LABs/mynode$ curl 10.109.131.21:8000
Welcome to kubernetes~! soyeon

## 윈도우에서도 연결 가능
C:\k8s\dashboard_token>curl 192.168.56.102:10001
Welcome to kubernetes~! soyeon

kevin@k8s-master:~/LABs/mynode$ kubectl describe svc mynode-svc | grep -i endpoint
Endpoints:         10.109.131.13:8000

## Google Cloud SDK Shell에서 실행
C:\>cd k8s
C:\k8s>mkdir LABs
C:\k8s>cd LABs

## yaml 파일 작성
C:\k8s\LABs>notepad mynode.yaml
apiVersion: v1
kind: Service
metadata:
  name: mynode-svc
spec:
  selector:
    run: nodejs
  ports:
  - port: 10001
    targetPort: 8000
  type: LoadBalancer
---
apiVersion: v1
kind: Pod
metadata:
  name: mynode-pod1
  labels:
    run: nodejs
spec:
  containers:
  - image: oeckikekk/mynode:1.0
    name: mynode-container
    ports:
    - containerPort: 8000
    
## apply
C:\k8s\LABs>kubectl apply -f mynode.yaml

## 확인하기
C:\k8s\LABs>kubectl get po,svc -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP          NODE                                         NOMINATED NODE   READINESS GATES
pod/mynode-pod1   1/1     Running   0          59s   10.12.0.4   gke-k8s-cluster-k8s-nodepool-bc541242-7vrg   <none>           <none>

NAME                 TYPE           CLUSTER-IP   EXTERNAL-IP    PORT(S)           AGE   SELECTOR
service/kubernetes   ClusterIP      10.16.0.1    <none>         443/TCP           23h   <none>
service/mynode-svc   LoadBalancer   10.16.9.94   34.64.82.226   10001:31424/TCP   59s   run=nodejs

## 접속 확인
C:\k8s\LABs>curl 34.64.82.226:10001
Welcome to kubernetes~! soyeon

## 삭제
C:\k8s\LABs>kubectl delete -f mynode.yaml

nginx pod 생성

1) Ubuntu 기반 -> oeckikekk/myweb:4.0

  • nginx:1.23-alpine 이미지를 이용하여 Pod(pod명: nginx-pod)를 생성하고, Service(서비스명: nginx-svc)에 연결하세요.
  • 생성 후 PodIP와 service clusterIP를 이용해 curl test를 수행해보세요.
  • nginx Pod 내에 있는 container에 index.html을 복사하여, 초기 화면을 변경하세요.
## index.html 작성
kevin@k8s-master:~/LABs/mynode$ vi index.html

## Dockerfile 작성
kevin@k8s-master:~/LABs/mynode$ vi Dockerfile
FROM nginx:1.23-alpine
COPY index.html /usr/share/nginx/html/index.html

## image build하고 docker hub에 push
kevin@k8s-master:~/LABs/mynode$ sudo docker build -t myweb:4.0 .
kevin@k8s-master:~/LABs/mynode$ sudo docker tag myweb:4.0 oeckikekk/myweb:4.0
kevin@k8s-master:~/LABs/mynode$ sudo docker run -itd --name=myweb -p 10005:80 oeckikekk/myweb:4.0
kevin@k8s-master:~/LABs/mynode$ sudo docker login
kevin@k8s-master:~/LABs/mynode$ sudo docker push oeckikekk/myweb:4.0

## Google Cloud SDK Shell에서 실행
## yaml 파일 작성
C:\k8s\LABs>notepad nginx.yaml

## apply
C:\k8s\LABs>kubectl apply -f nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    run: nginx
  ports:
  - port: 10005
    targetPort: 80
  type: LoadBalancer
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    run: nginx
spec:
  containers:
  - image: oeckikekk/myweb:4.0
    name: mynginx-container
    ports:
    - containerPort: 80
    
## 확인
C:\k8s\LABs>kubectl get po,svc -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP          NODE                                         NOMINATED NODE   READINESS GATES
pod/nginx-pod   1/1     Running   0          51s   10.12.1.4   gke-k8s-cluster-k8s-nodepool-bc541242-hwwb   <none>           <none>

NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)           AGE   SELECTOR
service/kubernetes   ClusterIP      10.16.0.1     <none>         443/TCP           24h   <none>
service/nginx-svc    LoadBalancer   10.16.10.65   34.64.82.226   10005:31092/TCP   51s   run=nginx

## 연결 확인
C:\k8s\LABs>curl 34.64.82.226:10005

0개의 댓글