08-bootstrapping-kubernetes-controllers

Dante·2024년 6월 2일
0

kubernetes-hard-way

목록 보기
9/13

Bootstrapping the Kubernetes Control Plane


이번 랩에서는 Kubernetes control plane을 부트스트랩을 진행합니다. 이 과정엔 controlplane-1 에 Kubernetes API Server, Scheduler 그리고 Controller manager를 설치합니다.

Prerequisites


Kubernetes 관련 실행파일들과 systemd unit 파일을 controlplane-1 로 복사합니다.

kube-apiserver

kube-apiserver.service 파일을 설정할 때 service-cluster-ip 옵션의 값은 04-certificate-authority 페이지에서 ca.conf 에 설정한 [kube-api-server_alt_names] 항목의 Service IP 범위로 수정해야 합니다.

cat <<EOF > /k8s-hardway/units/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-apiserver \\
  --allow-privileged=true \\
  --apiserver-count=1 \\
  --audit-log-maxage=30 \\
  --audit-log-maxbackup=3 \\
  --audit-log-maxsize=100 \\
  --audit-log-path=/var/log/audit.log \\
  --authorization-mode=Node,RBAC \\
  --bind-address=0.0.0.0 \\
  --client-ca-file=/var/lib/kubernetes/ca.crt \\
  --enable-admission-plugins=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\
  --etcd-servers=http://127.0.0.1:2379 \\
  --event-ttl=1h \\
  --encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \\
  --kubelet-certificate-authority=/var/lib/kubernetes/ca.crt \\
  --kubelet-client-certificate=/var/lib/kubernetes/kube-api-server.crt \\
  --kubelet-client-key=/var/lib/kubernetes/kube-api-server.key \\
  --runtime-config='api/all=true' \\
  --service-account-key-file=/var/lib/kubernetes/service-accounts.crt \\
  --service-account-signing-key-file=/var/lib/kubernetes/service-accounts.key \\
  --service-account-issuer=https://controlplane-1.kubernetes.local:6443 \\
  --service-cluster-ip-range=172.16.0.0/24 \\
  --service-node-port-range=30000-32767 \\
  --tls-cert-file=/var/lib/kubernetes/kube-api-server.crt \\
  --tls-private-key-file=/var/lib/kubernetes/kube-api-server.key \\
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
cat <<EOF > /k8s-hardway/configs/kube-apiserver-to-kubelet.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: system:kube-apiserver-to-kubelet
rules:
  - apiGroups:
      - ""
    resources:
      - nodes/proxy
      - nodes/stats
      - nodes/log
      - nodes/spec
      - nodes/metrics
    verbs:
      - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:kube-apiserver
  namespace: ""
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kube-apiserver-to-kubelet
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: kubernetes
EOF

kube-scheduler

cat <<EOF > /k8s-hardway/units/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-scheduler \\
  --config=/etc/kubernetes/config/kube-scheduler.yaml \\
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
cat <<EOF > /k8s-hardway/configs/kube-scheduler.yaml
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
  kubeconfig: "/var/lib/kubernetes/kube-scheduler.kubeconfig"
leaderElection:
  leaderElect: true
EOF

kube-controller-manager

kube-controller-manager.service 파일을 설정할 때 cluster-cidr 옵션은 03-compute-resources 페이지에서 설정한 POD_SUBNET 의 전체 IP 범위로 수정하고, service-cluster-ip 옵션은 kube-apiserver.service 파일에 지정한 service-cluster-ip 값이랑 동일하게 수정해야 합니다.

cat <<EOF > /k8s-hardway/units/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-controller-manager \\
  --bind-address=0.0.0.0 \\
  --cluster-cidr=192.168.0.0/16 \\
  --cluster-name=kubernetes \\
  --cluster-signing-cert-file=/var/lib/kubernetes/ca.crt \\
  --cluster-signing-key-file=/var/lib/kubernetes/ca.key \\
  --kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\
  --root-ca-file=/var/lib/kubernetes/ca.crt \\
  --service-account-private-key-file=/var/lib/kubernetes/service-accounts.key \\
  --service-cluster-ip-range=172.16.0.0/24 \\
  --use-service-account-credentials=true \\
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

위 작업이 완료됐으면, controlplane-1 서버로 파일을 복사합니다.

scp \
  /k8s-hardway/downloads/kube-apiserver \
  /k8s-hardway/downloads/kube-controller-manager \
  /k8s-hardway/downloads/kube-scheduler \
  /k8s-hardway/downloads/kubectl \
  /k8s-hardway/units/kube-apiserver.service \
  /k8s-hardway/units/kube-controller-manager.service \
  /k8s-hardway/units/kube-scheduler.service \
  /k8s-hardway/configs/kube-scheduler.yaml \
  /k8s-hardway/configs/kube-apiserver-to-kubelet.yaml \
  root@controlplane-1:~/

이 후 다음 실습은 무조건 controlplane-1 으로 접근하여 세팅해야 합니다.

ssh root@controlplane-1

Provision the Kubernetes Control Plane


Kubernetes 설정 관련 디렉터리를 생성합니다.

mkdir -p /etc/kubernetes/config

Install the Kubernetes Controller Binaries

Kubernetes 관련 실행파일들을 옮깁니다.

{
  chmod +x kube-apiserver \
    kube-controller-manager \
    kube-scheduler kubectl
    
  mv kube-apiserver \
    kube-controller-manager \
    kube-scheduler kubectl \
    /usr/local/bin/
}

Configure the Kubernetes API Server

{
  mkdir -p /var/lib/kubernetes/

  mv ca.crt ca.key \
    kube-api-server.key kube-api-server.crt \
    service-accounts.key service-accounts.crt \
    encryption-config.yaml \
    /var/lib/kubernetes/
}

kube-apiserver.service systemd unit 파일을 옮깁니다.

mv kube-apiserver.service \
  /etc/systemd/system/kube-apiserver.service

Configure the Kubernetes Controller Manager

kube-controller-manager kubeconfig 파일을 옮깁니다.

mv kube-controller-manager.kubeconfig /var/lib/kubernetes/

kube-controller-manager.service systemd unit 파일을 옮깁니다.

Configure the Kubernetes Scheduler

kube-scheduler kubeconfig 파일을 옮깁니다.

mv kube-scheduler.kubeconfig /var/lib/kubernetes/

kube-scheduler.yaml 설정 파일도 옮깁니다.

mv kube-scheduler.yaml /etc/kubernetes/config/

kube-scheduler.service systemd unit을 옮깁니다.

mv kube-scheduler.service /etc/systemd/system/

Start the Controller Services

{
  systemctl daemon-reload
  
  systemctl enable kube-apiserver \
    kube-controller-manager kube-scheduler
    
  systemctl start kube-apiserver \
    kube-controller-manager kube-scheduler
}

Kubernetes API Server가 완전히 초기화 하는데 최대 10초 정도 소요 됩니다.

Verification

kubectl cluster-info \
  --kubeconfig admin.kubeconfig
Kubernetes control plane is running at https://127.0.0.1:6443

RBAC for Kubelet Authorization


이번 섹션에서는 Kubernetes API Server가 각 worker node의 Kubelet API 로 접근할 수 있도록 RBAC 권한을 설정합니다.

Pod에서 metric, logs를 검색하고 명령을 실행하려면, Kubelet API에 접근이 필요합니다.

이번 튜토리얼에서는 kubelet --authorization-mode 옵션을 webhook 으로 설정합니다. Webhook 모드는 SubjectAcessReview API를 사용하여 승인을 결정합니다.

이 섹션의 실행 명령은 전체 클러스터에 영향을 미치며, controller node에서만 실행해야합니다.

Kubelet API에 접근하고 Pod 관리와 관련된 일반적인 작업을 수행할 수 있는 system:kube-apiserver-to-kubelet ClusterRole을 생성합니다.

kubectl apply -f kube-apiserver-to-kubelet.yaml \
  --kubeconfig admin.kubeconfig

Verification

지금은 Kubernetes Control plane이 실행중입니다. jumpbox 서버에서 다음 명령을 실행해 잘 동작하는지 확인해봅니다.

curl을 이용해 Kubernetes 버전 정보를 HTTP GET 요청을 수행합니다.

curl -k --cacert ca.crt https://controlplane-1.kubernetes.local:6443/version
{
  "major": "1",
  "minor": "30",
  "gitVersion": "v1.30.1",
  "gitCommit": "6911225c3f747e1cd9d109c305436d08b668f086",
  "gitTreeState": "clean",
  "buildDate": "2024-05-14T10:42:02Z",
  "goVersion": "go1.22.2",
  "compiler": "gc",
  "platform": "linux/amd64"
}

Next: Bootstrapping the Kubernetes Worker Nodes

profile
it's me.

0개의 댓글

관련 채용 정보