1. 목적

 - deploy 서버에서 클러스터 context 획득

 

 

2. 스크립트

vi /opt/kube-cert/get_auth_file.sh

-----------------------------------------------------------------------

#!/bin/bash

if [[ $1 == "" || $2 == "" ]]; then
  echo "################################"
  echo "ex) "
  echo "./get_auth_file.sh CUSTER_NAME IP_ADDR"
  echo "./get_auth_file.sh test1 192.168.56.101"
  echo "################################"
  exit 0;
fi

echo "### Get Auth Files$$$"
scp $2:/etc/kubernetes/admin.conf $1-cluster-admin.conf
scp $2:/etc/kubernetes/pki/ca.crt $1-cluster-ca.crt
scp $2:/etc/kubernetes/ssl/apiserver-kubelet-clinet.crt $1-cluster-client.crt
scp $2:/etc/kubernetes/ssl/apiserver-kubelet-client.key $1-cluster-client.key

echo "###Change IP Address###"
sed -i "s/127.0.0.1/$2/g" $1-cluster-admin.conf

echo "###Copy ./kube/config ###"
cp -f ~/.kube/config .

echo "###Add New-Cluster Context###"
kubectl config set-cluster $1-cluster.local --server=https://$2:6443 --certificate-authority=$PWD/$1-cluster-ca.crt

kubectl config set-context $1-kubernetes-admin@$1-clster.local --cluster=$1-cluster.local --user=$1-kubernetes-admin --namespace=default --current=false

kubectl config set-credentials $1-kubernetes-admin --client-certificate=$PWD/$1-cluster-client.crt --client-key=$PWD/$1-cluster-client.key

echo "###kubectl config get-contexts###"
kubectl config get-contexts

------------------------------------------------------------

 

 

 

 

 

 

 

1. ssh key 생성

$ ssh-keygen -t rsa -q -N "" -f kubespray_ssh_key

 

2. secret 생성

$ kubectl create secret generic --from-file=id_rsa=./kubespray_ssh_key kubespray-ssh-key -n default

 

3. 노드 정보 삽입

$ sshpass -p passwd123 ssh-copy-id -i kubespray_ssh_key.pub 192.168.56.101

 

4. Image 생성

....

 

5. Job 생성

test-cluster-deploy-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: test-cluster-deploy-kubespray.2.16.0
  namespace: default
spec:
  template:
    spec:
      hostNetwork: true
      nodeSelector:
        node-role.kubernetes.io/management: management
      tolerations:
      - operator: Exists
      containers:
      - name: kubespray
        image: 192.168.56.101:5000/kubespray/forest-kubespray:v1.20.7
        imagePullPolicy: Always
        env:
        - name: MODE
          value: DEPLOY     
        - name: CLUSTER_RUNTIME
          value: docker
        - name: CLUSTER_NAME
          value: test-service
        - name: MASTERS
          value: master01:192.168.56.101,master02:192.168.56.102,master03:192.168.56.103
        - name: WORKERS
          value: worker01:192.168.56.104,worker02:192.168.56.105,worker02:192.168.56.105,worker03:192.168.56.106
        - name: INGRESSES
          value: worker01,worker02
        - name: EGRESSES
          value: worker01,worker02
        - name: PRIVATE_REPO
          value: 192.168.56.101
        - name: PRIVATE_REGISTRY
          value: 192.168.56.101:5000
        - name: PRIVATE_NTP
          value: 192.168.56.101
        volumeMounts:  
        - name: ssh-key-volume
          mountPath: "/etc/ssh-key"
        - name: inventory-volume
          mountPath: "/kubespray/inventory"
      volumes:
      - name: ssh-key-volume
        secret:
          secretName: kubespray-ssh-key
          defaultMode: 256            
      - name: inventory-volume
        persistentVolumeClaim:
          claimName: kubespray-inventory
      restartPolicy: Never
  backoffLimit: 0

 

7. kubectl apply -f 

 

 

 

*노드에 taint가 걸려있기 때문에 toleration 설정이 필요

taints:

- effect: NoSchedule

  key: management

  value: "true"

1.개요

- K8S에는 Pod Security Policy(PSP)라는 기능이 있어서 클러스터에 정책을 설정할 수 있음

- Open Policy Agent(OPA) 라는 솔루션은 K8S 뿐 아니라 범용적으로 정책을 만들어 적용할 수 있음

- OPA에서는 K8S 클러스터에 정책을 적용 할 수 있는 Gatekeeper라는 전용 솔루션을 제공

- PSP는 K8S 1.25 버전부터 지원 종료가 예정되어있으며, 그 이후부터는 OPA(Gatekeeper)를 사용해야 함 

 

 

2. Open Policy Agent

- OPA는 플랫폼 관리자에게 세밀한 권한 관리를 할 수 있도록 지원하는 범용 정책 엔진으로 K8S 뿐 아니라 OPA 엔진을 이용하는 모든 플랫폼에서 사용 가능

 

(1) OPA 동작

요청이 들어오면 서비스는 JSON을 이용하여 OPA에 허용 여부 질의

질의를 받은 OPA는 저장된 Policy를 불러와서 요청에 대한 평가를 하고 결과를 다시 JSON 형식으로 서비스에 반환

 

(2) 정책 설정

OPA는 Policy를 기반으로하여 사용자 접근을 관리하기 때문에 Policy를 어떻게 작성하는지가 중요함

PolicyRego라는 자체 질의언어를 이용하여 작성해야 하며, Rego 언어가 선언적으로 동작하기 때문에 해당 문법에 대한 이해 필요

 

 

 

3. 게이트키퍼

- 게이트키퍼는 내부적으로 OPA 엔진을 사용하는 OPA의 K8S 승인/제어를 위해 제작된 솔루션

(1) 게이트키퍼 동작

K8S에서는 정책적인 결정을 API 서버와 분리하여 독립적으로 할 수 있게 Admission Controller Webhook (이하 웹훅) 제공

• 웹훅은 클러스터가 변경될 때 무조건 실행되며, 게이트키퍼는 웹훅을 확인하여 OPA 정책 엔진에서 정의한 대로 실행

 

(2) 주요기능

Validating Admission Control

  - 웹훅을 트릭거로 OPA와 api-server 다리 역할을 하여 정책 적용

Policies and Constraints

  - Rego 언어로 작성되며 정의한 요구하상을 위반하는 리소스들을 확인

Audit

  - 배포된 자원을 정기적으로 감사하여 Constraints에 반하는 것이 있는지 확인

Data Replication

  - 리소스를 복제 한 후 감사가 진행되며, 복제할있도록 권한 부여 필요

 

 

 

4. 게이트리퍼 라이브러리

- K8S에서 일반적으로 사용하는 정책에 대한 샘플 제공

* https://github.com/open-policy-agent/gatekeeper-library

탬플릿 설명
allowedrepos 허용된 이미지 Repository만 사용하도록 설정
block-endpoint-edit-default-role endpoint 편집 불가능하도록 설정(CVE-2021-25740)
block-nodeport-services NodePort 서비스 불가능하도록 설정
containerlimit 컨테이너의 리소스 제한 (CPU, Memory)
containerresourceratios 컨테이너 리소스 사용률 제한
disallowdtags 사용할 수 없는 image 태그 지정
externalip 허용 리스트에 포함되지 않은 external IP 제한
httpsonly 인그레스가 https만 사용하도록 설정
imagedigests 컨테이너 이미지에 digest를 확인 (이미지에 대한 유니크확인)
replicalimits deployment에서 pod에 대한 min/max 값 제한
requiredannotations 모든 리소스에 대해 지정된 정규표현식에 맞는 Annotation을 포함하도록
requiredlabels 모든 리소스에 대해 지정된 정규표현식에 맞는 Label을 포함하도록
requiredprobes 파드에 readiness probe, lineness probe가 있어야
uniqueingresshost 모든 인그레스의 host가 유니크해야
uniqueserviceselector 네임스페이스 내의 serviceselector 가 유니크해야

 

 

PSP에 해당하는 기능을 게이트키퍼 탬플릿으로도 제공 함

Control Aspect Field Names in PSP Gatekeeper Constraint and Constraint Template
Running of privileged containers privileged privileged-containers
Usage of host namespaces hostPID, hostIPC host-namespaces
Usage of host networking and ports hostNetwork, hostPorts host-network-ports
Usage of volume types volumes volumes
Usage of the host filesystem allowedHostPaths host-filesystem
White list of Flexvolume drivers allowedFlexVolumes flexvolume-drivers
Requiring the use of a read only root file system readOnlyRootFilesystem read-only-root-filesystem
The user and group IDs of the container runAsUser, runAsGroup, supplementalGroups, fsgroup users*
Restricting escalation to root privileges allowPrivilegeEscalation, defaultAllowPrivilegeEscalation allow-privilege-escalation
Linux capabilities defaultAddCapabilities, requiredDropCapabilities, allowedCapabilities capabilities
The SELinux context of the container seLinux seLinux
The Allowed Proc Mount types for the container allowedProcMountTypes proc-mount
The AppArmor profile used by containers annotations apparmor
The seccomp profile used by containers annotations seccomp
The sysctl profile used by containers forbiddenSysctls,allowedUnsafeSysctls forbidden-sysctls

 

 

 

 

 

5. 게이트키퍼 라이브러리 샘플

(1) 구조

 - OPA 정책에 대한 탬플릿 파일과 제약사항 정의파일 및 예제파일로 구성

 

 

(2) 테스트

 - template.yml 적용

 - constraint.yaml에 본인 repository만 허용하도록 적용

 - 허용되지 않은 repository image를 사용해서 pod 생성

 

 

'Kubernetes' 카테고리의 다른 글

[kubespray] 배포 방화벽  (0) 2021.11.01
kubespray secret 생성, Job Deploy  (0) 2021.10.22
[custom-columns] event 정렬  (0) 2021.09.10
VM 재기동시 kube-apiserver 기동 불가현상 - Kernel  (0) 2021.07.28
ETCD 백업 & 복구  (0) 2021.07.20

1.문제

- 클러스터에 문제가 생길 경우 [kubectl get event] 명령어로 클러스터의 문제를 확인해야함

- 문제를 결과 값이 시간순서대로 출력되지 않기때문에  문제를 한 눈에 파악하기가 어려움

 

 

 

 

2. 해결

 - kubectl get event -o yaml 명령어로 출력값들이 yaml 형식인 것을 확인 할 수 있음

 - custom-columns 라는 기능을 제공하기 때문에 시간 등 필요한 값들만 뽑은 후 시간으로 sort 하면 해결

 

3. 예제

# kubectl get event -o custom-columns=TIME:lastTimestamp,NAME:metadata.name,TYPE:type,MESSAGE:message | sort

 

[root@test-master001 ~]# kubectl get event -o custom-columns=TIME:lastTimestamp,NAME:metadata.name,TYPE:type,MESSAGE:message | sort
2021-09-10T00:16:28Z   data-imprecise-hog-mariadb-master-0.169fbf87aff6c169   Normal    no persistent volumes available for this claim and no storage class is set
2021-09-10T00:16:28Z   data-imprecise-hog-mariadb-slave-0.169fbf87b068e1b7    Normal    no persistent volumes available for this claim and no storage class is set
<nil>                  imprecise-hog-mariadb-master-0.169fbf8808c5fdd8        Warning   0/5 nodes are available: 5 pod has unbound immediate PersistentVolumeClaims.
<nil>                  imprecise-hog-mariadb-slave-0.169fbf8808caeec0         Warning   0/5 nodes are available: 5 pod has unbound immediate PersistentVolumeClaims.

현상 - VM에 설치되어 있는 K8S가 VM 재기동시 kube-apiserver가 정상적으로 기동되지 않음

 

 

1. kubespray에 보면 설치전에 환경 설정을 하는 yml 파일이 있음

 - /kubespray/role/kubernetes/preinstall/tasks/0080-system-configurations.yml

 -  selinux 설정, network 설정 등과 함께 OS에 대한 설정 값 변경 내용이 있음

 

...
- name: Ensure kube-bench parameters are set
  sysctl:
    sysctl_file: /etc/sysctl.d/bridge-nf-call.conf
    name: "{{ item.name }}"
    value: "{{ item.value }}"
    state: present
    reload: yes
  with_items:
    - { name: vm.overcommit_memory, value: 1 }
    - { name: kernel.panic, value: 10 }
    - { name: kernel.panic_on_oops, value: 1 }
  when: kubelet_protect_kernel_defaults|bool
...

 

2. K8S Mstart Node의 /var/log/messages 로그에 다음과 같은 Fatal 에러 발생

~~ kubelet.go~ Failed to start ~ invalid kernal flag: vm/overcommit_memory, expected value: 1, actual value : 0, invailed kernel flag: kernel/panic, expected value: 10, actual value: 0]

 

 

3. /etc/sysct.conf 파일에 보면 kubespray로 배포 할 때와 옵션 같이 다른 것을 확인

 - VM이 재기동 하면 sysctl.conf를 다시 읽기 때문에 옵션값이 변경 됨.

 - k8s 배포할 때 /etc/sysctl.d/bridge-nf-call.conf 파일에 해당 옵션값을 저장하고 적용

 

4. 모든 노드의 옵션 변경

ansible -m shell -a "sysctl -p /etc/sysctl.d/bridge-nf-call.conf" -i inventory/k8s/inventory.ini all 

 

 

 

 

'Kubernetes' 카테고리의 다른 글

[Gatekeeper] K8S 클러스터 정책 제어  (0) 2021.09.10
[custom-columns] event 정렬  (0) 2021.09.10
ETCD 백업 & 복구  (0) 2021.07.20
[bash 자동완성] bash-completion  (0) 2021.07.15
[Service Account #1] 외부 클러스터 컨트롤  (0) 2021.06.30

 

목표 : test-master001 노드의 ETCD 를 Backup&Restore 한다.

 

버전 : kubernetes 1.21.1

 

관련 경로 

- /etc/kubernetes/manifest : K8S의 static pod의 yml 파일 위치

 - /etc/ssl/etcd : etcd의 인증 파일 위치

 - /var/lib/etcd : etcd 컨테이너와 노드의 마운트 경로

 

 

1. etcd backup

명령어

$ etcdctl --cacert="" --cert="" --key="" snapshot save 파일명

ex 1) 노드에서 백업 명령어 실행

$ etcdctl --cacert=/etc/ssl/etcd/ssl/ca.pem --cert=/etc/ssl/etcd/ssl/node-master001.pem --key=/etc/ssl/etcd/ssl/node-master001-key.pem snapshot save master001-etcd-backup

ex 2) docker 명령어로 etcd 컨테이너에서 명령어 전달

- /var/lib/etcd 가 마운트되어있기때문에 해당 경로에 백업하고 이동&관리

 - 컨테이너에서 환경변수가 설정되어있기때문에 간편

$ docker exec -it -u root etcd3 etcdctl snapshot save /var/lib/etcd/master001-etcd-backup

$ cp /var/lib/etcd/master001-etcd-backup /var/lib/etcd_backup/

 

 

2. etcd restore

명령어

$ etcdctl --cacert="" /
--cert="" /
--key="" /
--data-dir="" /
--initial-advertise-peer-urls="" /
--initial-cluster="" /
--name="" /
snapshot /var/lib/etcd_backup/



$ etcdctl --cacert=/etc/ssl/etcd/ssl/ca.pem --cert=/etc/ssl/etcd/ssl/node-master001.pem --key=/etc/ssl/etcd/ssl/node-master001-key.pem --endpoints=127.0.0.1:2380 --data-dir=/var/lib/etcd/etcd.restore snapshot restore /var/lib/etcd_backup/snapshotdb.210720

 

 

*예전 버전에서는 /etc/kubernetes/manifest/etcd.yml에서 ETCD 경로가 etcd_backup으로 변경될 경우 컨테이너에서 경로 옵션 수정

 

+ Recent posts