
< 컨트롤 플레인 업그레이드 >
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을 해보면 네트워크 정책에 의해 거부되어 아무런 반응이 없는 것을 확인