kube-apiserver
K8S Deep Dive
Kick D2
# -*- mode: ruby -*-
# vi: set ft=ruby :
BOX_IMAGE = "bento/ubuntu-18.04"
DOCKER_VERSION = "5:19.03.15~3-0~ubuntu-bionic"
K8S_GIT_TAG = "v1.19.16"
GO_VERSION = "1.17.6"
HOSTNAME = "kube-node"
Vagrant.configure("2") do |config|
config.vm.provision :shell, privileged: true, env: {"DOCKER_VERSION"=>DOCKER_VERSION, "GO_VERSION"=>GO_VERSION}, inline: $install_common_tools
config.vm.provision :shell, privileged: false, env: {"K8S_GIT_TAG"=>K8S_GIT_TAG}, inline: $git_clone
config.vm.define HOSTNAME do |subconfig|
subconfig.vm.box = BOX_IMAGE
subconfig.vm.hostname = HOSTNAME
subconfig.vm.network :private_network, ip: "192.168.100.2"
config.vm.provider "virtualbox" do |v|
v.memory = 8192
v.cpus = 8
end
end
end
# privileged: true (root)
$install_common_tools = <<-SCRIPT
## disable swap
swapoff -a
sed -i '/swap/d' /etc/fstab
## apt-get noninteractive
export DEBIAN_FRONTEND=noninteractive
## -qq : really quiet (except errors)
apt-get -qq update
## pre-requisite - gcc make
apt-get -qq install gcc make tree jq
## install Docker
apt-get -qq install apt-transport-https ca-certificates curl gnupg-agent software-properties-common &&
curl --stderr /dev/null -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - &&
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" &&
apt-get -qq update &&
apt-get -qq install docker-ce=${DOCKER_VERSION} docker-ce-cli=${DOCKER_VERSION} containerd.io
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
systemctl restart docker
usermod -aG docker vagrant
## install Golang
curl --stderr /dev/null -O https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz
tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' | tee -a /etc/profile
SCRIPT
# privileged: false (vagrant)
$git_clone = <<-SCRIPT
git clone https://github.com/kubernetes/kubernetes.git --branch ${K8S_GIT_TAG} --single-branch
## build
cd kubernetes
sudo make clean
sudo make all WHAT=cmd/kube-apiserver GOFLAGS=-v GOGCFLAGS="all=-N -l" GOLDFLAGS=""
sudo cp _output/bin/kube-apiserver /usr/local/bin/
sudo make all WHAT=cmd/kubectl GOFLAGS=-v
sudo cp _output/bin/kubectl /usr/local/bin/
cd $HOME
## install Delve
go install github.com/go-delve/delve/cmd/dlv@latest
sudo cp $HOME/go/bin/dlv /usr/local/bin
## run etcd
sudo docker container run --name etcd --rm --volume=$HOME/etcd-data:/default.etcd --detach --net=host quay.io/coreos/etcd
## run kube-apiserver
sudo nohup dlv \
--headless \
--continue \
--accept-multiclient \
--listen=:56268 \
--api-version=2 \
exec /usr/local/bin/kube-apiserver \
-- \
--etcd-servers=http://127.0.0.1:2379 \
> ./apiserver.log 2>&1 &
SCRIPT
실습준비�(m1 환경은 아래 노트참고)
실습준비
U
kube-apiserver
U
U
클라우드?
클라우드?
어떤 API 들이 있나요
curl http://localhost:8080/
# .. or ..
# kubectl get --raw /
{
"paths": [
"/api",
"/api/v1",
"/apis",
...
"/ui",
"/ui/",
"/version"
]
}
U
어떤 API 들이 있나요 얘들이 필요로하는 API 들이 있어요
U
PATCH /api/v1/namespaces/default/pods/nginx
GET /api/v1/pods
GET /api/v1/nodes
GET /api/v1/namespaces/default/pods/nginx
DELETE /api/v1/namespaces/default/pods/busybox
POST /apis/apps/v1/namespaces/default/deployments
어떤 API 들이 있나요
OpenAPI 스펙
curl -k http://localhost:8080/openapi/v2 > kube-apiserver-openapi-spec.json
OpenAPI 스펙
API ~ GVR
그룹 버전 리소스
/apis/batch/v1/namespaces/$NAMESPACES/pods
API 그룹/버전
kubectl api-versions
Print the supported API versions on the server, in the form of "group/version"
API 리소스
kubectl api-resources
API ~ 확장
kube-apiserver 구조
Aggregated Server
핸들러 체인
서버체인
KubeAPIServer
APIExtensionsServer
Aggregated Server
Aggregated Server
핸들러 체인
TLS handshake
Panic Recovery
Authentication
Authorization
Timeout
…
Impersonation
서버 체인
Aggregated server
실습
sudo nohup dlv --headless --listen=:56268 --api-version=2 exec /usr/local/bin/kube-apiserver -- --etcd-servers=http://127.0.0.1:2379
기동
cmd/kube-apiserver/apiserver.go
CreateServerChain
cmd/kube-apiserver/app/server.go
CreateServerChain
cmd/kube-apiserver/app/server.go
HandlerChain
src/k8s.io/apiserver/pkg/server/config.go
Run
k8s.io/apiserver/pkg/server/genericapiserver.go
Run
k8s.io/apiserver/pkg/server/genericapiserver.go
Run
k8s.io/apiserver/pkg/server/secure_serving.go
분석 토픽
END