쿠버네티스는 YAML 파일에 컨테이너나 볼륨의 개수 등 환경을 설정해두고 자동으로 이 상태를 유지한다. 쿠버네티스가 관리하는 요소를 강제로 변경하는 것은 권장하지 않는다.
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab
노드 | 포트 | 프로토콜 | 설명 |
---|---|---|---|
Master | 6443 | TCP | API 서버, 외부통신 시 사용 |
2379-2380 | TCP | etcd 서버 | |
10250 | kubelet API, 워커노드와 통신에 사용 | ||
10259 | TCP | scheduler | |
10257 | TCP | controller-manager | |
Worker | 10250 | TCP | kubelet API, 마스터노드와 통신에 사용 |
30000-32767 | TCP | NodePort에 사용, 외부 클라이언트 접근에 사용 |
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 필요한 sysctl 파라미터를 설정하면, 재부팅 후에도 값이 유지된다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 재부팅하지 않고 sysctl 파라미터 적용하기
sudo sysctl --system
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl restart docker
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
vi /etc/containerd/config.toml
# 파일 내에서 SystemdCgroup = true로 설정
sudo systemctl restart containerd
sudo kubeadm init
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# Flannel
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubeadm join <마스터노드 IP>:<마스터노드 포트(6443)> --token <토큰> --discovery-token-ca-cert-hash sha256:<해시값>
매니페스트 파일은 리소스 단위로 작성한다. 하나의 파일로 작성하고 싶다면 리소스 간 —로 구분한다. 파드는 대체로 디플로이면트에 포함되는 형태로 기재된다.
apiVersion: v1
kind: Pod
metadata: # 파드 정보
name: some_pod
labels: # 라벨, 객체에 연결할 수 있는 키값쌍
app: some_label
spec:
containers: # 컨테이너 정보
- name: some_container
image: some_image
resources:
requests: # 최소 요구 자원
cpu: "500m" # CPU 자원의 50%, 1m당 1000분의 1
memory: "128Mi" # 요구 메모리
limits: # 최대 가용 자원
cpu: "1000m"
memory: "256Mi"
livenessProbe: # 활성 상태 검사, readinessProbe로 준비 프로프도 가능
httpGet: # GET 요청을 통한 검사, /healthy 경로 GET 요청 수행
path: /healthy
port: 8080
initialDelaySeconds: 5 # 5초 후 검사 수행
timeoutSeconds: 1 # 1초 이상 걸리면 실패
periodSeconds: 10 # 10초 마다 검사
failureThreshold: 3 # 3번 연속 실패시 중지 및 재시작
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/data" # 컨테이너 내부 경로
name: "data"
volumes: # 볼륨 정의
- name: "data"
hostPath:
path: "/var/data" # 호스트 경로
- name: "remote-data"
nfs:
server: some-url
path: "/remote"
apiVersion: /v1
kind: Deployment
metadata:
name: some_deployment
spec:
selector: # 특정 레이블이 부여된 파드를 관리
matchLabels:
app: some_label
replicas: 5 # 파드의 개수
template: # 생성할 파드의 정보
metadata:
labels:
app: some_label
spec:
containers:
- name: some_pod
image: some_image
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: some_deployment
spec:
type: NodePort # 서비스 유형
# ClusterIP : 클러스터 IP를 이용해 서비스에 접근(외부에서 접근 불가)
# NodePort : 워커 노드의 IP를 이용해 서비스에 접근
# LoadBalancer : 로드밸러서의 IP를 이용해 서비스에 접근
# ExternalName : 파드에서 서비스를 통해 외부로 나가기 위한 설정
ports:
- port: 8099 # 서비스의 포트, 클러스터 내부에 노출할 포트
targetPort: 80 # 컨테이너 포트
protocol: TCP # 통신 프로토콜
nodePort: 30080 # 워커 노드의 포트 30000~32767 사이의 값, 클러스터 외부에 노출할 포트
selector:
app: some_label # matchLabels를 사용해선 안된다
kubectl 커맨드 옵션 형식을 사용한다.
k8s의 HTTP 기반 로드밸런싱 시스템
Document
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /testpath
pathType: Prefix
backend:
service:
name: test
port:
number: 80
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef: # 부여할 역할
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin # 관리자 역할
subjects: # 부여 대상
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard