Skip to content

7. コントロールプレーンの構築

下記をインストールし、コントロールプレーンを起動します。

事前準備

systemdユニットファイルを作成します。

cat << EOF > 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 \
  --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://server.kubernetes.local:6443 \
  --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 > 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=10.200.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=10.32.0.0/24 \
  --use-service-account-credentials=true \
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
cat << EOF > 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

設定ファイルを作成します。

mkdir configs
cat << EOF > configs/kube-scheduler.yaml
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
  kubeconfig: "/var/lib/kubernetes/kube-scheduler.kubeconfig"
leaderElection:
  leaderElect: true
EOF
cat << EOF > 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

バイナリファイルおよびsystemdユニットファイルをkube-c01にコピーします。

scp \
  downloads/controller/kube-apiserver \
  downloads/controller/kube-controller-manager \
  downloads/controller/kube-scheduler \
  downloads/client/kubectl \
  units/kube-apiserver.service \
  units/kube-controller-manager.service \
  units/kube-scheduler.service \
  configs/kube-scheduler.yaml \
  configs/kube-apiserver-to-kubelet.yaml \
  nob@kube-c01:~/

コントロールプレーンの設定

バイナリのインストール

ssh nob@kube-c01 "sudo mv kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/local/bin/"

kube-apiserverの設定

証明書を配置します。

ssh nob@kube-c01 "sudo mkdir -p /var/lib/kubernetes"
ssh nob@kube-c01 "sudo 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/"

systemdユニットファイルを作成します。

ssh nob@kube-c01 "sudo mv kube-apiserver.service /etc/systemd/system/"

kube-controller-managerの設定

kubeconfigを配置します。

ssh nob@kube-c01 "sudo mv kube-controller-manager.kubeconfig /var/lib/kubernetes/"

systemdユニットファイルを作成します。

ssh nob@kube-c01 "sudo mv kube-controller-manager.service /etc/systemd/system/"

kube-schedulerの設定

kubeconfigを配置します。

ssh nob@kube-c01 "sudo mv kube-scheduler.kubeconfig /var/lib/kubernetes/"

設定ファイルを配置します。

ssh nob@kube-c01 "sudo mkdir -p /etc/kubernetes/config"
ssh nob@kube-c01 "sudo mv kube-scheduler.yaml /etc/kubernetes/config/"

systemdユニットファイルを作成します。

ssh nob@kube-c01 "sudo mv kube-scheduler.service /etc/systemd/system/"

コントロールプレーンの起動

各種サービスを起動します。それぞれのサービスが起動しているかを確認するにはsudo systemctl status xxxコマンドを実行してください。ログを表示する場合はjournalctl -u xxxコマンドを実行してください。

ssh nob@kube-c01 "sudo systemctl daemon-reload"
ssh nob@kube-c01 "sudo systemctl enable kube-apiserver kube-controller-manager kube-scheduler"
ssh nob@kube-c01 "sudo systemctl start kube-apiserver kube-controller-manager kube-scheduler"

コントロールプレーンが正常に起動していることを確認します。

ssh nob@kube-c01 kubectl cluster-info --kubeconfig admin.kubeconfig
$ ssh nob@kube-c01 kubectl cluster-info --kubeconfig admin.kubeconfig
Kubernetes control plane is running at https://127.0.0.1:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

kubelet認証のためのRBACの設定

Kubernetes APIサーバが各ワーカーノード上のKubelet APIにアクセスできるようにRBAC権限を設定します。

ssh nob@kube-c01 "kubectl apply -f kube-apiserver-to-kubelet.yaml --kubeconfig admin.kubeconfig"

動作確認

コントロールプレーンが正常に起動、動作していることを確認します。

curl --cacert ca.crt https://kube-c01.kubernetes.local:6443/version
$ curl --cacert ca.crt https://kube-c01.kubernetes.local:6443/version
{
  "major": "1",
  "minor": "32",
  "gitVersion": "v1.32.3",
  "gitCommit": "32cc146f75aad04beaaa245a7157eb35063a9f99",
  "gitTreeState": "clean",
  "buildDate": "2025-03-11T19:52:21Z",
  "goVersion": "go1.23.6",
  "compiler": "gc",
  "platform": "linux/amd64"
}

次: ワーカーノードの構築