이번 랩에서는 Kubernetes control plane을 부트스트랩을 진행합니다. 이 과정엔 controlplane-1
에 Kubernetes API Server, Scheduler 그리고 Controller manager를 설치합니다.
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
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
이번 섹션에서는 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"
}