본 내용의 코드와 설명은 인프런 > 쿠버네티스 어나더 클래스를 기본으로 한다.
쿠버네티스의 Object에는 여러 종류가 있다.
같은 종류의 object끼리는 name이 중복되면 안된다.
lables
apiVersion: v1
kind: Namespace
metadata:
name: anotherclass-123
labels:
part-of: k8s-anotherclass
managed-by: dashboard
https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/namespaces/
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: anotherclass-123
name: api-tester-1231
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
spec:
selector:
matchLabels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
replicas: 2
strategy:
type: RollingUpdate
template:
metadata:
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
spec:
nodeSelector:
kubernetes.io/hostname: k8s-master
containers:
- name: api-tester-1231
image: 1pro/api-tester:v1.0.0
ports:
- name: http
containerPort: 8080
envFrom:
- configMapRef:
name: api-tester-1231-properties
startupProbe:
httpGet:
path: "/startup"
port: 8080
periodSeconds: 5
failureThreshold: 24
readinessProbe:
httpGet:
path: "/readiness"
port: 8080
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: "/liveness"
port: 8080
periodSeconds: 10
failureThreshold: 3
resources:
requests:
memory: "100Mi"
cpu: "100m"
limits:
memory: "200Mi"
cpu: "200m"
volumeMounts:
- name: files
mountPath: /usr/src/myapp/files/dev
- name: secret-datasource
mountPath: /usr/src/myapp/datasource
volumes:
- name: files
persistentVolumeClaim:
claimName: api-tester-1231-files
- name: secret-datasource
secret:
secretName: api-tester-1231-postgresql
Deployment strategy type은 ReCreate , RollingUpdate가 존재함
apiVersion: v1
kind: Service
metadata:
namespace: anotherclass-123
name: api-tester-1231
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
spec:
selector:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
ports:
- port: 80
targetPort: http
nodePort: 31231
type: NodePort
서비스는 크게 Discovery , Publishing , Registry , Load Balancing 기능이 있다.
Service type을 NodePort로 지정하면 외부에서 접속할수 있게 된다. 이것이 서비스 퍼블리싱이다.
Service type을 ClusterIp로 설정하면 (default) 서비스 내부 DNS를 이용한 Service 이름으로 API 호출이 가능하다. 이것이 서비스 디스커버리이다.
: pod의 환경변수 값을 제공하는 역할
: data가 환경변수로 들어갈 값
: Pod가 생성될때 환경변수는 값이 들어가기 때문에 ConfigMap을 바꿔도 변경되지 않는다.
Secret도 configmap과 비슷한데 pod에 좀더 중요한 값을 제공하는 역할
: Secret은 volume과 연결되기 때문에 Secret은 변경을 하면 변경된 사항이 바로 적용된다.
: 저장시 Base64로 인코딩 된다.
: Secret은 tpye이라는 속성이 있고 기본은 opaque라는 타입이고 Configmap을 써도 되는 모든 상황에 조금 중요한 데이터라는 생각이 되면 Secret으로 대체될수있다.
: 그러나 다른 타입을 사용할 경우 configmap과 전혀 달라진다. type에는 docker-registry , tls 등이 있다.
: 사용자 편의에 따라 커스텀하게 관리할 수 있는 요소를 제공해주는거다.
: Secret은 용어 때문에 보안에 용이 한것처럼 보이지만 사실상 암호화는 configmap이나 Secret이나 데이터 자체를 암호화 해야한다.
: Secret도 base64로 인코딩 되어서 저장되지만 누구나 base64로 인코딩 된 사실을 알수있다. secret != 암호화 이다.ㅎㅎ
apiVersion: v1
kind: ConfigMap
metadata:
namespace: anotherclass-123
name: api-tester-1231-properties
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
data:
spring_profiles_active: "dev"
application_role: "ALL"
postgresql_filepath: "/usr/src/myapp/datasource/postgresql-info.yaml"
---
apiVersion: v1
kind: Secret
metadata:
namespace: anotherclass-123
name: api-tester-1231-postgresql
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231
version: 1.0.0
managed-by: dashboard
stringData:
postgresql-info.yaml: |
driver-class-name: "org.postgresql.Driver"
url: "jdbc:postgresql://postgresql:5431"
username: "dev"
password: "dev123"
- pod에서 pv를 지정할때 사용함
apiVersion: v1
kind: PersistentVolume
metadata:
name: api-tester-1231-files
labels:
part-of: k8s-anotherclass
component: backend-server
name: api-tester
instance: api-tester-1231-files
version: 1.0.0
managed-by: dashboard
spec:
capacity:
storage: 2G
volumeMode: Filesystem
accessModes:
- ReadWriteMany
local:
path: "/root/k8s-local-volume/1231"
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-master]}
:실제 볼륨을 지정하는 역할을 함
: namespace가 아닌 더 넓은 범위에 cluster Level이다.
: local이 중요함
PV와 PVC 대신에 hostPath와 nodeSelector를 쓰면 안되나.?
HostPath와 nodeSelector로 가능은 하지만 ReadOnly 기능으로 사용하려고 나온것이다.
테스트 환경에서 임시 저장용도로 사용은 가능하나. 운영에선 사용해서는 안댐
HPA
: 부하에 따라 pod를 늘려주고 줄여주는 scaling 역할을 함.
참고자료
[쿠버네티스] 리눅스로 알아보는 쿠버네티스의 흐름 (0) | 2024.03.24 |
---|