kOps with Cilium
Cilium을 기반으로 하는 kOps 클러스터를 생성하고 네트워크 구성이 어떻게 되는지 확인해보고자 한다. Cilium는 Linux 커널 내에 강력한 보안 가시성 및 제어 로직을 동적으로 삽입할 수 있는 BPF라는 Linux 커널 기술을 사용하는 CNI이다.
https://cilium.io/ https://kops.sigs.k8s.io/networking/cilium/
kOps with Cloud9
글을 작성하는 날짜 기준(23년 3월 18일), 버전은 1.25.11 으로 진행을 한다. 지난번 구성과 동일하게 Bastion은 Cloud9에서 구성을 진행하였다. 지난번 작성한 Cloud9 기반 인스턴스는 아래 링크에서 확인할 수 있다.
https://github.com/jinwoongk/aws-cloud9-bootstrapping-example/blob/main/example_instancestack.yaml
Cilium CNI 기반 kOps 배포
Cloud9이 구성되고 나면 해당 환경에서 기본 구성할 Cluster yaml을 작성한다. yaml의 크기 때문에 부분을 나눠서 설명한다.
apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
creationTimestamp: null
name: prosv.kr
spec:
kubeProxy:
enabled: false
metricsBindAddress: 0.0.0.0
networking:
cilium:
enableNodePort: true
ipam: eni
hubble:
enabled: true
...
kOps를 구성할 때는 Cluster CRD를 작성하는것이 기본인데 클러스터 이름은 현재 사용중인 테스트 도메인을 입력한다.
그리고 Cilium 을 기본 CNI으로 구성할 예정이기 때문에 Kube-Proxy는 기본적으로 비활성화 한다. Cilium이 AWS에서 할당된 managed IP 주소를 프로비저닝하고 AWS VPC와 마찬가지로 각 파드에 직접 연결하도록 networking.cilium.ipam=eni 설정을 추가하고, hubble을 활성화하기 위한 networking.cilium.hubble.enabled: true 설정도 추가한다.
https://docs.cilium.io/en/stable/network/concepts/ipam/eni/
cilium 설정에서의 다양한 옵션은 다음을 참조할 수 있다.
https://kops.sigs.k8s.io/networking/cilium/
...
api:
dns: {}
authorization:
rbac: {}
channel: stable
cloudProvider: aws
certManager:
enabled: true
awsLoadBalancerController:
enabled: true
externalDns:
provider: external-dns
metricsServer:
enabled: true
kubeDNS:
provider: CoreDNS
nodeLocalDNS:
enabled: true
memoryRequest: 5Mi
cpuRequest: 25m
configBase: s3://jinwoong-k8s-s3/prosv.kr
...
위에서 추가한 설정은 다음과 같다.
- certManager 활성화
- awsLoadBalancerController 활성화 및 externalDns 구성
- metricsServer 활성화
- kubeDNS 구성
- 기본 config 저장소 s3 지정
...
etcdClusters:
- cpuRequest: 200m
etcdMembers:
- encryptedVolume: true
instanceGroup: control-plane-ap-northeast-2a
name: a
memoryRequest: 100Mi
name: main
- cpuRequest: 100m
etcdMembers:
- encryptedVolume: true
instanceGroup: control-plane-ap-northeast-2a
name: a
memoryRequest: 100Mi
name: events
iam:
allowContainerRegistry: true
legacy: false
kubelet:
anonymousAuth: false
maxPods: 100
...
위에서 추가한 설정은 다음과 같다.
- etcd 클러스터 구성
- instancGroup CRD에서 원하는 머신타입, 기본 노드 이미지, 노드 개수 등을 구성할 수 있다.
- ECR 접근을 위한 IAM 구성
- kubelet 구성
...
kubernetesApiAccess:
- 0.0.0.0/0
- ::/0
kubernetesVersion: 1.24.11
masterPublicName: api.prosv.kr
networkCIDR: 172.30.0.0/16
nonMasqueradeCIDR: 100.64.0.0/10
sshAccess:
- 0.0.0.0/0
- ::/0
subnets:
- cidr: 172.30.32.0/19
name: ap-northeast-2a
type: Public
zone: ap-northeast-2a
- cidr: 172.30.64.0/19
name: ap-northeast-2c
type: Public
zone: ap-northeast-2c
topology:
dns:
type: Public
masters: public
nodes: public
...
위에서 추가한 설정은 다음과 같다.
InstanceGroup 과 SSHCredential 를 작성한다.
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
creationTimestamp: null
labels:
kops.k8s.io/cluster: prosv.kr
name: control-plane-ap-northeast-2a
spec:
image: 099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20230302
instanceMetadata:
httpPutResponseHopLimit: 3
httpTokens: required
machineType: t3.medium
maxSize: 1
minSize: 1
role: Master
subnets:
- ap-northeast-2a
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
creationTimestamp: null
labels:
kops.k8s.io/cluster: prosv.kr
name: nodes-ap-northeast-2a
spec:
image: 099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20230302
instanceMetadata:
httpPutResponseHopLimit: 1
httpTokens: required
machineType: t3.medium
maxSize: 1
minSize: 1
role: Node
subnets:
- ap-northeast-2a
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
creationTimestamp: null
labels:
kops.k8s.io/cluster: prosv.kr
name: nodes-ap-northeast-2c
spec:
image: 099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20230302
instanceMetadata:
httpPutResponseHopLimit: 1
httpTokens: required
machineType: t3.medium
maxSize: 1
minSize: 1
role: Node
subnets:
- ap-northeast-2c
apiVersion: kops.k8s.io/v1alpha2
kind: SSHCredential
metadata:
creationTimestamp: null
labels:
kops.k8s.io/cluster: prosv.kr
name: admin
spec:
publicKey: ssh-rsa AAAA.....
root@ip-172-31-50-160
작성한 모든 파일을 하나의 파일로 저장한 후 다음과 같이 kops CLI로 배포를 진행한다. 전체 파일은 다음 링크 예시를 참조한다.
https://raw.githubusercontent.com/ddiiwoong/kops-config/main/kops.yaml
kops create -f kops.yaml
kops update cluster --name prosv.kr --ssh-public-key ~/.ssh/id_rsa.pub --yes