< 컨트롤 플레인 업그레이드 >
sudo apt-mark unhold kubeadm
sudo apt install kubeadm=1.26.2-00 -y
sudo apt-mark hold kubeadm
sudo kubeadm upgrade apply v1.26.2
sudo apt-mark unhold kubelet kubectl
sudo apt install -y kubelet=1.26.2-00 kubectl=1.26.2-00
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
vagrant ssh kube-node1
sudo apt-mark unhold kubeadm
sudo apt install kubeadm=1.26.2-00 -y
sudo apt-mark hold kubeadm
sudo kubeadm upgrade node
sudo apt-mark unhold kubelet kubectl
sudo apt install kubelet=1.26.2-00 kubectl=1.26.2--0 -y
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
-> 최종적으로 컨트롤 플레인과 node의 버전이 1.26.0에서 1.26.2로 업그레이드 된것을 알 수 있다.
📕 etcd 참조
📕 etcd 설치 참조
sudo apt install etcd-client # etcdctl 명령어 설치
sudo -i # etcdctl 명령어는 오로지 관리자 권한으로만 실행 가능
# root계정으로 접속
cd /etc/kubernetes/pki/
# root게정의 key를 저장하는 디렉터리에 접속 후 키 확인
ETCDCTL_API=3 etcdctl --endpoints 192.168.56.11:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key
# etcdctl명령어를 사용하려면 위의 명령어를 다 입력해야함
alias etcdctl=' ETCDCTL_API=3 etcdctl --endpoints 192.168.56.11:2379 --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key'
# 위의 명령어를 항상 사용할 수 없으니 alias로 만든다.
ETCD 클러스터 맴버 목록
etcdctl member list
백업
etcdctl snapshot save snapshotdb
복구
etcdctl snapshot restore snapshotdb
# 복구하기 위해서는 모든 api-server가 중단되어 있어야 한다
ex) . 네트워크 정책 리소스 생성 예시
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector: # 파드 선택, selector와 동일하게 작동
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress: # = InBound , 네트워크의 Ingress리소스와는 아무 관련 x
- from: # 나한테 들어오는 것이므로, 어디에서 왔는지 정의
- ipBlock:
cidr: 172.17.0.0/16 # 해당 ip대역대에서 오는 것은 허용
except:
- 172.17.1.0/24 # 예외 ip대역대 설정
- namespaceSelector: # 네임스페이스 레이블이 일치
matchLabels:
project: myproject
- podSelector: # 파드의 레이블이 일치하는
matchLabels:
role: frontend
ports: # 6379포트로 들어오는 트래픽 허용
- protocol: TCP
port: 6379
egress: # = OutBound
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
1 . 기본적으로 모든 인그레스 트래픽 거부
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress
2 . 모든 인그레스 트래픽 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-ingress
spec:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress
3 . 사용 예시
kubectl create deploy myweb --image nginx
kubectl expose deploy myweb --name myweb-svc --port 80 --target-port 80
# 파드와 서비스 생성
kubectl get po --show-labels
# 생성된 파드는 자동으로 app: myweb 레이블을 가진다
vi netpol.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-wc1
spec:
podSelector:
matchLabels:
app: myweb # 위에서 생성한 파드 선택
policyTypes:
- Ingress # 인바운드 규칙 선택
ingress:
- from:
- podSelector:
matchLabels:
app: wc1 # 해당 레이블을 가진 트래픽에 대해 허용
ports: # 어떤 포트로 들어오는 트래픽에 대해서 허용 할 것인지
- protocol: TCP
port: 80
kubectl run wc1 --image ghcr.io/c1t1d0s7/network-multitool -l app=wc1 --rm -it -- sh
curl myweb-svc
-> 간단하게 app:wc1 레이블을 부착한 wc1이라는 client를 생성하고 파드에 연결된 서비스에 curl을 해보면 네트워크 정책에 의해 허용되어 정상적으로 웹이 뜨는 것을 볼 수 있다.
kubectl run wc2 --image ghcr.io/c1t1d0s7/network-multitool -l app=wc2 --rm -it -- sh
curl myweb-svc
-> 마찬가지로 app:wc2 레이블을 부착한 wc2라는 client를 생성하고 파드에 연결된 서비스에 curl을 해보면 네트워크 정책에 의해 거부되어 아무런 반응이 없는 것을 확인