
root@master:~/lab5# k get sa
NAME SECRETS AGE
default 0 6d16h
root@master:~/lab5# k get sa -n kube-system
NAME SECRETS AGE
attachdetach-controller 0 6d16h
bootstrap-signer 0 6d16h
calico-cni-plugin 0 6d16h
calico-kube-controllers 0 6d16h
calico-node 0 6d16h
certificate-controller 0 6d16h
clusterrole-aggregation-controller 0 6d16h
coredns 0 6d16h
cronjob-controller 0 6d16h
csi-nfs-controller-sa 0 20h
csi-nfs-node-sa 0 20h
Kubernetes 클러스터를 생성하면, 전체 클러스터를 관리할 수 있는 권한을 부여하기 위해 default라는 Service Account(SA)가 생성됩니다. Kubernetes에서 root 사용자(또는 kubernetes-admin 사용자)는 클러스터 관리에 필요한 인증서를 발급받아 내부 클러스터에 접근할 수 있습니다.
이 과정에서 root 사용자에게 cluster-admin이라는 역할이 부여되며, 이는 ClusterRole과 ClusterRoleBinding을 통해 설정됩니다. ClusterRoleBinding은 누구에게(subjects) 어떤 권한을 줄지 (roleRef) 정의합니다.
즉, root 사용자에게는 클러스터 전체를 관리할 수 있는 cluster-admin 역할이 부여되어, 클러스터에서 다양한 명령어를 실행할 수 있는 권한이 주어집니다.

ls 내용에는 각 파일들은 Kubernetes 구성 요소에 대한 인증서들입니다. 대부분의 인증서는 1년의 만료기간을 가지며, 적절한 시기에 갱신이 필요합니다. kubeadm으로 생성된 인증서들은 재발급이 가능하며, 만료 기간이 긴 인증서를 받기 위해서는 OpenShift와 같은 플랫폼 또는 하드웨어 보안 모듈(HSM)을 활용한 방법을 고려할 수 있습니다.


root 사용자에게 cluster-admin이라는 역할이 부여되며, 이는 ClusterRole과 ClusterRoleBinding을 통해 설정됩니다. ClusterRoleBinding은 누구에게(subjects) 어떤 권한을 줄지 (roleRef) 정의합니다.
root는 cluster,admin 권한으로 모든 object 의 리소스와,명령어를 실행 할 수 있다.
(보안취약)

root@master:~# # keduit ns에 sa 생성하기
root@master:~# k create sa eng1 -n keduit
serviceaccount/eng1 created
root@master:~# k get sa -n keduit
NAME SECRETS AGE
default 0 5d18h
eng1 0 14s
root@master:~# k get svc -n keduit
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
keduit-mariadb LoadBalancer 10.99.29.12 211.183.3.201 3306:30418/TCP 5d17h
mariadb-service LoadBalancer 10.111.74.173 211.183.3.202 3306:32675/TCP 5d17h
svc-blog ClusterIP 10.97.140.223 <none> 80/TCP 18h
svc-main NodePort 10.111.55.83 <none> 80:30005/TCP 18h
svc-shop NodePort 10.97.55.91 <none> 80:30006/TCP 18h
root@master:~# k get svc --as system:serviceaccount:keduit:eng1 -n keduit
Error from server (Forbidden): services is forbidden: User "system:serviceaccount:keduit:eng1" cannot list resource "services" in API group "" in the namespace "keduit"
root@master:~# #""포함된 리스트 확인불가하다. 권한이 없기때문... role, rolebinding 하기 위한 작업이 필요하다.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: keduit-eng1
namespace: keduit
rules:
- apiGroups: ["", "apps"]
resources: ["pods", "deployments", "services"]
verbs: ["get", "create", "update", "patch", "delete", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: keduit-eng1
namespace: keduit
roleRef:
kind: Role
name: keduit-eng1
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: eng1
namespace: keduit
get은 한 개만,list는 모두 볼 수 있다.
eng1에게 권한부여 (role,rolebinding)
k get clusterrole cluster-admin –o yaml 참고
k api-resources 참고
root@master:~/lab5# k get svc --as system:serviceaccount:keduit:eng1 -n keduit
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
keduit-mariadb LoadBalancer 10.99.29.12 211.183.3.201 3306:30418/TCP 5d18h
mariadb-service LoadBalancer 10.111.74.173 211.183.3.202 3306:32675/TCP 5d18h
svc-blog ClusterIP 10.97.140.223 <none> 80/TCP 19h
svc-main NodePort 10.111.55.83 <none> 80:30005/TCP 19h
svc-shop NodePort 10.97.55.91 <none> 80:30006/TCP 19h
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: keduit-eng2
namespace: keduit
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: keduit-eng2
namespace: keduit
roleRef:
kind: Role
name: keduit-eng2
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: eng2
namespace: keduit
root@master:~/lab5# k get deploy --as system:serviceaccount:keduit:eng2 -n keduit
NAME READY UP-TO-DATE AVAILABLE AGE
blog 1/1 1 1 19h
keduit-mariadb 1/1 1 1 5d18h
main 1/1 1 1 19h
mariadb-deployment 1/1 1 1 5d19h
shop 1/1 1 1 19h
root@master:~/lab5# k get svc --as system:serviceaccount:keduit:eng2 -n keduit
Error from server (Forbidden): services is forbidden: User "system:serviceaccount:keduit:eng2" cannot list resource "services" in API group "" in the namespace "keduit"
root@master:~/lab5# k run pod nginx --image=nginx --port=80 -n keduit --as system:serviceaccount:keduit:eng2 -n keduit
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:keduit:eng2" cannot create resource "pods" in API group "" in the namespace "keduit"
root@master:~/lab5# k run pod nginx --image=nginx --port=80 -n keduit --as system:serviceaccount:keduit:eng1 -n keduit
pod/nginx created
root@master:~/lab5# k get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane 6d21h v1.29.10
node1 Ready <none> 6d21h v1.29.10
node2 Ready <none> 6d21h v1.29.10
node3 Ready <none> 6d21h v1.29.10
root@master:~/lab5# k describe node node3
Name: node3
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64 #범용 cpu가 탑재 (intel,amd)
kubernetes.io/hostname=node3
kubernetes.io/os=linux
zone=seoul # 추가하여 지정가능
root@master:~/lab5# #각 Node에 라벨 부여하기
root@master:~/lab5# k label node node1 region=seoul
node/node1 labeled
root@master:~/lab5# k label node node2 region=seoul
node/node2 labeled
root@master:~/lab5# k label node node3 region=jeju
node/node3 labeled
root@master:~/lab5#
root@master:~/lab5# k label node node3 region- # 라벨 삭제
node/node3 unlabeled
root@master:~/lab5# k describe node node3 | head
Name: node3
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=node3
kubernetes.io/os=linux
Annotations: csi.volume.kubernetes.io/nodeid: {"nfs.csi.k8s.io":"node3"}
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/cri-dockerd.sock
node.alpha.kubernetes.io/ttl: 0
root@master:~/lab5#
root@master:~/lab5# k get no --selector region #특정 라벨을 보유한 노드 출력
NAME STATUS ROLES AGE VERSION
node1 Ready <none> 6d21h v1.29.10
node2 Ready <none> 6d21h v1.29.10
root@master:~/lab5# k get no --selector region=seoul
NAME STATUS ROLES AGE VERSION
node1 Ready <none> 6d21h v1.29.10
node2 Ready <none> 6d21h v1.29.10
touch pod-nodename.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp1
labels:
name: myapp1
spec:
containers:
- name: myapp1
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
nodeName: node2 #node2 에게 배치된다
root@master:~/lab5# k get pod -o wide
myapp1 1/1 Running 0 7s 192.168.104.5 node2 <none> <none>
touch pod-nodeselector.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp2
labels:
name: myapp2
spec:
containers:
- name: myapp1
image: nginx
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
nodeSelector:
region: seoul
root@master:~/lab5# k get pod -o wide
myapp2 1/1 Running 0 6s 192.168.166.135 node1 <none> <none>
Always #기본값
kubelet이 컨테이너를 기동할 때마다, kubelet이 컨테이너 이미지 레지스트리에 이름과 이미지의 다이제스트가 있는지 질의한다. 일치하는 다이제스트를 가진 컨테이너 이미지가 로컬에 있는 경우, kubelet은 캐시된 이미지를 사용한다. 이외의 경우, kubelet은 검색된 다이제스트를 가진 이미지를 내려받아서 컨테이너를 기동할 때 사용한다.
#repo에가서 먼저 이미지를 찾아본다 .. 있다면 최신버전의 해쉬코드를 달라고함 만약 로컬에 있는 이미지와 해쉬코드를 비교해본다 repo에 있는 버전이 더 최신이라면 로컬의 이미지와 덮어 씌운다 .
IfNotPresent
이미지가 로컬에 없는 경우에만 내려받는다.
Never
kubelet은 이미지를 가져오려고 시도하지 않는다. 이미지가 어쨌든 이미 로컬에 존재하는 경우, kubelet은 컨테이너 기동을 시도한다. 이외의 경우 기동은 실패한다. 보다 자세한 내용은 미리 내려받은 이미지를 참조한다.
deployment(젖소)와 비슷한 개념이다
statefulset(애완동물)을 구성하는 파드들은 서로 동일한 스펙이라고 하더라도 각 파드마다 독자성을 유지한다
스케줄링을 다시할 때도 유지된다.
파드들의 개별 네트워크 식별을 위해
특징은 cluster-ip가 없다.
metadata:
name: sfs-service01
spec:
selector:
app.kubernetes.io/name: web-sfs01
type: ClusterIP
clusterIP: None
ports:
- protocol: TCP
port: 80
touch statefulset-web01.yml 스테이트풀셋
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sfs-test01
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: web-sfs01
serviceName: sfs-service01
template:
metadata:
labels:
app.kubernetes.io/name: web-sfs01
spec:
containers:
- name: nginx
image: nginx:latest
touch statefulset-service.yml 헤드리스
apiVersion: v1
kind: Service
metadata:
name: sfs-service01
spec:
selector:
app.kubernetes.io/name: web-sfs01
ports:
- protocol: TCP
port: 80
pod/sfs-test01-0 1/1 Running 0 12s
pod/sfs-test01-1 1/1 Running 0 8s
pod/sfs-test01-2 1/1 Running 0 4s
service/sfs-service01 ClusterIP 10.97.161.219 <none> 80/TCP 16s
#헤드리스 서비스의 cluster-ip는 none이다
statefulset.apps/sfs-test01 3/3 12s
touch nginx-test01.yml #nginx pod 생성
apiVersion: v1
kind: Pod
metadata:
name: nginx01
spec:
containers:
- name: nginx-test01
image: nginx:latest
nginx01 1/1 Running 0 60s 192.168.135.61 node3 <none> <none>
sfs-test01-0 1/1 Running 0 8m30s 192.168.135.56 node3 <none> <none>
sfs-test01-1 1/1 Running 0 8m26s 192.168.166.185 node1 <none> <none>
sfs-test01-2 1/1 Running 0 8m22s 192.168.104.55 node2 <none> <none>
root@master:~/lab5# k exec -it nginx01 -- /bin/bash
root@nginx01:/# curl 192.168.166.185
#nginx 파드에 접속
#curl 이용한 테스트 노트1 ip 접속
root@nginx01:/# curl 192.168.166.185
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>