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
## 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
: 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을 옮겨서 사용할 수도 있다.
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에 기록한다.
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가 해주는 것이다.
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 {create | apply | delete} -f pod.yaml
kubectl {get | describe} {object type} object_name [-n namespace | default]
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 9월 30 09:01 member
-rw------- 1 root root 3.6M 9월 30 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 9월 30 12:31 snapshot.db~09-30-22
## 정기적으로 이 폴더에 만들어지게 하고, backup server에 전달하고 여기의 파일은 삭제하여 백업한다.
## 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)
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
1) Ubuntu 기반 -> oeckikekk/myweb:4.0
## 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